11

webDriverWaitいくつかの要素の1つが表示されるのを待って、どの要素が表示されるかに基づいてそれに応じて動作するようにする方法はありますか?

現時点ではWebDriverWait、tryループ内で実行し、タイムアウト例外が発生した場合は、他の要素が表示されるのを待つ代替コードを実行します。これは不器用なようです。もっと良い方法はありますか?これが私の(不器用な)コードです:

try:
    self.waitForElement("//a[contains(text(), '%s')]" % mime)
    do stuff ....
except TimeoutException:
    self.waitForElement("//li[contains(text(), 'That file already exists')]")
    do other stuff ...

これには、ファイルがシステムにすでに存在するというメッセージが表示されるまで、10秒間待機する必要があります。

この関数は、次のようwaitForElementにいくつかの呼び出しを実行します。WebDriverWait

def waitForElement(self, xPathLocator, untilElementAppears=True):
    self.log.debug("Waiting for element located by:\n%s\nwhen untilElementAppears is set to %s" % (xPathLocator,untilElementAppears))
    if untilElementAppears:
        if xPathLocator.startswith("//title"):
            WebDriverWait(self.driver, 10).until(lambda driver : self.driver.find_element_by_xpath(xPathLocator))
        else:
            WebDriverWait(self.driver, 10).until(lambda driver : self.driver.find_element_by_xpath(xPathLocator).is_displayed())
    else:   
        WebDriverWait(self.driver, 10).until(lambda driver : len(self.driver.find_elements_by_xpath(xPathLocator))==0)

より効率的な方法でこれを達成するための提案がありますか?

4

2 に答える 2

9

識別子のマップをxpathクエリに取得し、一致した識別子を返す関数を作成します。

def wait_for_one(self, elements):
    self.waitForElement("|".join(elements.values())
    for (key, value) in elements.iteritems():
        try:
            self.driver.find_element_by_xpath(value)
        except NoSuchElementException:
            pass
        else:
            return key

def othermethod(self):

    found = self.wait_for_one({
        "mime": "//a[contains(text(), '%s')]",
        "exists_error": "//li[contains(text(), 'That file already exists')]"
    })

    if found == 'mime':
        do stuff ...
    elif found == 'exists_error':
        do other stuff ...
于 2012-07-26T23:00:15.543 に答える
1

そんな感じ:

def wait_for_one(self, xpath0, xpath1):
    self.waitForElement("%s|%s" % (xpath0, xpath1))
    return int(self.selenium.is_element_present(xpath1))
于 2012-07-22T09:26:32.563 に答える