Selenium设置元素等待的三种方式
一、强制等待
- sleep()
from time import sleep() # 导包 sleep(3) #设置等待3秒钟
优点:代码简洁,简单明了。
缺点:如果设置sleep等待时间过短,元素还没加载出来,程序报错,sleep设置等待时间过长,元素早就加载出来了,程序还在等待,浪费是时间,影响代码整体的运行效率。
二、隐性等待
- implicitly_wait()
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(20) # 设置等待20秒钟
driver.get('https://www.baidu.com')
优点:
- 代码简洁,简单明了。
- 在代码前部分加implicitly_wait(10) ,整个的程序运行过程中都会有效(作用于全局,直接在初始化driver的后面加,后面的代码都会受影响),都会等待元素加载完成
- 在设置的时间内没有加载到整个页面,则会报NosuchElementError。如果元素在第10s被加载出来,自动执行下面的脚本,不会一直等待10s
缺点:非要加载到整个页面才执行代码,这样影响代码的执行效率,一般情况下,我们想要的结果是只需加载到了我要定位的元素就执行代码,不需要等待整个页面的完全加载出来再执行代码。
当页面某些js无法加载,但是想找的元素已经出来了,它还是会继续等待,直到页面加载完成(浏览器标签左上角圈圈不再转),才会执行下一句。某些情况下会影响脚本执行速度。
三、显示等待
- WebDriverWait()
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
- driver:浏览器驱动
- timeout:最长超时时间,默认以秒为单位
- poll_frequency:检测的间隔步长,默认为0.5s
- ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。
与until()或者until_not()方法结合使用
- WebDriverWait(driver,10).until(method,message="") # 调用该方法提供的驱动程序作为参数,直到返回值为True
- WebDriverWait(driver,10).until_not(method,message="") # 调用该方法提供的驱动程序作为参数,直到返回值为False
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait # WebDriverWait注意大小写
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
try:
element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
element.send_keys('123')
driver.find_element_by_id('su').click()
except Exception as message:
print('元素定位报错%s'%message)
finally:
pass
方法说明:
-
- title_is:判断当前页面的 title 是否完全等于(==)预期字符串,返回布尔值
- title_contains:判断当前页面的 title 是否包含预期字符串,返回布尔值
- presence_of_element_located:判断某个元素是否被加到了 dom 树里,并不代表该元素一定可见
- visibility_of_element_located:判断元素是否可见(可见代表元素非隐藏,并且元素宽和高都不等于 0)
- visibility_of:同上一方法,只是上一方法参数为locator,这个方法参数是 定位后的元素
- presence_of_all_elements_located:判断是否至少有 1 个元素存在于 dom 树中。举例:如果页面上有 n 个元素的 class 都是’wp’,那么只要有 1 个元素存在,这个方法就返回 True
- text_to_be_present_in_element:判断某个元素中的 text 是否 包含 了预期的字符串
- text_to_be_present_in_element_value:判断某个元素中的 value 属性是否包含 了预期的字符串
- frame_to_be_available_and_switch_to_it:判断该 frame 是否可以 switch进去,如果可以的话,返回 True 并且 switch 进去,否则返回 False
- invisibility_of_element_located:判断某个元素中是否不存在于dom树或不可见
- element_to_be_clickable:判断某个元素中是否可见并且可点击
- staleness_of:等某个元素从 dom 树中移除,注意,这个方法也是返回 True或 False
- element_to_be_selected:判断某个元素是否被选中了,一般用在下拉列表
- element_selection_state_to_be:判断某个元素的选中状态是否符合预期
- element_located_selection_state_to_be:跟上面的方法作用一样,只是上面的方法传入定位到的 element,而这个方法传入 locator
- alert_is_present:判断页面上是否存在 alert
优点:代码执行效率快。无需等待整个页面加载完成,只需加载到你要定位的元素就可以执行代码。是最智能的设置元素等待的方式。
缺点:
1.必须要导入以上3个包,导包路径相当的复杂,啰嗦而且麻烦
- from selenium.webdriver.support import expected_conditions as EC
- from selenium.webdriver.support.ui import WebDriverWait
- from selenium.webdriver.common.by import By
2.写等待时间的代码也是复杂。步骤稍微有点多。
- element=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,‘kw’)))

浙公网安备 33010602011771号