20

私は自分の予想される状態を書き込もうとしています。必要なもの... iframe があります。私もその中にイメージを持っています。画像の scr が変更されたときに処理を続行したい。私がしたこと:

class url_changed_condition(object):
    '''
    Checks whether url in iframe has changed or not
    '''
    def __init__(self, urls):
        self._current_url, self._new_url = urls

    def __call__(self, ignored):
        return self._current_url != self._new_url  

そして後で私が持っているコードで:

def process_image(self, locator, current_url):
    try:
        WebDriverWait(self.driver, 10).until(ec.presence_of_element_located((By.TAG_NAME, u"iframe")))
        iframe = self.driver.find_element(*locator)
        if iframe:
            print "Iframe found!"
        self.driver.switch_to_frame(iframe)
        WebDriverWait(self.driver, 10).until(ec.presence_of_element_located((By.XPATH, u"//div")))

        # WebDriverWait(self.driver, 10).until(
            # url_changed_condition(
                # (current_url, self.driver.find_element(By.XPATH, u"//a/img").get_attribute(u"src"))))

        img_url = self.driver.find_element(By.XPATH, u"//a/img").get_attribute(u"src")
        print img_url
        self.search_dict[self._search_item].append(img_url)
        self.driver.switch_to_default_content()
    except NoSuchElementException as NSE:
        print "iframe not found! {0}".format(NSE.msg)
    except:
        print "something went wrong"
        import traceback
        import sys
        type_, value_, trace_ = sys.exc_info()
        print type_, value_
        print traceback.format_tb(trace_)
    finally:
        return current_url  

このコードは機能しますが、同じ URL を複数回返します。問題は、コメントを外すurl_changed_conditionTimeoutException
(current_url, self.driver.find_element(By.XPATH, u"//a/img").get_attribute(u"src"))
その下の行が正常に機能することです...わかりません。

4

3 に答える 3

1

ドキュメントによると:

デフォルトでは、WebDriverWait は正常に戻るまで 500 ミリ秒ごとに ExpectedCondition を呼び出します。成功した戻り値は、ExpectedCondition の型であり、他のすべての ExpectedCondition 型のブール型の戻り値は true または null ではありません。

カスタム待機をコメントアウトすると、同じ URL が複数回取得されるという事実は、ヒントを与えるはずです。

URL は変更されないため、常に__call__()戻ってきます。Falseを返しているためFalse、ExpectedCondition が満たされることはなく、TimeoutException.

そのため、ExpectedCondition ロジックを再定義するか、別のケースをテストしてください。

于 2013-10-29T14:05:07.047 に答える