1、显示等待
显示等待是指在代码中设置等待时间,在等待时间内轮询页面元素是否出现,直到元素出现或等待时间结束。显示等待可以更加精确地控制等待时间,提高测试的稳定性和可靠性。
显示等待需要使用 WebDriverWait 类和 expected_conditions 模块。示例代码如下:
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("http://www.example.com")
wait = WebDriverWait(driver, 10)
elem = wait.until(EC.presence_of_element_located((By.ID, "my-id")))
上面的代码中,WebDriverWait 类指定了最大等待时间为 10 秒,presence_of_element_located 方法指定了要等待的元素的定位方式。如果在 10 秒内找到了该元素,则返回该元素;如果超时仍未找到该元素,则抛出 TimeoutException 异常。
WebDriverWait源码解读
WebDriverWait(driver实例, 超时时长, 调用频率, 忽略的异常).until(要调用的 方法, 超时时返回的信息)
class WebDriverWait:
def __init__(
self,
driver,
timeout: float,
poll_frequency: float = POLL_FREQUENCY,
ignored_exceptions: typing.Optional[WaitExcTypes] = None,
):
"""Constructor, takes a WebDriver instance and timeout in seconds.
:Args:
- driver - WebDriver实例 (Ie, Firefox, Chrome or Remote)
- timeout - 超时前的秒数
- poll_frequency - 呼叫之间的睡眠间隔(默认值是0.5秒)
- ignored_exceptions - 调用期间被忽略的异常类的可迭代结构。
默认情况下,它只包含NoSuchElementException。
"""
WebDriverWait实例初始化传参
- driver:WebDriver实例,传入前面声明的driver即可
- timeout:最大超时时间;
- poll_frequency:执行间隔,默认0.5s
- ignored_exceptions:需要忽略的异常
- 如果在调用 until() 或 until_not() 的过程中抛出这个元组中的异常, 则不中断代码,继续等待;
- 如果抛出的是这个元组外的异常,则中断代码;
- 忽略的异常默认只有 NoSuchElementException
WebDriverWait实例的两个方法
until(self, method, message='')
作用:每隔一段时间(上面的poll_frequency)调用method,直到返回值不为False或不为空
method:需要执行的method
message:抛出异常时的文案,会返回 TimeoutException ,表示超时
注意:这个才是常用的,如:定位元素直到不返回空
until_not(self, method, message='')
作用:调用method,直到返回值为False或为空
method:需要执行的method
message:抛出异常时的文案,会返回 TimeoutException ,表示超时
官方例子:
from selenium.webdriver.support.wait import WebDriverWait
element = WebDriverWait(driver, 10).until(lambda x: x.find_element(By.ID, "someId"))
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element(By.ID, "someId").is_displayed())
expected_conditions 的使用方法
expected_conditions
模块提供了多种条件,用于指定要等待的元素。下面是一些常用的条件:
presence_of_element_located
:元素出现在 DOM 中,但不一定可见。visibility_of_element_located
:元素出现在 DOM 中,并且可见。element_to_be_clickable
:元素出现在 DOM 中,并且可见且可点击。text_to_be_present_in_element
:元素出现在 DOM 中,并且包含指定的文本。title_contains
:页面的标题包含指定的文本。title_is
:页面的标题等于指定的文本。
下面是使用 presence_of_element_located
和 visibility_of_element_located
的示例代码:
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("http://www.example.com")
# 等待元素出现在 DOM 中,但不一定可见
wait = WebDriverWait(driver, 10)
elem = wait.until(EC.presence_of_element_located((By.ID, "my-id")))
# 等待元素出现在 DOM 中,并且可见
elem = wait.until(EC.visibility_of_element_located((By.ID, "my-id")))
显示等待的注意事项
使用显示等待时,需要注意以下几点:
- 显示等待只对等待期间的代码有效,等待结束后的代码不受影响。
- 显示等待的等待时间应该尽量准确,过长或过短都会影响测试的效率和准确性。
- 显示等待可以设置多个条件,例如需要等待元素出现且可见,可以使用
visibility_of_element_located
方法。 - 显示等待可以结合使用多种定位方式,例如使用
By.ID
和By.CLASS_NAME
进行组合定位。
总结
Selenium 显示等待是一种更加精确的等待方式,能够提高测试的稳定性和可靠性。使用显示等待需要使用 WebDriverWait
类和 expected_conditions
模块,指定等待时间和等待条件,常用的等待条件包括 presence_of_element_located
和 visibility_of_element_located
。在使用显示等待时需要注意等待时间的准确性,以及多个条件的组合使用。
2、隐式等待
隐式等待是指在代码中设置全局的等待时间,对整个测试过程都有效。在隐式等待时间内,如果元素没出现,Selenium 会等待指定的时间后再次查找该元素,直到元素出现或超时。隐式等待可以减少代码量,但是可能会对测试效率产生影响。
隐式等待需要使用 implicitly_wait 方法来设置等待时间。示例代码如下:
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.example.com")
elem = driver.find_element_by_id("my-id")
上面的代码中,implicitly_wait 方法设置了全局等待时间为 10秒,如果在这个时间内元素未出现,Selenium 会等待指定的时间后再次查找该元素,直到找到该元素或超时。
隐式等待的注意事项
使用隐式等待时,需要注意以下几点:
- 隐式等待只对查找元素的代码有效,不对其他代码有效。
- 隐式等待的等待时间应该尽量准确,过长或过短都会影响测试的效率和准确性。
- 隐式等待会对整个测试过程都生效,可能会对测试效率产生影响。
- 隐式等待不能精确控制等待时间,如果需要更加精确地控制等待时间,应该使用显示等待。
隐式等待和显示等待的区别
隐式等待和显示等待都是 Selenium 中的等待方式,它们的区别如下:
- 隐式等待是全局的等待时间,对整个测试过程都有效,而显示等待是在代码中明确设置的等待时间,只对设置的代码段有效。
- 隐式等待只能等待元素是否出现,而显示等待可以指定多个条件,例如等待元素出现且可见。
- 隐式等待不能精确控制等待时间,只能设置一个全局等待时间,而显示等待可以更加精确地控制等待时间,提高测试的稳定性和可靠性。
总结
Selenium 隐式等待是一种全局的等待方式,可以通过 implicitly_wait
方法设置等待时间。使用隐式等待需要注意等待时间的准确性,以及可能会对测试效率产生影响。相比之下,显示等待更加精确,可以指定多个条件并控制等待时间,但需要在代码中明确设置等待时间。在实际测试中,应根据具体情况选择合适的等待方式。