25

次のように、Python API で Selenium 2 / WebDriver を使用しています。

from selenium.webdriver.support import expected_conditions as EC

# code that causes an ajax query to be run

WebDriverWait(driver, 10).until( EC.presence_of_element_located( \
    (By.CSS_SELECTOR, "div.some_result")));

結果が返されるdiv.some_result( ) 、または「見つかりません」という文字列が返されるのを待ちたいと思います。それは可能ですか?すこし:

WebDriverWait(driver, 10).until( \
    EC.presence_of_element_located( \
         (By.CSS_SELECTOR, "div.some_result")) \
    or 
    EC.presence_of_element_located( \
         (By.CSS_SELECTOR, "div.no_result")) \
);

CSS セレクター ( ) を使用してこれを実行できることはわかっていますdiv.no_result, div.some_resultが、Selenium の予期される条件メソッドを使用してそれを実行する方法はありますか?

4

3 に答える 3

25

私はこのようにしました:

class AnyEc:
    """ Use with WebDriverWait to combine expected_conditions
        in an OR.
    """
    def __init__(self, *args):
        self.ecs = args
    def __call__(self, driver):
        for fn in self.ecs:
            try:
                res = fn(driver)
                if res:
                    return True
                    # Or return res if you need the element found
            except:
                pass

次に、次のように呼び出します...

from selenium.webdriver.support import expected_conditions as EC
# ...
WebDriverWait(driver, 10).until( AnyEc(
    EC.presence_of_element_located(
         (By.CSS_SELECTOR, "div.some_result")),
    EC.presence_of_element_located(
         (By.CSS_SELECTOR, "div.no_result")) ))

明らかに、AllEcクラスも同様に実装するのは簡単です。

注意 try:ブロックがおかしい。一部の EC は true/false を返し、他の ECNoSuchElementExceptionは False をスローするため、混乱しました。例外は WebDriverWait によってキャッチされるため、最初に例外をスローしたものが AnyEc が次のテストに進まなかったことを意味するため、私の AnyEc は奇妙な結果を生成していました。

于 2013-05-09T14:32:59.867 に答える