使用“OR”组合多个Selenium等待?

时间:2018-06-18 14:34:40

标签: python python-2.7 selenium selenium-webdriver selenium-chromedriver

我的selenium代码通过等待网站的标题进行更改来检查完成的子程序。代码如下所示:

waitUntilDone = WebDriverWait(session, 15).until(EC.title_contains(somestring))

但是,有时这可能会失败,因为手动网站访问后网站的目标网页会发生变化。服务器会记住你离开的地方。这迫使我检查一个替代条件(网站标题=“somestring2”。

这是我到目前为止所提出的(也是我能说的):

    try:
        waitUntilDone = WebDriverWait(session, 15).until(EC.title_contains(somestring)) # the old condition
    except:
        try:
            waitUntilDone = WebDriverWait(session, 15).until(EC.title_contains(somestring2)) # the new other condition which is also valid
        except:
            print "oh crap" # we should never reach this point

这些条件中的任何一个始终为真。我不知道你是哪一个。

有没有办法在这些等待中包含“OR”或使try / except块看起来更好?

1 个答案:

答案 0 :(得分:1)

看起来selenium会让你通过创建自己的类来实现这一点。在这里查看文档:{​​{3}}

以下是您案例的快速示例。请注意,关键是在类中使用名为__call__的方法来定义所需的检查。 Selenium将每隔500毫秒调用该函数,直到它返回True或某些非空值。

class title_is_either(object):

  def __init__(self, locator, string1, string2):
    self.locator = locator
    self.string1 = string1
    self.string2 = string2

  def __call__(self, driver):
    element = driver.find_element(*self.locator)   # Finding the referenced element
    title = element.text
    if self.string1 in title or self.string2 in title
        return element
    else:
        return False

# Wait until an element with id='ID-of-title' contains text from one of your two strings
somestring = "Title 1"
somestring2 = "Title 2"

wait = WebDriverWait(driver, 10)
element = wait.until(title_is_either((By.ID, 'ID-of-title'), somestring, somestring2))