首页 > 解决方案 > Python Selenium:等待一个元素或另一个元素加载

问题描述

我正在使用此代码等待元素加载:

browser = webdriver.Chrome(executable_path=chromedriver,options=ChromeOpts, desired_capabilities=captain) 
wait = WebDriverWait(browser, 5)
openbrowser = browser.get(url) 
wait.until(EC.presence_of_element_located((By.ID, 'h1')))
browser.execute_script("window.stop();")

但是,我真正需要的是等待一个元素或另一个元素。因此,例如,我可以等待“h1”或“rf-footer”。

谢谢,

标签: pythonpython-3.xseleniumwebdriverwait

解决方案


您可以将这两个检查组合在一个wait()操作中 - 通过使用 python 的 lambda 表达式,使用find_elements_*()粘合在一起的方法or

element = wait.until(lambda x: x.find_elements_by_id("id1") or x.find_elements_by_css_selector("#id2"))[0]

您甚至可以使用这种方法来获取首先匹配的元素 -[0]最后。
此解决方案有效,因为find_elements_*()返回所有匹配元素的列表,如果不存在则返回一个空元素(布尔值 false)。因此,如果第一次调用没有找到任何东西,则评估第二次;重复直到他们中的任何一个找到匹配项,或者时间用完。

这种方法的好处是wait.until()在两次通过之一后立即停止 - 例如速度。


与 try-catch 块相比 - 在其中,第一个条件必须失败(等待最多 X 秒,通常为 10 秒),甚至要检查第二个条件;因此,如果第一个为假,而第二个为真 - 运行时/等待将至少为 X 秒加上第二次检查所需的时间。
在最坏的情况下,当两者都为假时,您将等待 2X 次,而 X 则将两者结合起来。如果添加其他条件,则只会增加因子。


推荐阅读