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等方法是使用。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清安无别事

慢慢的积累一杯奶茶吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值