web-dev-qa-db-fra.com

Xpath pour un bouton dont le texte est 'Nouveau'

Dans notre application, presque sur chaque écran, nous avons un bouton avec le texte 'Nouveau', Voici la source HTML pour l'un des boutons:

<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>

J'ai essayé d'utiliser la déclaration ci-dessous pour cliquer sur le bouton:

driver.findElement(By.xpath("//button[[@type, 'submit'] and [text()='New']]")).click();

Mais cela ne fonctionnait pas 

org.openqa.Selenium.InvalidSelectorException: The given selector //button[[@type= 'submit'] and [text()='New']] is either invalid or does not result in a WebElement.

Actuellement, j'utilise le code ci-dessous pour cliquer sur le bouton:

List<WebElement> allButt = driver.findElements(By.tagName("button"));
for (WebElement w : allButt)
{
    if (w.getText().matches("New"))
    {
        w.click();
        break;
    }
}

Comme j'ai presque 150 boutons dans la page. Y-a t'il une autre possibilité?

12
HemaSundar

La syntaxe de votre xpath est fausse - vous n'avez pas besoin du jeu de crochets interne - mais même si vous corrigez ceci:

//button[@type, 'submit' and text()='New']

il ne sélectionnera pas ce que vous voulez. Le problème est que le "Nouveau" n'est pas un texte contenu directement dans l'élément button, mais à l'intérieur d'un élément d'enfant. Si, au lieu de text(), vous utilisez simplement ., alors vous pouvez vérifier la valeur de chaîne entière de l'élément (la concaténation de tous les nœuds de texte descendants à n'importe quel niveau).

//button[@type='submit' and contains(., 'New')]

Ou cochez span au lieu de text():

//button[@type='submit' and span='New']

(boutons de soumission contenant une étendue dont la valeur est "Nouveau")

25
Ian Roberts

Essayez plutôt ce xpath:

//button[@type='submit']/span[.='New']

Démo

http://www.xpathtester.com/xpath/ff393b48183ee3f373d4ca5f539bedf2


MODIFIER

Suite aux commentaires de @Ian Roberts , vous pouvez utiliser l'expression xpath suivante si le clic sur l'élément button est important:

//button[@type='submit']/span[.='New']/..
2
Stephan

La solution très simple au problème ci-dessus consiste à utiliser span avec l'option contient (text (), '').

Vous pouvez utiliser le code xpath suivant

// span [contient (text (), 'New')]

1
Sharfi