Python selenium:显式等待加载两个元素之一

时间:2014-12-22 15:54:16

标签: python selenium

有没有办法可以等待两个元素中的一个加载到selenium中。我使用明确的等待,到目前为止,还没有找到解决方案。

简单地做

WebDriverWait(driver,5).until(lambda driver : driver.find_element(By.ID,"a") or driver.find_element(By.ID,"b"))

似乎不起作用。它只是寻找id =“a”的元素。

谢谢!

2 个答案:

答案 0 :(得分:7)

如果找不到任何元素,

find_element会引发NoSuchElementException异常。

如果标识为a的元素不存在,driver.find_element(By.ID,"a")将引发异常,driver.find_element(By.ID,"b")将不会被执行。

解决问题的一种简单方法是使用find_elements返回空列表而不是引发异常:

WebDriverWait(driver,5).until(
    lambda driver: driver.find_elements(By.ID,"a") or driver.find_elements(By.ID,"b"))

答案 1 :(得分:2)

如果你的第一个find_element调用无法找到一个元素,那么explained如果是NoSuchElementException,则会引发WebDriverWait(driver, 5).until( lambda driver : driver.find_element_by_css_selector("#a, #b")) 并且测试的第二部分将无法执行。

我建议使用与您要查找的ID匹配的CSS选择器:

find_elements

这比执行两个find_elements调用有一个优势,因为这将使您的Selenium客户端(您的脚本)和Selenium服务器之间只进行一次往返。这应该总是比执行两个{{1}}调用更快。在本地执行测试时,差异不会太大,但如果您远程执行测试,例如使用Sauce Labs或浏览器堆栈,差异将会很大。