在Web自动化测试中,等待是至关重要的一环,而Selenium提供了丰富的等待设置来确保测试脚本的可靠性和稳定性。本文将深入研究Python Selenium中常用的必备等待设置,包括显式等待、隐式等待、自定义等待条件等多个方面。通过详实的示例代码,将为大家提供全面而深入的学习体验。
显式等待是在特定条件下等待某个元素的出现或者消失。以下是一个等待元素可点击的示例:
from?selenium.webdriver.common.by?import?By
from?selenium.webdriver.support.ui?import?WebDriverWait
from?selenium.webdriver.support?import?expected_conditions?as?EC
#?显式等待
element?=?WebDriverWait(driver,?10).until(
????EC.element_to_be_clickable((By.ID,?'example_id'))
)
element.click()
隐式等待是在整个会话中等待元素出现的最长时间。设置一次即可,全局生效:
from?selenium?import?webdriver
#?隐式等待
driver?=?webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('https://example.com')
element?=?driver.find_element(By.ID,?'example_id')
有时候我们需要根据自定义的条件等待,可以使用expected_conditions
中的expected_conditions
类:
from?selenium.webdriver.support.ui?import?WebDriverWait
from?selenium.webdriver.support?import?expected_conditions?as?EC
#?自定义等待条件
class?ElementHasText:
????def?__init__(self,?locator,?text_):
????????self.locator?=?locator
????????self.text?=?text_
????def?__call__(self,?driver):
????????element_text?=?EC._find_element(driver,?self.locator).text
????????return?self.text?in?element_text
element_locator?=?(By.ID,?'example_id')
wait?=?WebDriverWait(driver,?10)
wait.until(ElementHasText(element_locator,?'Expected?Text'))
有时我们需要等待多个条件同时满足,可以使用expected_conditions
中的and_
或or_
:
from?selenium.webdriver.support.ui?import?WebDriverWait
from?selenium.webdriver.support?import?expected_conditions?as?EC
#?多重等待条件
element_locator?=?(By.ID,?'example_id')
wait?=?WebDriverWait(driver,?10)
wait.until(EC.and_(
????EC.element_to_be_clickable(element_locator),
????EC.visibility_of_element_located(element_locator)
))
在Web自动化测试中,页面的加载状态是一个关键考量因素。Selenium提供了expected_conditions
中的document_to_be_ready_state
来等待页面加载完成:
from?selenium.webdriver.support.ui?import?WebDriverWait
from?selenium.webdriver.support?import?expected_conditions?as?EC
#?页面加载状态的等待
wait?=?WebDriverWait(driver,?10)
wait.until(EC.document_to_be_ready_state('complete'))
除了常规的元素等待,有时还需要等待元素的出现或者可见性。以下是一个等待元素存在并可见的示例:
from?selenium.webdriver.support.ui?import?WebDriverWait
from?selenium.webdriver.support?import?expected_conditions?as?EC
#?元素存在与可见性等待
element_locator?=?(By.ID,?'example_id')
wait?=?WebDriverWait(driver,?10)
element?=?wait.until(EC.visibility_of_element_located(element_locator))
Fluent等待允许在等待期间设置轮询条件,增加了等待的灵活性。以下是一个Fluent等待的示例:
from?selenium.webdriver.common.by?import?By
from?selenium.webdriver.support.ui?import?WebDriverWait
from?selenium.webdriver.support.ui?import?FluentWait
from?selenium.webdriver.support?import?expected_conditions?as?EC
from?selenium.common.exceptions?import?TimeoutException
#?Fluent等待
wait?=?WebDriverWait(driver,?10)
element?=?FluentWait(driver,?timeout=10,?poll_frequency=1,?ignored_exceptions=[TimeoutException])?\
????.until(lambda?x:?x.find_element(By.ID,?'example_id'))
对于异步JavaScript加载的元素,可以使用expected_conditions
中的invisibility_of_element_located
来等待其加载完成:
from?selenium.webdriver.support.ui?import?WebDriverWait
from?selenium.webdriver.support?import?expected_conditions?as?EC
#?异步JavaScript加载的等待
element_locator?=?(By.ID,?'async_element')
wait?=?WebDriverWait(driver,?10)
wait.until(EC.invisibility_of_element_located(element_locator))
在本篇文章中,全面深入地探讨了Python Selenium中常用的必备等待设置,旨在为Web自动化测试提供更为全面和深入的学习体验。通过详实的示例代码,深入介绍了显式等待、隐式等待、自定义等待条件、多重等待条件、页面加载状态的等待、元素存在与可见性等待、Fluent等待以及异步JavaScript加载的等待。这些等待设置不仅仅是简单的时间延迟,更是在确保脚本执行的可靠性和稳定性方面的必备工具。
通过显式等待,能够精确等待某个特定条件的出现或消失,提高了脚本的精准性。隐式等待为整个会话提供了最长等待时间,全局有效,确保了在查找元素时的超时容忍度。自定义等待条件和多重等待条件则进一步增强了等待的灵活性,适应了更多复杂的测试场景。还深入研究了页面加载状态的等待,元素存在与可见性等待,Fluent等待以及异步JavaScript加载的等待,涵盖了更广泛的测试需求。这些等待设置的巧妙应用,可以在处理异步加载、提高页面加载的稳定性等方面展现出强大的效果。
总体而言,本文为大家提供一个全方位的学习路径,使其能够更好地理解和运用Python Selenium中各种等待设置。