3

下線が引かれているページのリンクを検索/選択しようとしていますが、他のリンクはそうではありません。ソースは次のようなものです。

<a href="someurl1">
<b>
<u>Some ulined text</u>
</b>
<u></u>
</a>
<br>
<a href="someurl2">Other link text</a>
<br>
<a href="someurl3">Another Link text</a>
<br>

私は次のようなことを試みました

link = browser.link(:u?, true)
link.exists?

次のエラーが発生します

TypeError: expected one of [String, Regexp], got true:TrueClass
    from /usr/lib/ruby/gems/1.8/gems/watir-webdriver-0.2.4/lib/watir-webdriver/locators/element_locator.rb:152:in `check_type'
    from /usr/lib/ruby/gems/1.8/gems/watir-webdriver-0.2.4/lib/watir-webdriver/locators/element_locator.rb:189:in `normalized_selector'
    from /usr/lib/ruby/gems/1.8/gems/watir-webdriver-0.2.4/lib/watir-webdriver/locators/element_locator.rb:188:in `each'
    from /usr/lib/ruby/gems/1.8/gems/watir-webdriver-0.2.4/lib/watir-webdriver/locators/element_locator.rb:188:in `normalized_selector'
    from /usr/lib/ruby/gems/1.8/gems/watir-webdriver-0.2.4/lib/watir-webdriver/locators/element_locator.rb:76:in `find_first_by_multiple'
    from /usr/lib/ruby/gems/1.8/gems/watir-webdriver-0.2.4/lib/watir-webdriver/locators/element_locator.rb:33:in `locate'
    from /usr/lib/ruby/gems/1.8/gems/watir-webdriver-0.2.4/lib/watir-webdriver/elements/element.rb:260:in `locate'
    from /usr/lib/ruby/gems/1.8/gems/watir-webdriver-0.2.4/lib/watir-webdriver/elements/element.rb:247:in `assert_exists'
    from /usr/lib/ruby/gems/1.8/gems/watir-webdriver-0.2.4/lib/watir-webdriver/elements/element.rb:31:in `exist?'

編集:だから私は実際にこれをテストではなくスクリーンスクレイピングに使用しています。これは、CSSやその他の優れたプラクティスがテストに意味を持ち、HTMLの開発とテストが密接に関連しているため、watirがこれを直接サポートしない理由を説明している可能性があります。スクレイピングの観点から見ると、テキストの書式設定はユーザーに表示されるものであり、下線付きの太字のリンクなどを検索することはスクレイピングに意味があります。

4

3 に答える 3

1

テストケースでそのような属性が使用されているのを見たことがありません。また、コードのサポートも見ていません。あなたはあなた自身を転がさなければならないかもしれません。これはZeljkoから借りた例です

def hasUnderlined(browser)
  s = false
  browser.links.each do |l| 
    if l.html.downcase.match /\<u\>*\<\/u\>/
      s = true
    end
  end
end

def getUnderlined(browser)
  browser.links.each do |l| 
    if l.html.downcase.match /\<u\>*\<\/u\>/
      return l
    end
  end
end
于 2011-06-12T15:07:15.770 に答える
1

アンダースコアはリンクタグの属性ではなく、リンク内のテキストだけに対応するフォーマットタグであるため、必要なことを直接行うことはできないと思います。

ただし、最近のWebページでは、CSSとクラス名などの属性の組み合わせによってフォーマットが制御されることがよくあります。これは、リンクを識別するときに指定できるものです。したがって、ここでの最善の策は、開発者とサイトのコーディング方法について少し話し合い、下線が引かれているリンクを制御するための少し新しい手法を使用して、コードのテスト容易性を向上させる可能性があるかどうかを確認することです。たとえば、CSSを使用し、クラス名に下線を付けます。(HTMLに直接埋め込むのではなく、CSSを使用してフォーマットを制御する理由は他にもたくさんありますが、いわばhtml-banana-boatを使い始めたばかりでない限り、CSSを使用する理由を教える必要はありません。良いことです)

これにより、CSSにテキストに下線を付けるために使用されていたクラス属性に従ってリンクを検索できます。

開発者がコードをよりテストしやすくするためのそのようなアプローチを受け入れていない場合、唯一の選択肢は、このための独自のルビーコードを作成し、水のコピーを変更することだと思います(@Daveの回答を参照)。 watirなどを更新するときはいつでも、そのカスタムパッチを維持する準備をしてください。

于 2011-06-13T06:38:30.690 に答える
0

それで、あなたがリンクについて知っている唯一のことは、それが下線が引かれているということですか?

私はこれでうまくいくと思いました(最新のwatir-webdriver gemを使用):

browser.link.u.click

しかし、私はこれを手に入れました:

NoMethodError: undefined method `u' for #<Watir::Anchor:0x00000100cbb3c0>

Jari(watir-webdriver開発者)は、uタグがHTML仕様に含まれていないと考えていると述べました。

ちなみに、これは機能します:

browser.link.b.click

Jariはxpathを試すことを提案しましたが、cssセレクターの方が読みやすいと思いました。ここにあります:

browser.element(:css => "a b u").click
于 2011-06-24T15:38:57.200 に答える