目录
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官网中:等待的警告
如:元素被延迟渲染
with get_webdriver() as ("118.24.147.95:8086/delay.html")ele = driver.find_element(By.XPATH, '//*[@id="content"]/input')print(ele)
ptions.NoSuchElementException: Message: no such element:
Unable to locate element: {"method":"xpath","selector":"//*[@id="content"]/input"}
DEBUG秘技:
控制台输入 debugger 让网页停下来
#cdp:chrome devtools 协议
ute_cdp_cmd(able", {}) # JS断点 selenium 4 新特性 (执行的慢的话有概率失败)
ute_script("setTimeout('debugger',0.1*1000)") #JS断电 selenium 3
pdb.set_trace()#python 断点
解决了定位失败的问题 with get_webdriver() as ("118.24.147.95:8086/delay.html")# cdp:chrome devtools 协议ute_cdp_cmd(able", {}) # JS断点 selenium 4 新特性 (执行的慢的话有概率失败ute_script("setTimeout('debugger',0.1*1000)") # JS断电 selenium 3pdb.set_trace() # python 断点ele = driver.find_element(By.XPATH, '//*[@id="content"]/input')print(ele)
> f:pythonworkspaceui_p39_selenium41.py(18)<module>()通过 DEBUG ,发现很多的元素是通过 JS 动态创建、改变、修改的,如果要定位准许,需要 “ 等待 ”JS 完成 相关的操作:
-> ele = driver.find_element(By.XPATH, '//*[@id="content"]/input')
(Pdb)
import time
time.sleep(6) # 定位代码,延迟6秒再执行
with get_webdriver() as ("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']", ).textassert msg == "登录成功" # 没有任何输出,说明断言成功
对于出现之后会 消失 的元素来讲,要求 sleep 的秒数相当精确 学习 selenium 中提供 等待 来进行解决 with get_webdriver() as driver:# driver.implicitly_wait(0) #禁用driver.implicitly_wait(10) # 启用隐式等待,每一次等待最长不超过10秒("118.24.147.95:8086/delay.html")msg = driver.find_element(By.XPATH, '//*[@id="content"]/p').textele = driver.find_element(By.XPATH, '//*[@id="content"]/input')assert msg == "大家好,我是北凡"
对于复杂的业务场景,不只要求元素存在,还要求元素的状态就绪 118.24.147.95:8086/flash.html
如果要对等待条件,进行定制,就需要用到显式等待 WebDriverWait(driver, 10)
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
x 是匿名函数的参数,被传递了 driver driver = webdriver.Chrome() # 启动浏览器 是空白页("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()
成功例子:在等待中,定位元素,函数返回了布尔值True 再交互
with get_webdriver() as ("118.24.147.95:8086/delay.html")ele = WebDriverWait(driver, 10).until(lambda x: driver.find_element(By.XPATH, '//*[@id="content"]/input'))ele.click() # 元素交互
driver.find_element(By.XPATH, '//*[@id="content"]/input') 的返回值, 是一个对象,它布尔值是 True 失败的例子:在等待中,交互元素 WebDriverWait(driver, 10).until( # 定位元素lambda x: driver.find_element(By.XPATH, '//*[@id ="content"] /input').click())
返回值是 driver.find_element(By.XPATH, '//* [@id="content"]/input').click() 是None,它的布尔值是 False 区别 | 普通函数 | 匿名函数 |
关键 | def | lambda |
名字 | 有名字 | 没有名字 |
长度 | 可以多行 | 只能一行 |
返回值 | 可选,用 return 指定 | 必选,返回表达式结果 |
如果,想要以False表示成功怎么办?可以使用 until_not 方法:
# WebDriverWait(driver, 10).until(lambda x: False) # 会超时
WebDriverWait(driver, 10).until_not(lambda x: False) # 会成功
with get_webdriver() as ("118.24.147.95:8086/flash_fast.html")WebDriverWait(driver, 10, 0.01).until( # 调整了重试频率lambda x: driver.find_element(By.XPATH, "//p"))
with get_webdriver() as ("118.24.147.95:8086/delay_alert.html")alert = WebDriverWait(driver,10,ignored_exceptions=[NoAlertPresentException], # 在等待过程中,如果出现NoAlertPresentException, 就继续等待).until(lambda x: driver.switch_to.alert))
with get_webdriver() as driver:driver.implicitly_wait(10) # 隐式等待只要设置一次("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次("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")) # 到处使用
本文发布于:2024-01-28 16:54:46,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064320928883.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |