【问题标题】:Selenium wait until one of the two elements is present硒等到两个元素之一出现
【发布时间】:2016-06-19 04:32:18
【问题描述】:

很多时候我希望 webdriver 等待两个元素之一的存在。通常,当我期望页面在某些情况下显示元素 1 或元素 2 时,就会发生这种情况。目前我正在使用两个等待顺序执行此操作,但它效率低下,因为我需要等待 2 次。有什么办法可以将这两种等待合二为一吗?换句话说,我想等到 element1 或 element2 出现。

try: 
  element = WebDriverWait(self.browser, 15).until(EC.presence_of_element_located((By.ID, "elem1")))
  element.click()
  return "elem1"
except: 
  print "failed to find elem1"

try: 
  element = WebDriverWait(self.browser, 5).until(EC.presence_of_element_located((By.ID, "elem2")))  
  return "elem2"    
except:
  print "sth wrong!"
  raise  Exception("Sth Wrong!") 

return "Should not get here"      

【问题讨论】:

    标签: selenium selenium-webdriver


    【解决方案1】:

    你可以做一个 OR

    driverWait.until(ExpectedConditions.or(
        ExpectedConditions.presenceOfElementLocated(By.cssSelector("div.something")),
        ExpectedConditions.presenceOfElementLocated(By.cssSelector("div.anything"))));
    

    【讨论】:

    • 试过了,or 出现语法错误,会不会没有or 方法
    【解决方案2】:

    你可以使用 lambda

    WebDriverWait(driver,15).until(
        lambda driver: driver.find_elements(By.ID,"Id1") or driver.find_elements(By.ID,"Id2"))
    

    【讨论】:

    • 如果您还使用implicitly_wait(n),请小心。每个 lambdas 在返回之前将花费 n 秒。所以,如果你调用了implicitly_wait(15),然后又尝试了WebDriverWait(driver,15).until(),那么只会检查第一个lambda。
    【解决方案3】:

    未测试,但您可以尝试类似

    element = WebDriverWait(self.browser, 15).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#elem1, #elem2")))
    

    选择器中的逗号是OR

    【讨论】:

    • 这是正确答案!它很简单,而且很有效。
    【解决方案4】:

    这是我在使用其他解决方案时遇到问题时的替代解决方案。

    例如,如果我们只有 2 个条件,并且第 1 个条件永远不会满足,而第 2 个条件已经满足。然后其他解决方案阻塞直到wait_delay 结束,然后返回结果;而以下解决方案跳过它:

    WebDriverWait(driver, wait_delay).until(
      wait_for_any([
        EC.presence_of_element_located(locator)
        for locator in locators
    ]))
    

    在哪里

    class wait_for_any:
        def __init__(self, methods):
            self.methods = methods
    
        def __call__(self, driver):
            for method in self.methods:
                try:
                    if method(driver):
                        return True
                except Exception:
                    pass
                
            return False
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 2021-05-20
      • 2018-01-12
      相关资源
      最近更新 更多