【问题标题】:Python Selenium: waiting for one element OR another element to loadPython Selenium:等待一个元素或另一个元素加载
【发布时间】:2019-05-31 14:05:59
【问题描述】:

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

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

谢谢,

【问题讨论】:

    标签: python python-3.x selenium webdriverwait


    【解决方案1】:

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

    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 将两者结合起来。如果添加其他条件,则只会增加因子。

    【讨论】:

    • 谢谢!!我已经尝试了第一个并得到了:AttributeError: 'WebDriver' object has no attribute 'presence_of_element_located'
    • 有什么解决办法吗?
    • 我的坏,在移动设备上的胖手指(同样现在,手指交叉:)。问题是 presence_of_element_located()expected_conditions 中的一个类,而不是 webdriver 对象的方法(即 lambda 中的 x)。
    • 现在又发生了一个异常。执行后:browser.execute_script("return document.documentElement.outerHTML") 我得到: selenium.common.exceptions.WebDriverException: Message: unknown error: Cannot read property 'outerHTML' of null 当我试图获取 HTML 时,它似乎返回 null。
    • 我想我明白了,我在运行最后一个脚本之前放置了一个time.sleep(x)
    【解决方案2】:

    您可以使用expected_conditions 来做到这一点

    from selenium.webdriver.support import expected_conditions
    

    完整的解决方案可以在这里找到:Selenium Expected Conditions - possible to use 'or'?

    【讨论】:

    • 谢谢!我用 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();")
    【解决方案3】:

    我是使用 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();")
    

    【讨论】:

      猜你喜欢
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 2021-11-28
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 2014-05-07
      相关资源
      最近更新 更多