web-dev-qa-db-fra.com

Sélénium et xPath - localiser un lien en contenant du texte

J'essaie d'utiliser xPath pour trouver un élément contenant un morceau de texte, mais je n'arrive pas à le faire fonctionner ....

WebElement searchItemByText = driver.findElement(By.xpath("//*[@id='popover-search']/div/div/ul/li[1]/a/span[contains(text()='Some text')]"));

Si je supprime le dernier bit avec la chose "contains", il localise mon élément span, mais je dois le sélectionner en fonction du contenu du texte. Ça ne va pas non plus être une correspondance parfaite de 'Certains textes', car il pourrait également contenir des chaînes tronquées.

Quelqu'un voit le problème?

18
joakimnorberg

Je pense que le problème est ici:

[contains(text()='Some text')]

Pour décomposer cela,

  1. Les [] Sont un conditionnel qui fonctionne sur chaque nœud individuel de cet ensemble de nœuds - chaque nœud d'intervalle dans votre cas. Il correspond si l'un des nœuds individuels sur lesquels il opère correspond aux conditions à l'intérieur des crochets.
  2. text() est un sélecteur qui correspond à tous les nœuds de texte qui sont des enfants du nœud de contexte - il renvoie un ensemble de nœuds.
  3. contains est une fonction qui opère sur une chaîne. S'il passe un ensemble de nœuds, l'ensemble de nœuds est converti en chaîne en renvoyant la valeur de chaîne du nœud dans l'ensemble de nœuds qui est le premier dans l'ordre du document .

Vous devriez essayer de changer cela en

[text()[contains(.,'Some text')]]

  1. Les [] Externes sont un conditionnel qui opère sur chaque nœud individuel de cet ensemble de nœuds text() est un sélecteur qui correspond à tous les nœuds de texte qui sont des enfants du nœud de contexte - il renvoie un ensemble de nœuds.

  2. Les [] Internes sont un conditionnel qui fonctionne sur chaque nœud de cet ensemble de nœuds.

  3. contains est une fonction qui opère sur une chaîne. Ici, il est passé un nœud de texte individuel (.).

42
dnlcrl

Utilisez ceci

//*[@id='popover-search']/div/div/ul/li[1]/a/span[contains(text(),'Some text')]

OR

//*[@id='popover-search']/div/div/ul/li[1]/a/span[contains(.,'Some text')]
13
UmarKashmiri
@FindBy(xpath = "//button[@class='btn btn-primary' and contains(text(), 'Submit')]") private WebElementFacade submitButton;

public void clickOnSubmitButton() {
    submitButton.click();
}   
3
jaxy