1

次を使用して、リスト内の 2 つの項目を見つけることができます。

br.span(:text, "Customer").click

しかし、他の人は私にSelenium::WebDriver::Error::ElementNotVisibleError. リスト内の一部のアイテムを選択でき、一部の Watir が表示されるのは少し奇妙に思えます。以下はhtmlです。Telecom Profile は選択できますが、Opportunity は選択できません。一方が見えるのにもう一方が見えない理由について何か考えはありますか?

<TD style="PADDING-BOTTOM: 3px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; PADDING-TOP: 3px" id=apy0m1i2ITD vAlign=center width="100%" noWrap align=left>
  <SPAN style="MARGIN: 0px 13px">Opportunity</SPAN>
</TD>
</TR></TBODY></TABLE></TD></TR>


<TD style="PADDING-BOTTOM: 3px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; PADDING-TOP: 3px" id=apy0m1i3ITD vAlign=center width="100%" noWrap align=left>
  <SPAN style="MARGIN: 0px 13px">Telecom Profile</SPAN>
</TD>
</TR></TBODY></TABLE></TD></TR>
4

2 に答える 2

1

要素が表示されていない場合、WebDriverは要素をクリックできません。

要素が表示される前にページが変更されていますか?もしそうなら、これを試してみてください:

br.wait_until { br.span(:text => 'Customer').visible? }
br.span(:text, "Customer").click
于 2013-02-20T22:22:36.240 に答える
0

まず、「リストから選択」と言いますが、表示する HTML には HTML select 要素はなく、テーブルと行だけです。だから、あなたの「リスト」コントロールは、jQueryまたは同様のライブラリからのある種のjavascriptアニメーションウィジェットだと思います。

それらの多くは、プルダウン メニューのように見えるものを構築しますが、そのようなものが表示されないようにクラスを設定します。プルダウンの上部で何か (クリックやマウスオーバーなど) を行うと、クラスが CSS によって表示されるクラスに変更されます。多くの場合、マウスがアイテムの上にあることによってトリガーされる疑似クラスと呼ばれるものを使用するため、メニューが表示されると、マウスがその上にある限り表示されたままになります。

これらの自動化は特に注意が必要です。これは、webdriver が実際のマウス ポインターを動かしてマウスオーバーまたはホバー イベントを作成しないためです。したがって、メニューの上部をクリックするなど、メニューを表示させるために何かを行うことができますが、ブラウザはマウスがその上にないことを非常に迅速に検出し、ブーム、再び非表示になります。

設計上、webdriver を使用してブラウザーを駆動するもの (watir-webdriver、Selenium、Capybara) のほとんどは、ユーザーの視点から「存在」していない (つまり、表示され、有効になっている) 要素をクリックしたり、操作したりしません。 . 通常はこれで問題ありませんが、ユーザーがクリックできなかった場合、なぜ自動化ツールがクリックできるようになるのでしょうか? これが「見えない」メッセージの原因である可能性があります。これは、Web ドライバーが「DOM でこれを見つけることができますが、ユーザーには表示されないため、クリックすることはできません。

私は通常、IRB からそのようなページのトラブルシューティングを行い、メニューが表示されると思われる watir-webdriver コマンドを実行し、続いて要素をクリックするコマンドを実行します。 .

たとえば、以前のアクションの結果として何かが見えるようになったり、存在するようになり、すぐにそれを操作したくない場合など、'when present' デコレータを使用する必要がある場合があります。

browser.span(:text => "Customer").when_present.click 

それは@TrinitronXの提案よりも少しエレガントですが、基本的に同じことです

ただし、実行中のコード行と次のコード行の間で要素が表示されたり消えたりすることが問題である場合、たとえば要素がすぐに消えてしまう場合、このアプローチは役に立ちません。

その場合、JavaScript を実行して要素のスタイルを変更し、要素を強制的に表示するなどの手段に頼らなければならない場合があります。または、要素で onclick イベントを手動で発生させてみて、JavaScript がクリックしたかのように応答するかどうかを確認することもできます。

サイト自体、または同じコントロールを持つサンプル サイトを見ないと、要素を操作するための最適なソリューションが何かを判断するのが難しい場合があります。

于 2013-02-26T21:34:03.927 に答える