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)