3

次で指定された要素を選択しようとしています:

/html/body[@id='someid']/form[@id='formid']/div[@id='someid2']/div[@id='']/div[@id='']/div[@id='']/table/tbody[@id='tableid']/tr[7]/td[2]

今、私が選択しようとしているその行のhtmlは次のようになります:

<tr>
<td class="someClass">some text</td>
<td class="someClass2">my required text for verifying</td>
</tr>

検証に必要なテキストがページに存在するかどうかを確認する必要があります。

  1. 使っselenium.isTextPresent("my required text for verifying");たけど動かない

  2. だから今私は試してみましたselenium.isElementPresent("//td[contains(text(),'my required text for verifying')]")
    これは時々動作しますが、時折ランダムな失敗を与えます.

  3. あまりにも試してみましselenium.isElementPresent(//*[contains(text(),'my required text for verifying')])た..

セレンを使用してページ上のこのテキストを確認するにはどうすればよいですか?

問題は、ページの読み込みに時間がかかることではありません。障害が発生する前にスクリーンショットを撮ったところ、ページが完全に読み込まれていることがわかったので、問題はありません。

誰かがこの要素を選択する方法、または画面上のこのテキストを検証する方法を提案してもらえますか?

4

2 に答える 2

4

CSS で検索してみてください:

assertText(selenium.getText("css=.someClass2"), "my required text for verifying");

上記は isElementPresent よりも優れた失敗メッセージを表示するはずですが、CSS ロケーターでそれを使用することもできます。

assertTrue(selenium.isElementPresent("css=.someClass2"));

ロード時間に問題がある場合は、要素が存在するのを待つことができます:

selenium.waitForCondition("var value = selenium.isElementPresent('css=.someClass2'); value == true", "60000");

CSS ロケーターを使用したくない場合は、他の XPath ロケーターを使用すると便利です。

  • //td[contains(@class, 'someClass2')
  • xpath=id('tableid')/tr[7]/td[2]
  • xpath=id('tableid')/descendant::td[contains(@class, 'someClass2')][7]
于 2009-09-23T08:43:48.600 に答える
1

セレンのことは聞いたことがありません。しかし、最初の XPath は不必要に脆弱で冗長です。

要素に ID がある場合、それは一意です。特定の要素を選択するためだけにこのような長い XPath を使用する必要はありません。IDを持つ最後の要素を選択するだけです。さらに、あなたが時々選択していることがわかります.id属性のないxyz[@id='']要素を選択しようとしている場合は、代わりに「xyz[not(@id)]」を実行できます。

最初の XPath が基本的に正しいと仮定すると、次のようにするだけで十分です。

//tbody[@id='tableid']/tr[7]/td[2]

ただし、そのような特定の行と列の番号を使用すると、何らかの形で html の詳細が変更された場合に問題が発生します。また、要素に id を持つことは一般tbody的ではありません。おそらく、table要素に id がありますか?

最後に、スペースの正規化の問題が発生している可能性があります。xml では、複数の連続したスペースは 1 つのスペースと同等であると見なされることが多く、それを考慮していません。特に、xhtml がきれいに印刷されていて、必要なテキストの途中に改行が含まれている場合、それは機能しません。

//td[contains(normalize-space(text()),'my required text for verifying')]

最後に、text()テキスト ノードを明示的に選択 します。したがって、上記の xpath は、テキストが td の直接の子ではない要素 (例: ) を選択しません。一致しません。おそらく、すべての子孫の連結されたテキスト値を検索するつもりです。<td><b>my required text for verifying</b></td>

//td[contains(normalize-space(string(.)),'my required text for verifying')]

最後に、型変換は XPath で暗黙的に行うstring(.)ことができるため、上記で置き換えることができ.、バージョンにつながります。

//td[contains(normalize-space(.),'my required text for verifying')]

tdスペースを正規化し、各要素の文字列検索を実行する必要があるため、これは大きなドキュメントでは遅くなる可能性があります。パフォーマンスの問題が発生した場合は、どの要素を検査する必要があるかをより具体的にするようにtdしてください。または、テキストが発生する場所が気にならない場合は、全体を正規化して正規化スペースへの「呼び出し」の数を減らすようにしてください。一度にドキュメントを作成します (例: 経由/*[contains(normalize-space(.),'my required text for verifying')])。

于 2009-09-23T08:30:21.677 に答える