WebDriverWait元素等待和全局设置
时间:2019-10-15
本文章向大家介绍WebDriverWait元素等待和全局设置,主要包括WebDriverWait元素等待和全局设置使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
由于现在部分web应用加载方式的选择,页面会需要一定时间逐渐加载完毕,也就是说有的页面元素先加载出来,有的元素后加载出来。如果直接定位所查找的元素的话,可能会由于此元素尚未加载完毕找不到元素从而报错,由于网络不稳定这种情况出现的几率会大很多,一般解决方法的话,time.sleep()函数可以避免一些这种状况,但是缺少了灵活性。在selenium中有关于等待的方法可以比较灵活的解决这个问题,这次主要讲解selenium中元素等待WebDriverWait的使用,以及全局的设置。 一、关于全局设置超时时间 三个全局设置时间的方法中,设置的时间单位为秒,例如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:超时时间(秒) 二、关于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 WebDriverWait from 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() 三、实例展示:全局设置元素定位超时时间 全局设置只需要一行代码,这里为了演示,分别在设置前和设置后分别定位一次元素,元素本身不存在,用来模拟网络波动导致尚未加载出来的状态;然后统计这两次定位所需的时间,发现直接定位只有一次,如果找不到就直接抛出异常了,设置定位超时时间后,在这个时间段内会一直来查找元素。 from selenium import webdriver import datetime driver = webdriver.Chrome() driver.get("https://tieba.baidu.com") # 未定义全局等待时,直接定位元素 start1 = datetime.datetime.now() try: # 使用一个不存在的元素,模拟还没有加载出来的状态 driver.find_element_by_css_selector("aaaa[title = '娱乐明星']").click() except: print("没有定位到元素") end1 = datetime.datetime.now() print("设置前等待时间: %s 秒" % (end1-start1).total_seconds()) # 设置全局等待后,再进行定位元素 driver.implicitly_wait(10) start2 = datetime.datetime.now() try: driver.find_element_by_css_selector("aaaa[title = '娱乐明星']").click() except: print("没有定位到元素") end2 = datetime.datetime.now() print("设置后等待时间: %s 秒" % (end2-start2).total_seconds()) 运行结果: 没有定位到元素 设置前等待时间: 0.015992 秒 没有定位到元素 设置后等待时间: 10.045907 秒 四、实例展示:WebDriverWait返回类型以及抛出异常 这里主要展示下WebDriverWait中,大部分的返回类型是True\False,部分方法,例如presence_of_element_located返回类型为一个元素,我们可以定位元素之后,直接对返回的元素进行click、send_keys等操作。 from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from 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) # 大部分方法返回类型为True\False assert_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("网易"), "错误信息:网页标题不是网易") 运行结果: 返回类型 <selenium.webdriver.remote.webelement.WebElement (session="961ec35d6f354c9b5ca65a80cd096104", element="0.5643114406724057-1")> 返回类型 False Traceback (most recent call last): File "D:/1git/cenpur_uitest/test_case/demo.py", line 17, in <module> assert_judge = WebDriverWait(driver, 5, 0.5).until(Expect.title_is("网易"), "错误信息:网页标题不是网易") File "C:\Users\test\AppData\Local\Programs\Python\Python35\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message: 错误信息:网页标题不是网易 ———————————————— 版权声明:本文为CSDN博主「许西城」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/CCGGAAG/article/details/86763952
————————————————
转载原文链接:https://blog.csdn.net/CCGGAAG/article/details/86763952
原文地址:https://www.cnblogs.com/minghong/p/11678199.html
- 如何编写更好的SQL查询:终极指南(上)
- asp.net web api 异常捕获
- asp.net web api 文件上传
- 使用MySQL正则表达式 __MySQL必知必会
- 史上最好用的免费翻蔷利器
- asp.net web api 接口安全与角色控制
- TensorFlow从0到1 | 第十五章 重新思考神经网络初始化
- asp.net web api 下载之断点续传
- apache2.4.x三种MPM介绍
- 没有自己的服务器如何学习生物数据分析(上篇)
- 【直播】我的基因组57:最简陋的祖源分析
- asp.net web api 使用Odata
- TensorFlow从0到1丨第十六篇 L2正则化对抗“过拟合”
- TensorFlow从0到1 | 第十七章 Step By Step上手TensorBoard
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- OpenGL ES for Android 相机预览
- OpenGL ES for Android 相机预览适配不同分辨率的手机
- Flutter Widgets 之 Container
- Flutter Widgets 之 Row和Column
- Flutter Widgets 之 SafeArea
- Flutter Widgets 之 Wrap
- Flutter Widgets 之 Expanded和Flexible
- 可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践
- Flutter Widgets 之 AnimatedContainer
- Flutter Widgets 之 Opacity 和AnimatedOpacity
- 聊聊常见的服务(接口)认证授权
- Flutter Widgets 之 FutureBuilder
- [Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本
- Flutter Widgets 之 InkWell 和 Ink
- Flutter Widgets 之 BottomNavigationBar