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é?
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")
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']/..
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')]