实际应用中多会遇到出现元素定位不到,不能点击等情况;此时可按如下几种问题原因进行排查:元素定位信息错误、元素还没加载出来不可见、元素在iframe中。
其中元素未加载完成不可见时,可以尝试使用等待进行处理,具体如下:
关于selenium中的三大等待
1、sleep 强制等待
import time
time.sleep(3)
一般用来辅助
2、隐性等待
自定义超时时间,n秒
# 设置等待超时时间为30S
driver.implicitly_wait(30)
每个会话只调用一次
找元素、命令执行完成
3、显性等待(主要引用)
等待元素直到可见或者不可见
等待
WebDriverWait类
from selenium.webdriver.support.wait import WebDriverWait
# WebDriverWait(driver,超时时间,查看周期=0.5)
WebDriverWait(driver,超时时间,查看周期=0.5).until(条件)
WebDriverWait(driver,超时时间,查看周期=0.5).until_not(条件)
条件
expected_condition
"""
元素存在:
expected_conditions.presence_of_element_located
元素可见:
expected_conditions.visibility_of_element_located
元素可点击:
expected_conditions.element_to_be_clickable
"""
from selenium.webdriver.support import expected_conditions as EC
……
# 显性等待
wait =WebDriverWait(driver,20)
# 元素表达
loc=(By.XPATH,'定位信息')
# 等待 直到等待的元素可见
wait.until(EC.visibility_of_element_located(loc))
# 截图处理
driver.save_screenshot("元素出现后的截图.png")
# 元素操作
driver.find_element(*loc).click()
4、总结
这三类等待不会冲突,各自独立,可以结合使用
实际使用中大多采取sleep 强制等待+显性等待的方式,即可覆盖大部分需求