5

アプリケーションでSelenium2.0別名WebDriverを使用してWebratを実行しています。

WebDriver はページのリロードを適切に処理し、ブラウザがページ全体をリロードしている場合は次のステップを開始しません。問題は、このメカニズムが Ajax リクエストで機能しないことです。click() または change() の後にいくつかある場合、WebDriver はアイドル状態になりません。

ページ上のすべての ajax リクエストが終了するまで webdriver をアイドル状態にする方法を提案できる人はいますか?

4

3 に答える 3

3

オプションのループで呼び出しをラップすることにより、このシナリオを処理するセレン上にレイヤーを作成することになりました。だからあなたがするとき:

@browser.click "#my_button_id"

AutomatedTesterが上記で提案したのと同様のことを行います。

class Browser
  def click(locator)
    wait_for_element(locator, :timeout => PAGE_EVENT_TIMEOUT)
    @selenium.click(locator)
  end

  def wait_for_element(locator, options)
    timeout = options[:timeout] || PAGE_LOAD_TIMEOUT
    selenium_locator = locator.clone
    expression = <<EOF 
      var element;
      try {
        element = selenium.browserbot.findElement('#{selenium_locator}');
      } catch(e) {
        element = null;
      };
      element != null;
EOF
    begin
      selenium.wait_for_condition(expression, timeout)
    rescue ::Selenium::SeleniumException
      raise "Couldn't find element with locator '#{locator}' on the page: #{$!}.\nThe locator passed to selenium was '#{selenium_locator}'"
    end
  end
end

ラッパーは、ボタン/入力ラベルによる検索など、他のことも行いました(したがって、ラッパーはタイミングの問題のためだけに存在するのではなく、これは私たちがそこに置いたものの1つにすぎませんでした)。

于 2010-09-09T15:36:58.347 に答える
1

Ruby さん、申し訳ありませんが、オブジェクトを見つけて、そこにない場合は、オブジェクトが戻ってくるのを待つ必要があります。以下のコードがすべきことは、ドライバーが ID を持つ要素を見つけることができるかどうかを確認するために毎秒ループを待機し、idOfElementそれができない場合はエラーをスローすることです。

assert !60.times{ break if (driver.find_element(:id, "idOfElement) rescue false); sleep 1 }
于 2010-02-03T11:31:29.280 に答える
0

待機のある要素をチェックする別の mtd (ラッパー) が役立つはずです。

于 2010-08-17T09:09:42.187 に答える