显示等待是指在代码中设置等待时间,在等待时间内轮询页面元素是否出现,直到元素出现或等待时间结束。显示等待可以更加精确地控制等待时间,提高测试的稳定性和可靠性。
显示等待需要使用 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(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。
"""
作用:每隔一段时间(上面的poll_frequency)调用method,直到返回值不为False或不为空
method:需要执行的method
message:抛出异常时的文案,会返回 TimeoutException ,表示超时
注意:这个才是常用的,如:定位元素直到不返回空
作用:调用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
模块提供了多种条件,用于指定要等待的元素。下面是一些常用的条件:
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
。在使用显示等待时需要注意等待时间的准确性,以及多个条件的组合使用。
隐式等待是指在代码中设置全局的等待时间,对整个测试过程都有效。在隐式等待时间内,如果元素没出现,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
方法设置等待时间。使用隐式等待需要注意等待时间的准确性,以及可能会对测试效率产生影响。相比之下,显示等待更加精确,可以指定多个条件并控制等待时间,但需要在代码中明确设置等待时间。在实际测试中,应根据具体情况选择合适的等待方式。