11

私はこのxpathを持っています://*[@id="someId::button"]

それを押すと、値のドロップダウンリストが表示されます。

今、私はリスト内のすべての要素が次のようなIDを持っていることを知っています:

//*[@id="someId--popup::popupItemINDEX"]

、ここで、INDEXは、1からオプションの数までの数値です。

クリックしなければならない値も知っています。

1つの質問は、ドロップダウンを生成するボタンのIDを常に知っているので、再利用可能なメソッドを使用してドロップダウン内のすべての要素を取得できますか?(複数のドロップダウンを操作する必要があります)

私が考えた方法は次のとおりです。次のように、初期IDのルートを取得します。

//*[@id="someId 

次に残りを追加します:--popup::popupItem。また、インデックスを追加する必要があり、次のようにtryブロックを使用できると思いました(予想よりも大きいインデックスを指定した場合の例外を回避するため)。

 for(int index=1;index<someBiggerThanExpectedNumber;index++){
     try{
         WebElement aux= driver.findElement(By.xpath(builtString+index+"\"]"));
         if(aux.getText().equals(myDesiredValue))
             aux.click();
     }catch(Exception e){}
 }

私はwebdriverapiとjavaを使用していることに注意してください。

私が持っている最初の情報を踏まえて、これが機能するかどうか、そしてこれを行うためのより簡単な方法があるかどうかを知りたいです。

編集:私が提案した方法は機能しますが、より簡単な解決策として、受け入れられた答えを見る必要があります

4

3 に答える 3

12

経験則として、可能であれば、1つのクエリでより多くの要素を選択するようにしてください。多くの要素を1つずつ検索すると、非常に遅くなります。

私があなたのニーズをよく理解しているなら、これを行うための良い方法は

driver.findElement(By.id("someId::button")).click();
driver.findElement(By.xpath("//*[contains(@id, 'someId--popup::popupItem') " +
    "and text()='" + myDesiredValue + "']"))
    .click();

XPathの詳細については、仕様を参照してください。あなたががらくたをスキップすることができれば、それは驚くほど非常に良い読み物です!

これにより、IDに「someId--popup::popupItem」を含む目的の値に等しいテキストを持つ要素が検索されてクリックされます。

List<WebElement> list = driver.findElements(By.xpath("//*[contains(@id, 'someId--popup::popupItem')]"));

これにより、IDに「someId--popup::popupItem」を含むすべての要素が検索されます。次に、リストをトラバースして、目的の要素を探すことができます。

子供だけを検索findElement()するためにを呼び出すことができることをご存知ですか?WebElement-driver.findElement(By.id("someId")).findElements(By.className("clickable"))

基礎となるHTMLをのぞき見しなければ、最善のアプローチを提供することはできないと思いますが、頭の中にはいくつかあります。

于 2012-05-22T08:58:22.323 に答える
3

JavascriptExecutorを使用してみましたか?

あなたが少しのJavaScriptを書く気があるなら、これはjavaよりも簡単でしょう(私は思う)

必要なのは、JavaScriptでDOMサブツリーをクロールし、条件に一致するDOM要素のリストを返すことだけです。WebDriverはList<WebElement>、Javaの世界と同じように、これを喜んでマーシャリングします。

于 2012-05-22T08:58:13.323 に答える
1

ここで使用するより安全な方法は

int size=driver.findElements(By.xpath("//*[@id='someId::button']")).size();

Start using Index Now

String builtString="//*[@id='someId::button'][";

for(int index=1;index<=size();index++)
{

try
{

   WebElement aux= driver.findElement(By.xpath(builtString+index+"\"]"));

   if(aux.getText().equals(myDesiredValue))
             aux.click();

}
catch(Exception e){}

}

上記のファンダが機能しているかどうかを教えてください。

于 2014-04-09T09:10:31.673 に答える