In unserer Anwendung haben wir fast in jedem Bildschirm eine Schaltfläche mit dem Text 'Neu'.
<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>
Ich habe versucht, mit der folgenden Anweisung auf die Schaltfläche zu klicken:
driver.findElement(By.xpath("//button[[@type, 'submit'] and [text()='New']]")).click();
Aber das hat nicht funktioniert
org.openqa.Selenium.InvalidSelectorException: The given selector //button[[@type= 'submit'] and [text()='New']] is either invalid or does not result in a WebElement.
Derzeit verwende ich den folgenden Code, um auf die Schaltfläche zu klicken:
List<WebElement> allButt = driver.findElements(By.tagName("button"));
for (WebElement w : allButt)
{
if (w.getText().matches("New"))
{
w.click();
break;
}
}
Da habe ich fast 150 Knöpfe auf der Seite. Gibt es einen anderen Weg?
Ihre Xpath-Syntax ist falsch - Sie benötigen keine inneren eckigen Klammern - aber selbst wenn Sie dies korrigieren:
//button[@type, 'submit' and text()='New']
es wird nicht das auswählen, was Sie möchten. Das Problem ist, dass "Neu" kein Text ist, der direkt im Schaltflächenelement enthalten ist, sondern innerhalb eines untergeordneten Bereichselements liegt. Wenn Sie anstelle von text()
nur .
verwenden, können Sie den gesamten Zeichenfolgewert des Elements überprüfen (Verkettung aller untergeordneten Textknoten auf beliebiger Ebene).
//button[@type='submit' and contains(., 'New')]
Oder überprüfen Sie span
anstelle von text()
:
//button[@type='submit' and span='New']
(Senden Sie Schaltflächen, die einen Bereich enthalten, dessen Wert "Neu" ist)
Versuchen Sie stattdessen diesen xpath:
//button[@type='submit']/span[.='New']
Demo
http://www.xpathtester.com/xpath/ff393b48183ee3f373d4ca5f539bedf2
EDIT
Nach dem Kommentar von @Ian Roberts können Sie stattdessen den folgenden Xpath-Ausdruck verwenden, wenn das Klicken auf das Schaltflächenelement wichtig ist:
//button[@type='submit']/span[.='New']/..
Die sehr einfache Lösung für das oben genannte Problem ist die Verwendung von span mit Option enthält (text (), '').
Sie können den folgenden Xpath-Code verwenden
// span [enthält (Text (), 'Neu')]