selenium 等待
为什么需要写等待呢?
因为我们的元素定位 可能因为一些原因报错
原因: 元素定位错误 动态元素 元素没有加载完成 打开新窗口/标签等
所以我们等待 就是解决第三个问题的
方式一 强制等待(time.sleep):
暂停运行指定的时间。这种方式的优点是简单易用,但缺点是可能会浪费无谓的等待时间,另外,如果等待时间设定不当,可能会出现未等待到元素就进行下一步操作导致失败的情况。
time.sleep(10)
方式二 隐式等待(implicitly_wait):
告知 WebDriver 在查找元素时,如果立即未找到则等待一段时间,直到元素出现为止。缺点是如果网页中有多个元素需要等待,则每个元素都要进行等待,可能会增加测试运行的时间。
implicitly_wait(time) 默认参数的单位为秒
driver.implicitly_wait(10)
首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第6秒定位到了元素则继续执行,若直到超出设置时长(10秒)还没有定位到元素,则抛出异常。
方式三 显式等待(WebDriverWait & Expected Conditions):
这是一种更为智能的等待方式,它可以部分解决强制等待和隐式等待的缺点。它允许我们指定要等待的条件和最大等待时间,当条件满足时立即返回,否则在达到最大等待时间时抛出异常。因此,它不会浪费无谓的时间。虽然它比隐式等待和强制等待更为灵活,但同样也更为复杂。
from selenium.webdriver.support import expected_conditions
WebDriverWait(driver, 10).until(expected_conditions.presence_of_element_located((By.ID, "su"))).click()
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver :浏览器驱动。
timeout :最长超时时间,默认以秒为单位。
poll_frequency :检测的间隔(步长)时间,默认为0.5S。
ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。
WebDriverWait()一般由until()或until_not()方法配合使用
until(method, message=‘’) 当某元素出现或什么条件成立则继续执行。指定时间找到则返回值,没有找到报错
until_not(method, message=‘’) 当某元素消失或什么条件不成立则继续执行。指定时间内元素消失返回True,如果还在则报错
WebDriverWait使用
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# 启动 webdriver,假设为 driver
driver = webdriver.Firefox()
# 访问页面
driver.get("http://somedomain/url_that_delays_loading")
# 使用 WebDriverWait,设置最大等待时间以及轮询时间(默认 0.5 秒)
wait = WebDriverWait(driver, 10)
# 使用 until 方法,其中 expected_conditions 已经有很多内置的条件可以使用
element = wait.until(EC.presence_of_element_located((By.ID, 'someid')))
# 接下来就可以对获取到的 element 进行操作了
WebDriverWait 和 Expected Conditions 是 Selenium WebDriver 中一种同步的方式,也称为显式等待。它用于解决一些在页面完全加载完成之前不可交互的元素的问题。这种方式能够等待页面元素在一定时间(秒)内变为可交互状态,如果超出了设置的时间,还没有找到元素就会返回异常。
一些常用的 expected_conditions 条件如下:
presence_of_element_located:某个元素已经出现在 DOM 里,注意这并不意味着该元素是可见的。
visibility_of_element_located:元素可见,(最少一个像素可见)。
element_to_be_clickable:元素可以被点击,通常用在确认按钮可以被点击后再执行点击事件。
注意,如果到了最大等待时间,条件还未满足,WebDriverWait 将会抛出 TimeoutException异常,可以根据需要进行捕获并处理。
总结
所以,要选择哪种方式取决于你具体的需求和环境。推荐在可能的情况下尽量使用显式等待,因为它提供了最大等待时间以及等待某一特定条件成立。同时,显式等待也是动态的,它会在条件满足后立即返回,最大程度地减少了无谓的等待时间。
版权归原作者 Time is precious 所有, 如有侵权,请联系我们删除。