python - 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”。
谢谢,
解决方案
您可以将这两个检查组合在一个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 则将两者结合起来。如果添加其他条件,则只会增加因子。
推荐阅读
- c++ - 如何将 .CPP 文件转换为 .bin ?
- java - 无法恢复滚动位置
- vue.js - 如何从 Vuetify 插件中删除 stylush 并在 Vue Js 项目中添加 Vuetify SCSS
- sql - sql server中的唯一键约束,用于列中的新值
- guidewire - Guidewire - 无法将详细信息保存到实体
- jms - 使用 ReadyAPI 发送不带名称的 JMS 消息进行响应
- url - appmaker如何更改浏览器历史记录中的名称
- android - android - 未解决的参考:Espresso 中的所有方法
- javascript - Three.js 渲染画布的最大尺寸是多少?
- sbt - 如何按顺序使用带有多个模块的 sbt packageBin