python与selenium_项目篇_三种等待的封装及使用场景

结合项目说下三种等待:

第一、先建立一个概念代码有多快?
用例是登录环境,进入界面,点击上传。这一套在我们眼里看来还不得个5秒左右,但是代码0.05秒就已经跑到了点击上传了。然后代码在等页面加载。
第二,说下龟兔赛跑的故事,
龟是页面加载(页面有的地方有很多js脚本,加载起来很慢的,有的地方很快),兔是代码。预备跑:页面加载刚走了一步,代码已经到终点了。有的地方代码要想执行下一步:必须等页面加载出来才能继续。等太久,代码就抛了个异常。

1、隐性等待(代码等的是:你要点击元素所在的整个页面完全加载)
【项目里,只需要在我们封装的setup方法里写一次即可,作用是全局的】

# coding=utf-8
import unittest
from selenium import webdriver
from Common.function import config_url

#  cls.driver.implicitly_wait(10):代码等整个页面加载完成,一加载出来就过,一加载出来就过。等10秒,还不出来,抛出异常
class UnitBase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()
        cls.driver.get(config_url())
        cls.driver.maximize_window()
        cls.driver.implicitly_wait(10)

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

2、显性等待(代码等的是:你要点击的元素能被点击,title出来没、frame加载没,text出来了没等,)
直接看源码的翻译吧,紧接着就是经验之谈,后续慢慢补充吧

WebDriverWait(self.driver,20,0.5).until(EC.element_to_be_clickable(By.XPATH,'[]'))
# 代码每隔0.5秒查一次页面元素能不能被点击,如果能被点击,则继续,如果假,超过20秒,则抛出TimeoutException。

项目里关于显性等待都是直接封装到基础操作Base类里面,项目代码如下:

# coding=utf-8
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from Common.log import FrameLog
from Common.function import config_url

class Base():
    """这里封装了操作浏览器的基础操作"""

    def __init__(self, driver, log):
        self.driver = driver
        self.log = FrameLog().log()

    # 单星号参数代表此处接受任意多个非关键字参数
    def findele(self, *args):
            return self.driver.find_element(*args)

    # 对元素click
    def click(self, *args):
        return self.findele(*args).click()
    
    # 发送信息
    def sendkey(self, args, value):
        self.findele(*args).send_keys(value)

    # 调用js方法
    def js(self, str):
        self.driver.execute_script(str)
        
    def dddd(self, *args):
        """
        检查元素是否存在于页面和可见。可见性意味着不仅显示元素,但其高度和宽度也大于0。定位器-用于查找元素,
        一旦WebElement定位并可见,返回它
        :param args:
        :return:
        """
        return WebDriverWait(self.driver, 20, 0.5).until(EC.visibility_of_element_located())

    def aaaaaaaa(self,*args):
        """
        检查是否有弹窗出现
        如果点击某个操作有弹框,用这个更快。
        :param args:
        :return:
        """
        return WebDriverWait(self.driver, 20, 0.5).until(EC.alert_is_present())

    # 调用不要输入元组。*args已经打包了
    def dominance_clickable(self, *args):
        """
        检查元素的期望是可见的并已启用,以便您可以单击它
        点击元素之前带上这个,会更快。
        :param args:
        :return:
        """
        return WebDriverWait(self.driver, 20, 0.5).until(EC.element_to_be_clickable(args))

    def aaa1(self,*args):
        """
        检查标题是否包含区分大小写的子字符串。title是期望的title片段,当标题匹配时返回True,否则返回False
        切换浏览器界面的title时候带上这个,会更快。
        :return:
        """
        return WebDriverWait(self.driver, 20, 0.5).until(EC.title_contains(args))

    def aaaa2(self, *args):
        """
        期望检查给定帧是否可用于,切换到。 如果框架可用,则将给定的驱动程序切换到指定的帧。
        切换框架时候,用它更快。
        :param args:
        :return:
        """
        return WebDriverWait(self.driver, 20, 0.5).until(EC.frame_to_be_available_and_switch_to_it(args))

    def aaaaa2(self,*args):
        """
        期望检查给定文本是否存在于指定的元素。
        如果你定位text的文本并点击它,使用它更快
        :param args:
        :return:
        """
        return WebDriverWait(self.driver, 20, 0.5).until(EC.text_to_be_present_in_element)

    def aaa(self, *args):
        """
        检查DOM上是否存在元素的期望值。一页的长度。这并不一定意味着元素是可见的。
        这个研究中
        :return:
        """
        return WebDriverWait(self.driver,20,0.5).until(EC.presence_of_element_located(args))

    def bbb(self, *args):
        """
        选择检查选择的期望。元素是WebElement对象
        不是很明白
        :param args:
        :return:
        """
        return WebDriverWait(self.driver, 20, 0.5).until(EC.element_to_be_selected(args))

3、强制等待

没啥说的,导入time模块,在你实在没法用显性等待解决,再用time.sleep(10),让它在这块强制等个10秒。

猜你喜欢

转载自blog.csdn.net/weixin_45451320/article/details/113005479