目录
0. 上节回顾
1. 定位失败的原因
2. 强制等待
3. 隐式等待
4. 显式等待 【重点难点】
4.1. 实例化 WebDriverWait 对象
4.2. 指定等待条件
4.3. 等待条件的具体要求
4.3. 1. 等待条件是一个函数
4.3. 2. 返回值是布尔值
4.3. 3. 只有一个参数,参数值是driver
4.3. 4. 出现异常
5. 流畅等待 (最底层,最强大,最难)
5. 1. 元素闪现太快
5. 2. 出现特殊异常
6. 等待策略可以复用
7. Selenium官网中:等待的警告
0. 上节回顾
- WebDriver的角度看,有8种元素定位策略
-
从浏览器的角度来看,有2种元素选择器:
- CSS选择器执行效率高
- XPath选择器使用效率高
- 底层通过JS实现,可以通过F12进行获取、调试
1. 定位失败的原因
- 元素不存在
- 元素不可见
- 元素被遮挡
- 元素被禁用
如:元素被延迟渲染
with get_webdriver() as driver:
driver.get("http://118.24.147.95:8086/delay.html")
ele = driver.find_element(By.XPATH, '//*[@id="content"]/input')
print(ele)
selenium.common.exceptions.NoSuchElementException: Message: no such element:
Unable to locate element: {"method":"xpath","selector":"//*[@id="content"]/input"}
控制台输入 debugger 让网页停下来
#cdp:chrome devtools 协议
driver.execute_cdp_cmd("Debugger.enable", {}) # JS断点 selenium 4 新特性 (执行的慢的话有概率失败)
driver.execute_script("setTimeout('debugger',0.1*1000)") #JS断电 selenium 3
pdb.set_trace()#python 断点
with get_webdriver() as driver:
driver.get("http://118.24.147.95:8086/delay.html")
# cdp:chrome devtools 协议
driver.execute_cdp_cmd("Debugger.enable", {}) # JS断点 selenium 4 新特性 (执行的慢的话有概率失败)
driver.execute_script("setTimeout('debugger',0.1*1000)") # JS断电 selenium 3
pdb.set_trace() # python 断点
ele = driver.find_element(By.XPATH, '//*[@id="content"]/input')
print(ele)
> f:\pythonworkspace\ui_p39_selenium4\1.py(18)<module>()
-> ele = driver.find_element(By.XPATH, '//*[@id="content"]/input')
(Pdb)
- 强制等待 sleep
- 隐式等待 implicitly_wait
- 显式等待 WebDriverWait
- 流畅等待 FluentWait
2. 强制等待
import time
time.sleep(6) # 定位代码,延迟6秒再执行
- 以秒为单位
- 可以是浮点数:(0.1秒)
with get_webdriver() as driver:
driver.get("http://101.34.221.219:8010/?s=user/loginInfo.html")
driver.find_element(By.XPATH, "/html/body/div[4]/div/div[2]/div[2]/div/div/div[1]/form/div[1]/input", ).send_keys(
"tiancao")
driver.find_element(By.XPATH,
"/html/body/div[4]/div/div[2]/div[2]/div/div/div[1]/form/div[2]/div/input", ).send_keys(
"ganju123")
driver.find_element(By.XPATH,
"/html/body/div[4]/div/div[2]/div[2]/div/div/div[1]/form/div[3]/button", ).click() # 点击登录
time.sleep(1) # sleep的值不好取,太大 或者 太小,都会失败
msg = driver.find_element(By.XPATH, "//p[@class='prompt-msg']", ).text
assert msg == "登录成功" # 没有任何输出,说明断言成功
3. 隐式等待
- 只会等待元素出现
- 不会等待元素就绪
with get_webdriver() as driver:
# driver.implicitly_wait(0) #禁用
driver.implicitly_wait(10) # 启用隐式等待,每一次等待最长不超过10秒
driver.get("http://118.24.147.95:8086/delay.html")
msg = driver.find_element(By.XPATH, '//*[@id="content"]/p').text
ele = driver.find_element(By.XPATH, '//*[@id="content"]/input')
assert msg == "大家好,我是北凡"
http://118.24.147.95:8086/flash.html
4. 显式等待 【重点难点】
4.1. 实例化 WebDriverWait 对象
- 两个参数 (固定写法) driver: WebDriver实例 (浏览器对象)
- 10 :超时时间,等待最多不超过10秒
WebDriverWait(driver, 10)
4.2. 指定等待条件
msg = WebDriverWait(driver, 10).until(
lambda x: driver.find_element(
By.XPATH,
"//p[@class='prompt-msg']",
).text
)
# 等待条件(匿名函数)
lambda x: driver.find_element(
By.XPATH,
"//p[@class='prompt-msg']",
).text
driver = webdriver.Chrome() # 启动浏览器 是空白页
driver.get("http://101.34.221.219:8010/?s=user/loginInfo.html")
driver.find_element(By.XPATH,"/html/body/div[4]/div/div[2]/div[2]/div/div/div[1]/form/div[1]/input",).send_keys("tiancao")
driver.find_element(By.XPATH,"/html/body/div[4]/div/div[2]/div[2]/div/div/div[1]/form/div[2]/div/input",).send_keys("ganju123")
driver.find_element(By.XPATH,"/html/body/div[4]/div/div[2]/div[2]/div/div/div[1]/form/div[3]/button",).click() # 点击登录
msg = WebDriverWait(driver, 10).until(lambda x: driver.find_element(
By.XPATH,
"//p[@class='prompt-msg']",
).text)
assert msg == "登录成功",f"{msg}" # 没有任何输出,说明断言成功
#driver.quit()
4.3. 等待条件的具体要求
成功例子:在等待中,定位元素,函数返回了布尔值True 再交互
with get_webdriver() as driver:
driver.get("http://118.24.147.95:8086/delay.html")
ele = WebDriverWait(driver, 10).until(
lambda x: driver.find_element(By.XPATH, '//*[@id="content"]/input')
)
ele.click() # 元素交互
WebDriverWait(driver, 10).until( # 定位元素
lambda x: driver.find_element(By.XPATH, '//*[@id ="content"] /input').click()
)
4.3. 1. 等待条件是一个函数
区别
|
普通函数
|
匿名函数
|
关键
|
def
|
lambda
|
名字
|
有名字
|
没有名字
|
长度
|
可以多行
|
只能一行
|
返回值
|
可选,用
return
指定
|
必选,返回表达式结果
|
4.3. 2. 返回值是布尔值
- 必须是布尔值,不是布尔值, 也会按照布尔值进行判断
- 如果判断为Ture,表示等待成功,停止等待
- 如判断为False,表示等待失败,继续等到,直到超时,
4.3. 3. 只有一个参数,参数值是driver
4.3. 4. 出现异常
- 如果是False,表示等待失败,继续等待,直到超时
- 如果是 NoSuchElementException 异常,表示等待失败,继续等待
- 如果是其他异常,表示出错,停止等待
如果,想要以False表示成功怎么办?可以使用 until_not 方法:
- 如果是Ture,表示等待失败,继续等待,直到超时
- 如果是False,表示等待成功,停止等待
# WebDriverWait(driver, 10).until(lambda x: False) # 会超时
WebDriverWait(driver, 10).until_not(lambda x: False) # 会成功
5. 流畅等待 (最底层,最强大,最难)
- 重试频率 (等待的原理:失败重试,多久重试一次?)
- 忽略的异常列表
5. 1. 元素闪现太快
with get_webdriver() as driver:
driver.get("http://118.24.147.95:8086/flash_fast.html")
WebDriverWait(driver, 10, 0.01).until( # 调整了重试频率
lambda x: driver.find_element(By.XPATH, "//p")
)
5. 2. 出现特殊异常
with get_webdriver() as driver:
driver.get("http://118.24.147.95:8086/delay_alert.html")
alert = WebDriverWait(
driver,
10,
ignored_exceptions=[
NoAlertPresentException
], # 在等待过程中,如果出现NoAlertPresentException, 就继续等待
).until(lambda x: driver.switch_to.alert)
print(alert.text)
6. 等待策略可以复用
文章来源:https://www.toymoban.com/news/detail-676464.html
with get_webdriver() as driver:
driver.implicitly_wait(10) # 隐式等待只要设置一次
driver.get("http://118.24.147.95:8086/flash.html")
p = WebDriverWait(driver, 10).until( # 显式等待要设置1次
lambda x: driver.find_element(By.XPATH, "//p"))
p = WebDriverWait(driver, 10).until( # 显式等待要设置1次
lambda x: driver.find_element(By.XPATH, "//input"))
with get_webdriver() as driver:
driver.wait = WebDriverWait(driver, 10) # 等待策略 设置1次
driver.get("http://118.24.147.95:8086/flash.html")
p = driver.wait.until(lambda x: driver.find_element(By.XPATH, "//p"))
i = driver.wait.until(lambda x: driver.find_element(By.XPATH, "//input")) # 到处使用
7. Selenium官网中:等待的警告
文章来源地址https://www.toymoban.com/news/detail-676464.html
到了这里,关于Python+Selenium4三大等待&预期条件_web自动化(4)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!