Comment puis-je trouver un élément qui contient un texte spécifique dans Selenium Webdriver (Python)?

j'essaie de tester une interface javascript compliquée avec Selenium (en utilisant L'interface Python, et sur plusieurs navigateurs). J'ai un certain nombre de boutons de la forme:

<div>My Button</div>

j'aimerais pouvoir rechercher des boutons basés sur "mon bouton" (ou des correspondances partielles non sensibles à la casse telles que "mon bouton" ou "bouton")

je trouve cela étonnamment difficile, dans la mesure où j'ai l'impression de rater quelque chose d'évident. Le la meilleure chose que j'ai jusqu'à présent est:

driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]')

C'est la casse, cependant. L'autre chose que j'ai essayé est d'itérer à travers toutes les divs sur la page, et de vérifier l'élément.texte de la propriété. Cependant, chaque fois que vous obtenez une situation de la forme:

<div class="outer"><div class="inner">My Button</div></div>

div.outer a aussi "mon bouton" comme texte. Pour arranger ça, j'ai essayé de voir si div.outer est le parent de div.intérieure, mais ne pouvait pas comprendre comment le faire (élément.get_element_by_xpath('..') renvoie le parent d'un élément, mais les tests ne sont pas égaux à div.extérieur.) En outre, itérer tous les éléments sur la page semble être vraiment lent, au moins en utilisant le webdriver Chrome.

idées?

Edit: cette question Est sortie un peu vague. A demandé (et répondu) une version plus spécifique ici: Comment obtenir le texte d'un élément dans Selenium WebDriver (via l'api Python) sans inclure l'élément enfant texte?

158
demandé sur Community 2012-09-07 22:20:06

6 réponses

essayez ce qui suit:

driver.find_elements_by_xpath("//*[contains(text(), 'My Button')]")
200
répondu Ricky 2013-09-09 14:54:21

vous pourriez essayer un xpath comme:

'//div[contains(text(), "{0}") and @class="inner"]'.format(text)
21
répondu andrean 2012-09-07 18:44:23

vous pouvez également l'utiliser avec Page Object Pattern, E. g:

essayez ce code:

@FindBy(xpath = "//*[contains(text(), 'Best Choice')]")
WebElement buttonBestChoice;
7
répondu Krzysztof Walczewski 2017-08-28 22:14:17
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[contains(text(), 'YourTextHere')]")));
    assertNotNull(driver.findElement(By.xpath("//*[contains(text(), 'YourTextHere')]")));
    String yourButtonName=driver.findElement(By.xpath("//*[contains(text(), 'YourTextHere')]")).getAttribute("innerText");
    assertTrue(yourButtonName.equalsIgnoreCase("YourTextHere"));
2
répondu mike oganyan 2017-08-11 16:27:23

utiliser conducteur.find_elements_by_xpath et correspond à fonction de correspondance regex pour la recherche insensible à la casse de l'élément par son texte.

driver.find_elements_by_xpath("//*[matches(.,'My Button', 'i')]")
0
répondu Andriy Ivaneyko 2018-08-30 12:47:59

essayez ceci. Son très facile:

driver.getPageSource().contains("text to search");

cela a vraiment fonctionné pour moi dans le pilote de web de sélénium.

-16
répondu Amit 2014-02-07 15:11:27