ほとんどすべての画面のアプリケーションには、「New」というテキストのボタンがあります。ボタンの1つのHTMLソースを次に示します。
<button id="defaultOverviewTable:j_id54" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only ui-state-hover" type="submit" name="defaultOverviewTable:j_id54" role="button" aria-disabled="false">
<span class="ui-button-text ui-c">New</span>
</button>
以下のステートメントを使用してボタンをクリックしてみました:
driver.findElement(By.xpath("//button[[@type, 'submit'] and [text()='New']]")).click();
しかし、これは機能していませんでした
org.openqa.Selenium.InvalidSelectorException: The given selector //button[[@type= 'submit'] and [text()='New']] is either invalid or does not result in a WebElement.
現在、以下のコードを使用してボタンをクリックしています:
List<WebElement> allButt = driver.findElements(By.tagName("button"));
for (WebElement w : allButt)
{
if (w.getText().matches("New"))
{
w.click();
break;
}
}
ページにはほぼ150個のボタンがあります。他の方法はありますか?
Xpath構文が間違っています-角括弧の内部セットは必要ありません-しかし、これを修正しても:
_//button[@type, 'submit' and text()='New']
_
希望するものは選択されません。問題は、「新規」がボタン要素に直接含まれるテキストではなく、子スパン要素内にあることです。 text()
の代わりに_.
_を使用する場合は、要素の文字列値全体(あらゆるレベルのすべての子孫テキストノードの連結)を確認できます。
_//button[@type='submit' and contains(., 'New')]
_
または、text()
の代わりにspan
を確認します。
_//button[@type='submit' and span='New']
_
(値が「新規」のスパンを含む送信ボタン)
代わりにこのxpathを試してください。
//button[@type='submit']/span[.='New']
デモ
http://www.xpathtester.com/xpath/ff393b48183ee3f373d4ca5f539bedf2
[〜#〜] edit [〜#〜]
@ Ian Roberts のコメントに従って、ボタン要素のクリックが重要な場合は、代わりに次のxpath式を使用できます。
//button[@type='submit']/span[.='New']/..
上記の問題に対する非常に簡単な解決策は、オプションcontains(text()、 '')でspanを使用することです。
次のxpathコードを使用できます
// span [contains(text()、 'New')]