Python Selenium:等待一个元素或另一个元素加载

3

我正在使用以下代码来等待元素加载:

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'。

谢谢。

3个回答

3

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

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块相比 - 在try-catch块中,第一个条件必须失败(等待最长X秒,通常为10秒),才会检查第二个条件;因此,如果第一个条件为假,而第二个条件为真 - 运行时/等待时间将至少为X秒加上第二个检查所需的任何时间。
在最坏的情况下,当两者都为false时,您需要等待2X时间,而使用两者结合只需要X时间。如果添加其他条件,则只会增加该因素。


谢谢!我尝试了第一个,但是出现了以下错误: AttributeError: 'WebDriver'对象没有'presence_of_element_located'属性 - rafasalo
有解决它的任何想法吗? - rafasalo
1
我想我明白了,我在运行最后一个脚本之前加了一个 time.sleep(x) - rafasalo
1
expected_conditions 部分是不正确的,因为 ec.presence_of_element_located 返回一个对象,因此使用 or 运算符将始终返回 or 之前的部分,但 or 之后的部分永远不会被执行。 - Jakub Bláha
1
@JakubBláha 您是正确的,那样做行不通 - 但原因不同。当元素不存在时,第一个 presence_of_element_located() 不会返回对象,而是会引发异常 - 这个异常被 wait.until() 捕获,然后循环重复执行。因此,第二个 presence_of_element_located() 实际上永远不会被执行 - 这就是您正确的部分。我将编辑答案,只保留 find_elements*() - 如果没有找到,它们将始终返回空列表(布尔值为假)。 - Todor Minakov
显示剩余5条评论

0

谢谢!我使用TRY/EXCEPT解决了它。 openbrowser = browser.get(url) #导航到页面 try: wait.until(EC.presence_of_element_located((By.ID, id_stop))) except: wait.until(EC.presence_of_element_located((By.ID, 'rf-footer'))) browser.execute_script("window.stop();") - rafasalo

-1
我通过使用TRY/EXCEPT得到了它。
openbrowser = browser.get(url) #navigate to the page 
try: 
   wait.until(EC.presence_of_element_located((By.ID, id_stop))) 
except: 
   wait.until(EC.presence_of_element_located((By.ID, 'rf-footer')))
browser.execute_script("window.stop();")

这样做的问题是它会等待一个条件来寻找另一个条件。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接