0

Watir を使用した Ruby スクリプトで IMO の大きな遅延が発生します。問題の説明は次のとおりです。AJAX ベースのアプリケーションをテストしていますが、ページが読み込まれることを確認するためにスリープを使用しないようにしたかったのです。

class Page
  attr_accessor :expected_elements

  def loaded?
    # code to make sure AJAX page is loaded
  end
end

したがって、これの代わりに:

def loaded?
  # static delay sufficient to get page loaded
  sleep(MAX_PAGE_LOAD_TIME)
  true
end

私はこのようなものが欲しかった:

def loaded?
  Watir::Wait.until(MAX_PAGE_LOAD_TIME) do
    expected_elements.all? do |element|
      element.present?
    end
  end
end

問題は、ブロックの評価に時間がかかりすぎることです。存在を確認する要素が多いほど、この遅延は大きくなります。1回の反復でおおよそこの遅延が発生しました:

Firefox -> 130ms
IE -> 615ms
Chrome -> 115 ms

したがって、N 個の要素が存在するかどうかを確認するには、対応する遅延が N 回発生します...その結果、MAX_PAGE_LOAD_TIME が期限切れになっても、ブロック評価がまだ終了していないため、Watir::Wait::TimeoutError はスローされません...だから私は終了しました要素の存在をチェックすると、静的な遅延よりも長い遅延が発生する状況で、ページが読み込まれるのに十分な遅延が発生します.. xpath によって要素を見つけることでパフォーマンスを改善しようとしましたが、パフォーマンスの向上はそれほど大きくありませんでした..間違っている?現在の実行時間を短縮する方法はありますか? 方法??これらの遅延はあなたの経験に対応していますか? それとも高いですか?

ブラウザとサーバーの通信に問題があるかどうかを確認しましたが、遅延は非常に小さく、バックエンド DB 要求を含むサーバー応答には 100 ミリ秒の時間差がありました。もちろん、この応答に基づいてページをレンダリングするには時間がかかりますが、確かに数秒かかりません。

私の構成: - Win7 OS、 - Firefox 17.0.1 - IEDriverServer_x64_2.26.2 を使用する IE 8.0.7601.17514 - chromedriver_win_23.0.1240.0 を使用する Chrome 23.0.1271.97 m、 - Ruby 1.9.3p125、 - watir-webdriver (0.6.1)、 - セレンウェブドライバー (2.27.2)

ご協力ありがとうございました!

ディスカッションに基づいて、ベンチマーク コードのサンプルを投稿します。

Benchmark.bm do |x|
  x.report("text") do
    b.span(:text => "Search").present?
  end
end
Benchmark.bm do |x|
  x.report("xpath") do
    b.span(:xpath => "/html/body/div/div/div[2]/div[2]/div/div/div/div/div/div/div/div[2]/div/div/div[2]/div/div/div/div/div/div[2]/div/div/div/div/div/div/div/div[2]/div/div/div[2]/div/div/div/div/div/div[2]/div/div/div/div/div/span/span").present?
  end
end

        user     system      total        real
text   0.000000   0.000000   0.000000 (  0.140405)
xpath  0.000000   0.000000   0.000000 (  0.120005)

追加のベンチマーク結果:

container_xpath = "/html/body/div/div/div[2]/div[2]/div/div/div/div/div/div/div/div[2]/div/div/div[2]/div/div/div/div/div/div[2]/div/div/div/div/div/div/div/div/div/div/div/div/div/div/div[2]/div/div/div/div[2]/div/div/div"
Benchmark.bm do |x|
  x.report("cntnr") do
    @c = b.div(:xpath => container_xpath)
    @c.present?
  end
end
Benchmark.bm do |x|
  x.report("lb1") do
    @c.div(:xpath => "div[1]/div/div").present?
    #@c.div(:text => "Company:").present?
  end
end
Benchmark.bm do |x|
  x.report("lb2") do
    @c.div(:xpath => "div[3]/div/div").present?
    #@c.div(:text => "Contact person:").present?
  end
end
Benchmark.bm do |x|
  x.report("lb3") do
    @c.div(:xpath => "div[5]/div/div").present?
    #@c.div(:text => "Address:").present?
  end
end

そして結果は次のとおりです。

Results for container reference and relative xpath:
       user     system      total        real
cntnr  0.000000   0.000000   0.000000 (  0.156007)
lb1    0.000000   0.000000   0.000000 (  0.374417)
lb2    0.000000   0.000000   0.000000 (  0.358816)
lb3    0.000000   0.000000   0.000000 (  0.358816)

Results for container reference and div's text:
       user     system      total        real
cntnr  0.000000   0.000000   0.000000 (  0.140402)
lb1    0.000000   0.000000   0.000000 (  0.358807)
lb2    0.000000   0.000000   0.000000 (  0.358807)
lb3    0.000000   0.000000   0.000000 (  0.374407)

絶対 xpath が使用された場合:

container_xpath = "/html/body/div/div/div[2]/div[2]/div/div/div/div/div/div/div/div[2]/div/div/div[2]/div/div/div/div/div/div[2]/div/div/div/div/div/div/div/div/div/div/div/div/div/div/div[2]/div/div/div/div[2]/div/div/div"
Benchmark.bm do |x|
  x.report("cntnr") do
    @c = b.div(:xpath => container_xpath)
    @c.present?
  end
end

lb1_xpath = container_xpath + "/div[1]/div/div"
Benchmark.bm do |x|
  x.report("lb1_x") do
    b.div(:xpath => lb1_xpath).present?
  end
end

lb2_xpath = container_xpath + "/div[3]/div/div"
Benchmark.bm do |x|
  x.report("lb2_x") do
    b.div(:xpath => lb2_xpath).present?
  end
end

lb3_xpath = container_xpath + "/div[5]/div/div"
Benchmark.bm do |x|
  x.report("lb3_x") do
    b.div(:xpath => lb3_xpath).present?
  end
end

結果は次のとおりです。

       user     system      total        real
cntnr  0.000000   0.000000   0.000000 (  0.140404)
lb1_x  0.000000   0.000000   0.000000 (  0.124804)
lb2_x  0.000000   0.000000   0.000000 (  0.156005)
lb3_x  0.000000   0.000000   0.000000 (  0.140405)
4

1 に答える 1

1

さて、この答えはあなたのサイトがjqueryを使用していることを前提としています。そうでない場合は、使用中のライブラリを把握し、それに応じてメソッドを変更する必要があります...

Ajax 呼び出しが完了するのを待つメソッドを作成します...

def wait_for_ajax(timeout = 10)
  timeout.times do
    return true if browser.execute_script('return jQuery.active').to_i == 0
    sleep(1)
  end

  raise Watir::Wait::TimeoutError, "Timeout of #{timeout} seconds exceeded on waiting for Ajax."
end

テストするページを最初にロードするときに、そのメソッドを呼び出します。次に、予想される要素を反復処理して、それらが存在するかどうかを確認します (確認する Watir 要素の配列がある場合は、コードにあるように .all? ではなく、必ず .each を使用してください)。

于 2013-01-10T21:12:37.700 に答える