webentwicklung-frage-antwort-db.com.de

Xpath für die Schaltfläche mit dem Text "Neu"

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?

12
HemaSundar

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)

25
Ian Roberts

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']/..
2
Stephan

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')]

1
Sharfi