Python 的 Selenium 中有哪些不同的等待方式?


在使用 Selenium 时,可能会出现浏览器页面加载完成后,网页元素以不同的时间间隔加载的情况。

这种情况会导致 Selenium 和页面上的网页元素之间出现同步问题。由于 DOM 中缺少该元素,因此无法识别元素。由于此原因,会抛出类似 ElementNotVisibleException 的异常。

Selenium 中的等待机制克服了这个问题,并在元素识别和对其执行操作之间设置了延迟。Selenium web driver 主要支持两种类型的等待:

  • 隐式等待

这是应用于页面上所有元素的全局等待。等待时间作为参数提供给方法。例如,如果等待时间为 5 秒,则在抛出超时异常之前,它将等待这段时间。

隐式等待是动态等待,这意味着如果元素在第三秒可用,那么我们将继续执行测试用例的下一步,而不是等待全部五秒。

隐式等待会通知 web driver 轮询特定时间段。一旦确定了这段时间,它将持续整个 driver 会话。隐式等待的默认时间为 0。

语法

driver.implicitly_wait(8)
  • 显式等待

显式等待并非应用于所有元素,而是应用于页面上的特定元素。它实际上是一个必须满足的条件,然后才能继续执行测试用例的下一步。

显式等待也是动态的,这意味着等待将持续到必要时为止。因此,如果等待时间为五秒,而我们的给定条件在第三秒满足,则无需在接下来的两秒钟内停止执行。

webdriverWait 类与 expected_conditions 一起用于创建显式等待。webdriverWait 类可以默认每 500 毫秒调用一次 ExpectedCondition,以检查条件是否满足。

语法

w = WebDriverWait(driver, 6)
w.until(expected_conditions.presence_of_element_located((By.CLASS_NA
ME, "Tutorialspoint")))

显式等待中常用的预期条件如下:

  • title_contains
  • visibility_of_element_located
  • presence_of_element_located
  • title_is
  • visibility_of
  • element_selection_state_to_be/
  • presence_of_all_elements_located
  • element_located_to_be_selected
  • alert_is_present
  • element_located_selection_state_to_be

示例

使用隐式等待的代码实现。

from selenium import webdriver
#browser exposes an executable file
#Through Selenium test we will invoke the executable file which will then
#invoke actual browser
driver = webdriver.Chrome(executable_path="C:\chromedriver.exe")
#setting implicit wait 10 seconds
driver.implicitly_wait(10)
# to maximize the browser window
driver.maximize_window()
#get method to launch the URL
driver.get("https://tutorialspoint.com/index.htm")
#to refresh the browser
driver.refresh()
# identifying the edit box with the help of id
driver.find_element_by_id("gsc-i-id1").send_keys("Selenium")
#to close the browser
driver.close()

示例

使用显式等待的代码实现。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
#browser exposes an executable file
#Through Selenium test we will invoke the executable file which will then
#invoke actual browser
driver = webdriver.Chrome(executable_path="C:\chromedriver.exe")
#setting implicit wait 10 seconds
driver.implicitly_wait(10)
# to maximize the browser window
driver.maximize_window()
driver.get("https://tutorialspoint.com/tutor_connect/index.php")
#to refresh the browser
driver.refresh()
# identifying the link with the help of link text locator
driver.find_element_by_link_text("Search Tutors").click()
w.(expected_conditions.presence_of_element_located((By.
CSS_SELECTOR, "input#txtFilterLocation")))
#to close the browser
driver.close()

更新于:2020年7月28日

412 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告