Selenium等待出现2个条件中的任何一个

时间:2017-02-11 22:59:47

标签: python selenium

我在Python中有一个Selenium脚本。我尝试访问的网页将有两种可能的结果之一:

  1. 要么,它将没有所需的数据,在这种情况下,它将打印出某个文本(例如,“未找到数据”)
  2. 或者,它将拥有所需的数据并将其加载到我可以通过ID访问的元素中(例如,“dataID”)
  3. 我需要等待其中任何一个条件成立。如果满足任何这些条件,我将简单地提取页面源并退出。

    我可以单独等待以下条件:

    element1 = WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element((By.ID, "nodataID"), "data not found"))
    if element1:
        content = driver.page_source.encode('utf-8')
        driver.quit()
    
    element2 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "dataID")))
    if element2:
        content = driver.page_source.encode('utf-8')
        driver.quit()
    

    这意味着Selenium将首先等待网页是否没有所需的数据。在这种情况下,它将获取页面源并退出。但是如果不满足这个条件,那么它将继续等待另外10秒,看看是否满足第二个条件。

    这种方法的问题是我不确定第一个条件,如果是真的,将在10秒内得到满足。也就是说,我可能会等待10秒钟,如果第一个条件不满足,那么我将移动一个来寻找第二个条件。但情况可能是第一个条件实际上是真的,它在第11秒实现了。在这种情况下,我的脚本永远不会知道第一个条件已经实现。如果我切换两个等待语句的顺序,那么问题仍然存在,因为现在我仍然不确定等待新的第一个条件为真的多长时间。

    这种方法的另一个问题是,即使第二个条件在2-3秒内实际得到满足,它也会等待10秒钟以满足第一个条件。因此,当网页的第二个条件成立时,会浪费等待时间。

    所以,我需要能够写一个等待两个条件中的任何一个的等待。

    我回顾了其他几个Stackoverflow问题并尝试提出解决方案,但我无法解决。我尝试将2个条件与逗号(,)或||组合在一起或OR关键字。但这些都没有解决问题。

    有人可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

您可以使用CSS_SELECTOR or等待其中一个条件

WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#nodataID, #dataID")))
content = driver.page_source.encode('utf-8')
driver.quit()

您也不需要if element检查。如果预期条件失败,它将抛出TimeoutException