如何避免webdriver找不到元素而停止运行_Web自动化测试:WebDriverWait元素等待和全局设置...

由于现在部分web应用加载方式的选择,页面会需要一定时间逐渐加载完毕,也就是说有的页面元素先加载出来,有的元素后加载出来。如果直接定位所查找的元素的话,可能会由于此元素尚未加载完毕找不到元素从而报错,由于网络不稳定这种情况出现的几率会大很多,一般解决方法的话,time.sleep()函数可以避免一些这种状况,但是缺少了灵活性。在selenium中有关于等待的方法可以比较灵活的解决这个问题,这次主要讲解selenium中元素等待WebDriverWait的使用,以及全局的设置。

1)关于全局设置超时时间

三个全局设置时间的方法中,设置的时间单位为秒,例如implicitly_wait(30),意思是超过30秒没有定位到一个元素,程序就会报错抛出异常,期间会一直轮询查找定位元素。

设置全局元素查找的超时时间

implicitly_wait(time_to_wait)
  • time_to_wait:超时时间(秒)

设置全局js异步脚本超时时间

set_script_timeout(time_to_wait)
  • time_to_wait:超时时间(秒)

设置全局页面载入超时时间

set_page_load_timeout(time_to_wait)
  • time_to_wait:超时时间(秒)

2)关于WebDriverWait的使用以及方法介绍(显示等待)

WebDriverWait可以当做元素等待,灵活的设置查找元素时的判断条件,同时由于方法中包含了大量webdriver自带的判断方法,只返回True和False,所以也可以灵活的当做断言来使用。

2.1基础格式(webDriverWait+until+(判断条件)):

这个格式的结构有点像语言中主谓宾的结构,实例的意思是,程序每0.5秒检查,是否满足:标题包含“百度一下”这个条件,检查是否满足条件的最长时间为:15秒,超过15秒仍未满足条件则抛出异常

WebDriverWait(driver, 15, 0.5).until(expected_conditions.title_contains("百度一下"))

2.2导入库

from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions

2.3WebDriverWait

满足条件后继续执行,否则在设置时间过后抛出异常

WebDriverWait(driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)

  • driver 所创建的浏览器driver
  • timeout 最长时间长度(默认单位:秒)
  • poll_frequency 间隔检测时长(每)默认0.5秒
  • ignored_exceptions 方法调用中忽略的异常,默认只抛出:找不到元素的异常

2.4 until / until_not

直到调用的方法返回值为True

until(method, message='')

  • method:expected_conditions库中定义的方法
  • message :自定义报错信息

直到调用的方法返回值为False

until_not(method, message='')

  • method:expected_conditions库中定义的方法
  • message :自定义报错信息

2.5 expected_conditions库中的方法

判断当前页面标题是否为title

title_is(title)

  • title:期望的页面标题

判断当前页面标题是否包含title

title_contains(title)

  • title:期望的页面标题

判断此定位的元素是否存在

presence_of_element_located(locator)

  • locator:元素的定位信息

判断页面网址中是否包含url

url_contains(url)

  • url:期望的页面网址

判断页面网址是否为url

url_to_be(url)

  • url:期望的页面网址

判断页面网址不是url

url_changes(url)

  • url:期望的页面网址

判断此定位的元素是否可见

visibility_of_element_located(locator)

  • locator:元素的定位信息

判断此元素是否可见

visibility_of(element)

  • element:所获得的元素

判断此定位的一组元素是否至少存在一个

presence_of_all_elements_located(locator)

  • locator:元素的定位信息

判断此定位的一组元素至少有一个可见

visibility_of_any_elements_located(locator)

  • locator:元素的定位信息

判断此定位的一组元素全部可见

visibility_of_all_elements_located(locator)

  • locator:元素的定位信息

判断此定位中是否包含text_的内容

text_to_be_present_in_element(locator, text_)

  • locator:元素的定位信息
  • text_:期望的文本信息

判断此定位中的value属性中是否包含text_的内容

text_to_be_present_in_element_value(locator, text_)

  • locator:元素的定位信息
  • text_:期望的文本信息

判断定位的元素是否为frame,并直接切换到这个frame中

frame_to_be_available_and_switch_to_it(locator)

  • locator:元素的定位信息

判断定位的元素是否不可见

invisibility_of_element_located(locator)

  • locator:元素的定位信息

判断此元素是否不可见

invisibility_of_element(element)

  • element:所获得的元素

判断所定位的元素是否可见且可点击

element_to_be_clickable(locator)

  • locator:元素的定位信息

判断此元素是否不可用

staleness_of(element)

  • element:所获得的元素

判断该元素是否被选中

element_to_be_selected(element)

  • element:所获得的元素

判断定位的元素是否被选中

element_located_to_be_selected(locator)

  • locator:元素的定位信息

判断该元素被选中状态是否和期望状态相同

element_selection_state_to_be(element,Boolean)

  • element:所获得的元素
  • Boolean:期望的状态(True/False)

判断定位的元素被选中状态是否和期望状态相同

element_located_selection_state_to_be(locator,Boolean)

  • locator:元素的定位信息
  • Boolean:期望的状态(True/False)

判断当前浏览器页签数量是否为num

number_of_windows_to_be(num)

  • num:期望的页签数量

判断此handles页签不是唯一打开的页签

new_window_is_opened(handles)

  • handles:页签

判断是否会出现alert窗口警报

alert_is_present()

3)案例演示

这里主要展示下WebDriverWait中,大部分的返回类型是TrueFalse,部分方法,例如presence_of_element_located返回类型为一个元素,我们可以定位元素之后,直接对返回的元素进行click、send_keys等操作

from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as Expect driver = webdriver.Chrome()driver.get("https://tieba.baidu.com") # 部分关于元素定位的判断返回类型为:元素assert_ele = WebDriverWait(driver, 15, 0.5).until(Expect.presence_of_element_located(("id", "wd1")))assert_ele.send_keys("测试")print("返回类型 %s" % assert_ele) # 大部分方法返回类型为TrueFalseassert_judge = WebDriverWait(driver, 15, 0.5).until_not(Expect.title_is("网易"))print("返回类型 %s" % assert_judge) # 判断失败后会报错assert_judge = WebDriverWait(driver, 5, 0.5).until(Expect.title_is("网易"), "错误信息:网页标题不是网易")

运行结果:

返回类型 返回类型 FalseTraceback (most recent call last):  File "D:/1git/cenpur_uitest/test_case/demo.py", line 17, in     assert_judge = WebDriverWait(driver, 5, 0.5).until(Expect.title_is("网易"), "错误信息:网页标题不是网易")  File "C:甥敳獲estAppDataLocalProgramsPythonPython35libsite-packagesseleniumwebdriversupportwait.py", line 80, in until    raise TimeoutException(message, screen, stacktrace)selenium.common.exceptions.TimeoutException: Message: 错误信息:网页标题不是网易
45e994011c90d359bd54c95a26e8e610.png
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值