Python - Selenium - 对多个元素的隐式等待
目前,我在对元素进行任何操作之前,使用隐式等待来定位这些元素。下面是隐式等待的一个例子:
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就无法知道该等多久,因为它不知道你期望有多少个元素存在。
所以你需要使用显式等待来解决这个问题。
在这个显式等待中,你应该:
- 运行
find_elements_by_path
- 检查这一步的结果是否是一个包含你需要的元素数量的集合。如果这个数量和你预期的不一样,你可以让“等待者”快速失败,然后再试一次。
- 如果上面的条件成立,你可以结束你的“等待”,否则就让“等待者”再试一次。