0. 概述
当使用Selenium自动化浏览器交互时,经常会遇到需要等待元素变为可用或满足特定条件的情况。
Selenium的等待方法有'Time.sleep()' 'Implicit Wait' 'Explicitly Wait'。
但应该选择哪种呢?
我们将通过各自的优缺点详细比较这三种方法的区别。
1. Time.sleep()
这是引入固定延迟到脚本中的Python默认方法。调用time.sleep(秒)会导致整个脚本在指定的秒数内暂停执行。
1.1. Time.sleep()的优点
使用简单,无需设置。
可以精确了解脚本等待的时间。
1.2. Time.sleep()的缺点
大多数情况下,固定延迟可能比所需时间长,导致测试执行时间延长。
如果等待的任务在睡眠时间之前完成,测试可能会失败。
2. Implicit Wait
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # WebDriver will wait for up to 10 seconds for an element to appear
driver.get('<https://example.com>')
element = driver.find_element_by_id('some-id')
요소가 웹 페이지에 나타나지 않는 경우 "해당 요소 예외 없음"을 발생시키기 전에 지정된 시간 동안 기다리도록 Selenium WebDriver에 지시합니다.
2.1. Implicit Wait的优点:
WebDriver不会等待整个时间,一旦元素更早可用,就会立即使用。
比使用time.sleep()更快。
适用于整个WebDriver会话。
2.2. Implicit Wait的缺点
由于无法确定Implicit Wait实际等待多长时间才会进行下一步,因此可能会增加调试的难度。
将Implicit Wait和Explicitly Wait混合使用可能导致不可预测的等待时间。
3. Explicitly Wait
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('<https://example.com>')
# Waiting for up to 10 seconds until an element with the specified ID becomes visible
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, 'some-id'))
)
3.1. Explicitly Wait的优点
可以指定各种条件,不仅仅是元素的存在。例如,等待元素可点击、显示或特定文本出现。
不是应用于整个WebDriver会话,可以根据操作和需求为不同元素定义不同的等待。
不会不必要地延长测试时间。一旦条件满足,脚本就会继续执行。
提供更好的错误消息,有助于更容易理解测试失败的原因。
3.2. Explicitly Wait的缺点
需要根据需要设置等待条件,与Implicit Wait不同。
仅适用于处理通过AJAX或不同时间间隔加载的Web元素的情况。
4. 结论:根据情况选择合适的等待方法。
Implicit Wait类似于在设定的时间内投放广泛的渔网以确保所有元素都可用,但Explicitly Wait则类似于使用钓竿钓取特定条件下的特定元素。
实际上,最好不要混合使用Implicit Wait和Explicitly Wait。如果随意混合使用,可能会导致不可预测的行为。
通常,对于复杂的Web应用程序环境,更喜欢可以进行详细控制的Explicitly Wait。
请参考以上内容,希望您能在适当的地方充分利用这些功能。
也一起阅读:
数据收集,现在自动化吧
无需编码,5分钟即可开始 · 5000多个网站爬取经验




