selenium WebDriverWait类等待机制的实现
作者:清宝贝,加油 发布时间:2022-12-18 13:07:21
在自动化测试脚本的运行过程中,可以通过设置等待的方式来避免由于网络延迟或浏览器卡顿导致的偶然失败,常用的等待方式有三种:
一、固定等待(time)
固定待是利用python语言自带的time库中的sleep()方法,固定等待几秒。这种方式会导致这个脚本运行时间过长,不到万不得已尽可能少用。(注:脚本调试过程时,还是可以使用的,方便快捷)
from selenium import webdriver
import time
#驱动浏览器
driver = webdriver.Chrome()
#设置窗口最大化
driver.maximize_window()
driver.get('https://www.baidu.com/')
#设置固定等待
time.sleep(2)
driver.quit()
二、隐式等待(implicitly_wait())
webdriver类提供了implicitly_wait()方法来配置超时时间。隐式等待表示在自动化实施过程中,为查找页面元素或者执行命令设置一个最长等待时间。如果在规定时间内页面元素被找到或者命令被执行完成,则执行下一步,否则继续等待直到设置的最长等待时间截止
from selenium import webdriver
#驱动浏览器
driver = webdriver.Chrome()
#设置隐式等待
driver.implicitly_wait(30)
#设置窗口最大化
driver.maximize_window()
driver.get('https://www.baidu.com/')
注:隐式等待的好处是不用像固定等待方法一样死等时间N秒,可以在一定程度上提升测试用例的执行效率。不过这种方法也存在一定的弊端,那就是程序会一直等待整个页面加载完成,也就是说浏览器窗口标签栏中不再出现转动的小圆圈,才会继续执行下一步。
三、显式等待(WebDriverWait)
显示等待会每个一段时间(该时间一般都很短,默认为0.5秒,也可以自定义),执行自定义的程序判断条件,如果判断条件成立,就执行下一步,否则继续等待,直到超过设定的最长等待时间,然后抛出TimeOutEcpection的异常信息。
alert_is_present():判断页面是否出现alert框
# coding:utf-8
from selenium import webdriver
#导入By类
from selenium.webdriver.common.by import By
#导入显示等待类
from selenium.webdriver.support.ui import WebDriverWait
#导入期望场景类
from selenium.webdriver.support import expected_conditions
driver = webdriver.Chrome()
#alert_is_present():判断页面是否出现alert框
result=WebDriverWait(driver,10).until(expected_conditions.alert_is_present())
print(result.text)
element_located_selection_state_to_be(locator,state):判断一个元素的状态是否是给定的选择状态
第一个传入参数是一个 * , * 是一个元组(by,path);第二个传入参数表示期望的元素状态,True表示选中状态,Flase表示未选中
#element_located_selection_state_to_be():判断一个元素的状态是否是给定的选择状态
result=WebDriverWait(driver,10).until(expected_conditions.element_located_selection_state_to_be((By.ID,'kw'),True))
element_selection_state_to_be(driverObject,state):判断给定的元素是否被选中
第一个传入参数是一个webdriver对象,第二个参数是期望的元素的状态,True表示选中状态,Flase表示未选中
#element_selection_state_to_be():判断给定的元素是否被选中
result=WebDriverWait(driver,10).until(expected_conditions.element_selection_state_to_be((driver.find_element_by_id('kw')),True))
element_located_to_be_selected(locator):期望某个元素处于被选中状态
参数传入的是一个 *
#element_located_to_be_selected():期望某个元素处于被选中状态
result=WebDriverWait(driver,10).until(expected_conditions.element_located_to_be_selected((By.ID,'kw')))
element_to_be_selected():期望某个元素处于选中状态
传入参数是一个webdriver实例对象
#element_to_be_selected():期望某个元素处于选中状态
result=WebDriverWait(driver,10).until(expected_conditions.element_to_be_selected(driver.find_element_by_id('kw')))
element_to_be_clickable():判断元素是否可见并且能被单击,条件满足返回页面元素对象,否则返回Flase
#element_to_be_clickable():判断元素是否可见并且能被单击,条件满足返回页面元素对象,否则返回Flase
result=WebDriverWait(driver,10).until(expected_conditions.element_to_be_clickable(driver.find_element_by_id('hh')))
frame_to_be_available_and_switch_to_it(parm):判断frame是否可用
如果可用返回True并切入到该frame,参数parm可以是 * locator(by,path)组成的元组,或者定位方式:id、name、index(frame在页面上索引号),或者webelement对象。
#frame_to_be_available_and_switch_to_it():判断frame是否可用
#传入ID值‘kk'
result1=WebDriverWait(driver,10,0.2).until(EC.frame_to_be_available_and_switch_to_it(By.ID,'kw'))
#传入frame的webelement对象
result2=WebDriverWait(driver,10,0.2).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element_by_id('kw')))
#传入frame在页面中索引号
result3=WebDriverWait(driver,10,0.2).until(EC.frame_to_be_available_and_switch_to_it(1))
invisibility_of_element_located(locator):希望某个元素不可见或者不存在DOM中
满足条件返回True,否则返回定位到的元素对象
#invisibility_of_element_located():希望某个元素不可见或者不存在DOM中,满足条件返回True,否则返回定位到的元素对象
result8=WebDriverWait(driver,10,0.2).until(EC.invisibility_of_element_located(By.ID,'kw'))
visibility_of_element_located(locator):希望某个元素出现在DOM中并且可见
满足条件返回该元素的页面元素对象
#visibility_of_element_located():希望某个元素出现在DOM中并且可见,满足条件返回该元素的页面元素对象
result9=WebDriverWait(driver,10,0.2).until(EC.visibility_of_element_located(driver.find_element_by_id('kw')))
visibility_of(webelement):希望某个元素出现在页面的DOM中,并且可见,满足条件返回该元素的页面元素对象
#visibility_of():希望某个元素出现在页面的DOM中,并且可见,满足条件返回该元素的页面元素对象
result10=WebDriverWait(driver,10,0.2).until(EC.visibility_of(driver.find_element_by_id('kw'))
visibility_of_any_elements_located(locator):希望某个元素出现在DOM中并且可见
如果满足条件返回该元素的页面元素对象
#visibility_of_any_elements_located():希望某个元素出现在DOM中并且可见
result11=WebDriverWait(driver,10,0.2).until(EC.visibility_of(By.TAG_NAME,'input'))
presence_of_all_elements_located(locator):判断页面至少有一个如果元素出现,如果满足条件,返回所有满足定位表达式的页面元素
#presence_of_all_elements_located():判断页面至少有一个如果元素出现,如果满足条件,返回所有满足定位表达式的压面元素
result12=WebDriverWait(driver,10,0.2).until(EC.presence_of_all_elements_located(By.ID,'kw'))
presence_of_element_located(locator):判断某个元素是否存在DOM中,不一定可见,存在返回该元素对象
#presence_of_element_located():判断某个元素是否存在DOM中,不一定可见,存在返回该元素对象
result12=WebDriverWait(driver,10,0.2).until(EC.presence_of_element_located(By.ID,'kw'))
staleness_of(webelement):判断一个元素是否仍在DOM中,如果在规定时间内已经移除返回True,否则返回Flase
#staleness_of():判断一个元素是否仍在DOM中,如果在规定时间内已经移除返回True,否则返回Flase
result13=WebDriverWait(driver,10,0.2).until(EC.staleness_of(driver.find_element_by_id('kw')))
text_to_be_present_in_element():判断文本内容test是否出现在某个元素中,判断的是元素的text
#text_to_be_present_in_element():判断文本内容test是否出现在某个元素中,判断的是元素的text
result15=WebDriverWait(driver,10,0.2).until(EC.text_to_be_present_in_element(By.TAG_NAME,"p"))
text_to_be_present_in_element_value():判断text是否出现在元素的value属性值中
#text_to_be_present_in_element_value():判断text是否出现在元素的value属性值中
result16=WebDriverWait(driver,10,0.2).until(EC.text_to_be_present_in_element_value((By.ID,'kw'),'随便'))
title_contains():判断页面title标签的内容包含partial_title,只需要部分匹配即可
#title_contains():判断页面title标签的内容包含partial_title,只需要部分匹配即可,包含返回True,不包含返回Flase
result17=WebDriverWait(driver,10,0.2).until(EC.title_contains("你就知道"))
title_is():判断页面title内容是与传入的title_text内容完全匹配
#title_is():判断页面title内容是与传入的title_text内容完全匹配,匹配返回True,否则返回Flase
result18=WebDriverWait(driver,10,0.2).until(EC.title_is("百度一下,你就知道"))
来源:https://www.cnblogs.com/qingbaobei7370/p/11002840.html


猜你喜欢
- 1、使用argparse组件,获取命令行参数;使用re组件,获取需要查找的字符串所在行2、使用pandas组件,对文件进行排序。3、命令行执
- 删除单条记录 代码如下:id = saferequest("id") sql="
- vuex的理论知识就不多提了,官网上已经有明确的讲解。用一个简单的例子来描述一下基本的用法:第一步:npm install vuex –sa
- 前言最近碰到了照片识别的场景,正好使用了face_recognition项目,给大家分享分享。face_recognition项目能做的很多
- 以前一直用RHEL 6.3和6.4,系统盘里自带了mysql server,配置好yum源后,直接yum install mysql-ser
- 一、Python 的 IDE —— PyCharm1.1 集成开发环境(IDE)集成开发环境(IDE,Integrated Developm
- 如题,今天兜兜转转找了很多网站帖子,一个个环节击破,最后装好费了不少时间。希望这个帖子能帮助有需要的人,教你一篇帖子搞定python+num
- python软件免费吗?python是免费的,是自由、开放源码的软件之一,在python官网可以免费下载,使用者可以自由地发布这个软件的拷贝
- mysql找不到my.ini文件问题描述刚刚在修改mysql默认配置的时候,发现找不到my.ini文件。按照其他搬运工的说法,打开隐藏的文件
- 1.过程:1>注册驱动器类:Class.forName()2>连接数据库:String url = "jdbc:sql
- 经常碰到的一个问题是limit的offset太高,如:limit 100000,20,这样系统会查询100020条,然后把前面的
- 第一点:找Python安装目录方法一:方法二:输入import sysprint(sys.path)化黑线处第二点:找到安装目录后就可以开始
- 背景:有一个list,里面的每一个元素都是dict,根据某一个key进行去重,在这里,key代表question#!/usr/bin/env
- 组合字面量组合字面量是最直接方式初始化Go对象,假设定义了Book类型,使用字面量初始化代码如下:type Book struct { &n
- 见下:<% FOR i = 1 TO 1000 n =
- 前言字典为动词“to yield”给出了两个释义:产出和让步。对于 Python 生成器中的 yie
- 在实际工作中,无论是对数据库系统(DBMS),还是对数据库应用系统(DBAS),查询优化一直是一个热门话题。一个成功的数据库应用系统的开发,
- 今天照着样例搞了下tensorboard,发现自己无法显示scalar,而graph却可以正常显示。出现这种情况就说明,tensorfboa
- 一、打开、关闭文件 语法为open (filevar, filename),其中filevar为文件句柄,或者说是程序中用来代表某文件的代号
- 首先,在写数据库时需要遵循以下几个原则: 数据库的命名规范: &nbs