4

Cucumber (1.1.9) テストで watir-webdriver (0.5.3) を使用しています。<acronym>タグのテキスト値を確認しようとしています。<div>コードはレガシーで、またはタグに変更する計画がありますが、それまでの<span>間、対処する必要があります。私が最初に試みた:

@browser.acronym(:id => /expense_code(.*)/).text

次のエラーを受け取りました。

NoMethodError: undefined method `acronym' for #<Watir::Browser:0x33e9940>

タグ オブジェクトがどのように作成されているかを確認するために Watir コードを調べたところ、HTML5 仕様に基づいて動的に作成されているように見えますがelement.rb、仕様から作成されていないというコメントも見つかりました。 . とにかく、オブジェクトを継承して<span>オブジェクトと呼ぶ簡単な方法がわかりませんでした<acronym>。そこで、代替案を調べたところ、要素オブジェクトが見つかりました。

@browser.element(:id => /expense_code(.*)/).text

このコードは機能しますが、ページをトラバースするのに約 1 分かかります。タグIDは実際には動的に生成され、現在それらの値を把握する方法がないため、今のところ正規表現にこだわっています。これは、タグが実際にどのように見えるかです:

<acronym class="editable select fillwith:exp_codes default:E100"
title="Expense Code: Expenses" id="expense_code114_582_10777">
E100    </acronym>

テストのパフォーマンスを向上させる方法についてご意見をいただければ幸いです。

4

4 に答える 4

4

そのクラス名は予測可能ですか?セットパーツと検証しようとしているテキスト(上記の例でも同じ)からそれを構築して、そのように進めることができますか?

acronym = 'E100'
browser.element(:class, 'editable select fillwith:exp_codes default:#{acronym}'.text.should == acronym
于 2012-04-10T19:33:19.253 に答える
4

XPath を使用して要素を頭字語タグだけに制限すると、パフォーマンスが向上しますか?

@browser.element(:xpath, "//acronym[contains(@id, 'expense_code')]")

更新: Chuck が述べたように、CSS-Selector もオプションです。

@browser.element(:css => "acronym[id^=expense_code]")
于 2012-04-10T19:21:00.647 に答える
2

最近、ページ オブジェクトのカスタム ロケーター/コレクションを作成するために Watir 1.6.5 からロジックを盗んでいました。Watir-Webdriver で要素に tag_name() メソッドがあることに気づいたので、同じことを試してみようと思ったのですが、うまくいくようです。

したがって、次のようにして tag_name をロケーターとして使用できます。

@browser.element(:tag_name => 'acronym', :id => /expense_code(.*)/).text

ロケーターが実行される順序がわからないので、正規表現は高価なので、すべての頭字語要素を取得してから正しい ID を持つものを見つける方が速いかもしれません:

@browser.elements(:tag_name, 'acronym').find{ |acronym|
  acronym.id =~ /expense_code(.*)/ 
}.text

コードの見栄えが良くなると思いますが、残念ながら、それがより高速かどうかはわかりません。それぞれのパフォーマンスは、テスト対象の特定のページ レイアウトに依存すると推測しています。

于 2012-04-11T13:54:47.977 に答える
1

適切なエチケットがここにあるかどうかはわかりませんが、#watir IRC チャットで Chuck の返信と jarib からのフィードバックを使用して思いついた答えです。私のすべての例で、expense_code = 'E100'.

@browser.element(:tag_name => "acronym", 
                    :class => "default:#{expense_code}").text

上記のコードは非常に妥当な速度で動作し、xpath は必要ありません。以下のコードを短縮したものです。

@browser.element(:tag_name => "acronym", 
     :class => "editable select fillwith:exp_codes default:#{expense_code}").text

文字列全体を渡す必要がないことを学びました。スペースで区切られたクラス内のものはすべて、watir によって適切に処理されます。このxpathからそのコードを適応させました:

@browser.element(:xpath => "//acronym[contains(@class,
    \'editable select fillwith:exp_codes default:#{expense_code}\')]").text

上記のコードの落とし穴は、'正しく評価されるように、クラス値の周りをエスケープする必要がありました。

クラス(以下のコード)を検索するだけでは機能しませんでした。理由がわかりません。私は、それがリクエストでデータベースをドキドキさせたことに気付きました。それが何をしていたにせよ、ページはそれを気に入らなかった. 何度も試していたのは、そこに滑り込んだためwait_until_presentです。

@browser.element(:class, "editable select fillwith:exp_codes
    default:#{expense_code}").text

助けてくれてありがとう。:)

于 2012-04-11T19:30:59.620 に答える