Python - Selenium - 对多个元素的隐式等待

8 投票
2 回答
13017 浏览
提问于 2025-04-18 00:18

目前,我在对元素进行任何操作之前,使用隐式等待来定位这些元素。下面是隐式等待的一个例子:

WebDriverWait(browser,10).until(EC.presence_of_element_located(By.XPATH(('xpath')))

当处理单个元素时,这种方法很好用。但是,如果 xpath 关联到多个元素,那么 EC.presence_of_element_located() 就会超时。我想知道,如何对多个元素进行隐式等待呢?

说明:

单个元素 -

WebDriverWait(browser,10).until(EC.presence_of_element_located(By.XPATH(('xpath')))
browser.find_element_by_xpath('xpath')

多个元素 -

??
browser.find_elements_by_xpath('xpath')

注意:在处理多个元素时,使用了 find_elements_by_xpath(),而不是 find_element_by_xpath()

2 个回答

21

我虽然晚了两年,但还是想发这个,希望有其他人像我一样在网上搜索时能看到。你可以使用

WebDriverWait(browser, 10).until(
    EC.presence_of_all_elements_located((By.XPATH, 'xpath'))
)

这样就能返回所有相关的东西。你不需要在你的显式等待后再做

browser.find_element_by_xpath('xpath')

因为 WebDriverWait(browser,10).until(...) 会返回你所等待的元素。

7

这里的问题是,当只处理一个元素时,事情会简单很多。它只需要等到你的定位器返回一个或多个元素。

但是,当你处理多个元素时,WebDriver就无法知道该等多久,因为它不知道你期望有多少个元素存在。

所以你需要使用显式等待来解决这个问题。

在这个显式等待中,你应该:

  1. 运行 find_elements_by_path
  2. 检查这一步的结果是否是一个包含你需要的元素数量的集合。如果这个数量和你预期的不一样,你可以让“等待者”快速失败,然后再试一次。
  3. 如果上面的条件成立,你可以结束你的“等待”,否则就让“等待者”再试一次。

http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

撰写回答