博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Selenium自动化测试----智能等待
阅读量:4645 次
发布时间:2019-06-09

本文共 3878 字,大约阅读时间需要 12 分钟。

 implicitly_wait():是 webdirver 提供的一个超时等待。隐的等待一个元素被发现,或一个命令完成。

如果超出了设置时间的则抛出异常。

需要特别说明的是:隐性等待对整个driver的周期都起作用,所以只要设置一次即可,我曾看到有人把隐性等待当成了sleep在用,走哪儿都来一下…

WebDriverWait()

详细格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver -
WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)
timeout - 最长超时时间,默认以秒为单位
poll_frequency -
休眠时间的间隔(步长)时间,默认为 0.5 秒
ignored_exceptions -
超时后的异常信息,默认情况下抛 NoSuchElementException 异常。

实例:

from selenium.webdriver.support.ui import WebDriverWait....element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”))is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id(“someId”).is_displayed())

 

WebDriverWai()一般由 unit()或 until_not()方法配合使用,下面是 unit()和 until_not()方法的说明。

until(method, message=’ ’)
调用该方法提供的驱动程序作为一个参数,直到返回值不为 False。
until_not(method, message=’ ’)
调用该方法提供的驱动程序作为一个参数,直到返回值为 False。

第三种办法就是显性等待,WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。

先看个代码实例:

# -*- coding: utf-8 -*-fromselenium importwebdriverfromselenium.webdriver.support.wait importWebDriverWaitfromselenium.webdriver.support importexpected_conditions as ECfromselenium.webdriver.common.by importBydriver=webdriver.Firefox()driver.implicitly_wait(10)# 隐性等待和显性等待可以同时用,但要注意:等待的最长时间取两者之中的大者driver.get('https://huilansame.github.io')locator=(By.LINK_TEXT, 'CSDN')try:WebDriverWait(driver,20,0.5).until(EC.presence_of_element_located(locator))printdriver.find_element_by_link_text('CSDN').get_attribute('href')finally:driver.close()

上例中,我们设置了隐性等待和显性等待,在其他操作中,隐性等待起决定性作用,在WebDriverWait..中显性等待起主要作用,但要注意的是:最长的等待时间取决于两者之间的大者,此例中为20,如果隐性等待时间 > 显性等待时间,则该句代码的最长等待时间等于隐性等待时间。  

看了以上内容基本上很清楚了,调用方法如下:

WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)

这里需要特别注意的是until或until_not中的可执行方法method参数,很多人传入了WebElement

对象,如下:

WebDriverWait(driver, 10).until(driver.find_element_by_id('kw')) # 错误

 

这是错误的用法,这里的参数一定要是可以调用的,即这个对象一定有 __call__() 方法,否则会抛出异常:

TypeError: 'xxx' object is not callable

 

在这里,你可以用selenium提供的 expected_conditions 模块中的各种条件,也可以用WebElement的 is_displayed() 、is_enabled()、is_selected() 方法,或者用自己封装的方法都可以,那么接下来我们看一下selenium提供的条件有哪些:

expected_conditions

expected_conditions是selenium的一个模块,其中包含一系列可用于判断的条件:

  • title_is : 判断当前页面的title是否精确等于预期

  • title_contains : 判断当前页面的title是否包含预期字符串

  • presence_of_element_located : 判断某个元素是否被加到了dom树里,并不代表该元素一定可见

  • visibility_of_element_located : 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0

  • visibility_of : 跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了

  • presence_of_all_elements_located : 判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,这个方法就返回True

  • text_to_be_present_in_element : 判断某个元素中的text是否 包含 了预期的字符串

  • text_to_be_present_in_element_value : 判断某个元素中的value属性是否 包含 了预期的字符串

  • frame_to_be_available_and_switch_to_it : 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False

  • invisibility_of_element_located : 判断某个元素中是否不存在于dom树或不可见

  • element_to_be_clickable : 判断某个元素中是否可见并且是enable的,这样的话才叫clickable

  • staleness_of : 等某个元素从dom树中移除,注意,这个方法也是返回True或False

  • element_to_be_selected : 判断某个元素是否被选中了,一般用在下拉列表

  • element_selection_state_to_be : 判断某个元素的选中状态是否符合预期

  • element_located_selection_state_to_be : 跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator

  • alert_is_present : 判断页面上是否存在alert

上面是所有17个condition,与until、until_not组合能够实现很多判断,如果能自己灵活封装,将会大大提高脚本的稳定性。

 

分析

以title_is为例

class title_is(object): """An expectation for checking the title of a page. title is the expected title, which must be an exact match returns True if the title matches, false otherwise.""" def __init__(self, title): self.title = title def __call__(self, driver): return self.title == driver.title

可以看到 title_is 实际上是1个class,其 __call__ 方法被定义成是返回1个bool值。因此,一般的用法就是

# 实例化the_instance = title_is('expected')# 直接在实例上调用__call__the_instance(dr) #return True or False

转载于:https://www.cnblogs.com/jerryguan/p/6671243.html

你可能感兴趣的文章
20155334 曹翔 《网络对抗》逆向及Bof基础
查看>>
Block 的基本用法
查看>>
sklearn学习笔记之简单线性回归
查看>>
Git 配置
查看>>
测试代码发布到博客效果(使用word发布)
查看>>
LoadRunner-Linux监控工具nmon使用
查看>>
core net 实现post 跟get
查看>>
download fomat install rootfs script
查看>>
免费图标:来自Samuray的免费电视/电影相关图标
查看>>
GitHub万星项目:黑客成长技术清单
查看>>
笔试题:倒置字符串
查看>>
postgresql的启停和创建
查看>>
poj 1149 PIGS 最大流
查看>>
shortcut in windows
查看>>
ASPX页面包含inc文件、用户控件、普通html文件
查看>>
九度OJ 1135:字符串排序 (排序)
查看>>
C6678 PCIe boot default configuration value
查看>>
函数模板
查看>>
java序列化
查看>>
sizeof运算符
查看>>