Selenium--WebDriverWait--你知道显示等待?(结合源码让你更加得心应手)

简介: Selenium--WebDriverWait--你知道显示等待?(结合源码让你更加得心应手)

前言

这里是清安,上一章我们讲了Expected_conditions的部分用法,本章文们来说说剩下的用法。

本章我们换种方式,从源码入手。代码大体还是与上一章类似,所以本章只贴方法出来了,各位自己写的时候记得写入类中。「后续会将源码全部贴出」

text_to_be_present_in_element

检查给定文本是否存在于指定的元素。「先看源码」

def __init__(self, locator, text_):
        self.locator = locator
        self.text = text_
    def __call__(self, driver):
        try:
            element_text = _find_element(driver, self.locator).text
            return self.text in element_text
        except StaleElementReferenceException:
            return False

以最简单最快的方式来看,__call__这个魔术方法里面有这么一个_find_element方法,那么他实际源码是这样的:

def _find_element(driver, by):
    try:
        return driver.find_element(*by)
    except NoSuchElementException as e:
        raise e
    except WebDriverException as e:
        raise e

什么意思呢返回这个定位元素方法,如果没有测抛出异常,具体何异常就是代码中的raise e了。好了,简单的了解这个后,回到上述的代码中_find_element(driver, self.locator).text,这里传入的是定位元素。「实际顺序是__call__里面调用了_find_element函数,并传入了所需要的值,最后通过.text获取到文本值」最后做一个判断,判断传入的text_文本值是否在元素获取到的文本值中。所以我们来看看类中的方法如何写的

def text_element(self,text,*ele):
        self.wait.until(EC.text_to_be_present_in_element(ele, text),message='请检查定位的文本值')
if __name__ == '__main__':
    b = Brouser()
    b.text_element('新用户',By.CLASS_NAME, 'reg_btn')
    b.text_element('注册新用户',By.CLASS_NAME, 'reg_btn')

因为源码是判断传入的字符串是否在获取到的字符里面,所以我们可以全写,也可以不全写。不过这里建议全写。

text_to_be_present_in_element_value

检查给定文本是否存在于元素的。看着是不是跟上述很相似。那么看看源码:

class text_to_be_present_in_element_value(object):
    def __init__(self, locator, text_):
        self.locator = locator
        self.text = text_
    def __call__(self, driver):
        try:
            element_text = _find_element(driver,
                                         self.locator).get_attribute("value")
            if element_text:
                return self.text in element_text
            else:
                return False
        except StaleElementReferenceException:
                return False

同样直接看__call__这个魔术方法里面,调用了_find_element函数,传入定位元素。***注意了,不同的是这里获取的是属性值get_attribute("value")***也就是获取的是value所对应的属性值。

def text_element_value(self,text,*ele):
        self.wait.until(EC.text_to_be_present_in_element_value(ele, text),message='请检查对应的value属性值哦')
if __name__ == '__main__':
    b = Brouser()
    b.text_element_value('登录',By.CLASS_NAME,'input_submit')

frame_to_be_available_and_switch_to_it

这个就不依靠翻译了,简单点理解就是如果检测到了frame框架,就进行切换。看源码

class frame_to_be_available_and_switch_to_it(object):
    def __init__(self, locator):
        self.frame_locator = locator
    def __call__(self, driver):
        try:
            if isinstance(self.frame_locator, tuple):
                driver.switch_to.frame(_find_element(driver,
                                                     self.frame_locator))
            else:
                driver.switch_to.frame(self.frame_locator)
            return True
        except NoSuchFrameException:
            return False

其他都同上面说的两种方式一样,唯一需要说明的就是「isinstance,检查是否属于某类型,这里写的是tuple,检查是否是元组」如果是测进入切换,否则,进入else进行切换。我们这里换一个网址测试一下:

def frame_switch_to(self,*ele):
        self.wait.until(EC.frame_to_be_available_and_switch_to_it(ele),message='请检查元素')
if __name__ == '__main__':
    b = Brouser()
    b.get_url('https://login.tmall.com/')
    b.frame_switch_to(By.ID,'J_loginIframe')
    t = b.fox.find_element(By.CLASS_NAME,'forgot-password-a-link').text
    print(t)

这里用的是天猫的登录界面,frame框架,一般也多用于的登录界面。先切换到frame框架,然后再定位里面的元素,上述代码已经做出示例。「如果还不懂frame,可以翻阅一下系列问WEB中的文章,详细教你如何定位frame」

invisibility_of_element_located

这个就不看源码了,用于判断某个元素不存在DOM上或不可见的。可以理解为用于异常情况的。

通俗的理解就是,如果不存在或者不可见那么就为True,正常情况,要是可见,或者存在那就是异常的。

def invisibility_element(self,*ele):
        self.wait.until(EC.invisibility_of_element_located(ele), message='请检查元素是否正确')
if __name__ == '__main__':
    b = Brouser()
    b.get_url('http://shop.aircheng.com/simple/login')
    b.invisibility_element(By.CLASS_NAME,'ddd')

element_to_be_clickable

检查元素的预期是可见的,并已启用,以便您可以单击它。「先看源码」

class element_to_be_clickable(object):
    def __init__(self, locator):
        self.locator = locator
    def __call__(self, driver):
        element = visibility_of_element_located(self.locator)(driver)
        if element and element.is_enabled():
            return element
        else:
            return False

源码还是老套路,不同的就是调用了之前我们讲过的其中的一个方法visibility_of_element_located,先检查了一次界面元素,其次还「做了一个判断element.is_enabled(),判断元素是否被使用」测试一下看看如何使用

def element_clickable(self,*ele):
        """元素是否可以点击"""
        ele = self.wait.until(EC.element_to_be_clickable(ele),message='请检查元素是否正确')
        ele.click()
if __name__ == '__main__':
    b = Brouser()
    b.get_url('http://shop.aircheng.com/simple/login')
    b.element_clickable(By.NAME, 'remember')

上述代码 意思就是判断元素可以点击后,直接调用click()方法点击一次。

staleness_of

这个方法,也是同上述所说的invisibility_of_element_located类似,如果正常反而会给你抛出异常,如果错误,反而给你返回 True。「判断元素是否从DOM中移除」看看源码

class staleness_of(object):
    def __init__(self, element):
        self.element = element
    def __call__(self, ignored):
        try:
            self.element.is_enabled()
            return False
        except StaleElementReferenceException:
            return True

代码中做了一个.is_enabled()的判断,如果被选中,那么返回False。反之True。「此外,此方法需要传入一个元素对象进去」具体的示例网站没有找到,如果你有可以私信我。这个方法可以用来判断网站是否刷新,亦或者其他作用欢迎私信。但是,如果你不想应为这个方法判断而报错这里推荐使用until_not或者忽略掉这个方法

def staleness_(self,*ele):
        self.wait.until_not(EC.staleness_of(self.fox.find_element(ele)))
if __name__ == '__main__':
    b = Brouser()
    b.get_url('http://shop.aircheng.com/simple/login')
    b.staleness_(By.NAME,'remember')

本章就到这,下一章我们一起看看下拉列表以及alert等方法是使用。

目录
相关文章
|
5天前
|
Java 测试技术 API
《手把手教你》系列技巧篇(六)-java+ selenium自动化测试-阅读selenium源码(详细教程)
【2月更文挑战第15天】《手把手教你》系列技巧篇(六)-java+ selenium自动化测试-阅读selenium源码(详细教程) 前面几篇基础系列文章,足够你迈进了Selenium门槛,再不济你也至少知道如何写你第一个基于Java的Selenium自动化测试脚本。接下来宏哥介绍Selenium技巧篇,主要是介绍一些常用的Selenium方法或者接口(API),通过这些接口(API)或者方法的具体操作,达到能够熟练使用Selenium编写Java的自动化测试脚本,从而为后续的Java+Selenium自动化测试框架设计打基础。
36 0
|
9月前
Selenium--WebDriverWait--你知道显示等待?(内附二次封装源码)
Selenium--WebDriverWait--你知道显示等待?(内附二次封装源码)
29 0
|
9月前
selenium--获取HTML源码断言和URL地址
selenium--获取HTML源码断言和URL地址
|
API 索引
selenium源码通读·13 |webdriver/support分析
selenium源码通读·13 |webdriver/support分析
89 0
selenium源码通读·13 |webdriver/support分析
|
移动开发 JavaScript 前端开发
selenium源码通读·12 |webdriver/remote分析
selenium源码通读·12 |webdriver/remote分析
160 0
selenium源码通读·12 |webdriver/remote分析
|
存储 API
selenium源码通读·11 |webdriver/common/touch_actions.py-TouchActions类分析
selenium源码通读·11 |webdriver/common/touch_actions.py-TouchActions类分析
70 0
selenium源码通读·11 |webdriver/common/touch_actions.py-TouchActions类分析
|
数据采集 Web App开发 Linux
selenium源码通读·10 |webdriver/common/proxy.py-Proxy类分析
selenium源码通读·10 |webdriver/common/proxy.py-Proxy类分析
88 0
selenium源码通读·10 |webdriver/common/proxy.py-Proxy类分析
|
Web App开发 JSON Java
selenium源码通读·9 |webdriver/common/desired_capabilities.py-DesiredCapabilities类分析
selenium源码通读·9 |webdriver/common/desired_capabilities.py-DesiredCapabilities类分析
163 0
selenium源码通读·9 |webdriver/common/desired_capabilities.py-DesiredCapabilities类分析
selenium源码通读·8 |webdriver/common/keys.py-Keys类分析
selenium源码通读·8 |webdriver/common/keys.py-Keys类分析
45 0
selenium源码通读·8 |webdriver/common/keys.py-Keys类分析
selenium源码通读·7 |webdriver/common/by.py-By类分析
selenium源码通读·7 |webdriver/common/by.py-By类分析
72 0
selenium源码通读·7 |webdriver/common/by.py-By类分析