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?
6 réponses
essayez ce qui suit:
driver.find_elements_by_xpath("//*[contains(text(), 'My Button')]")
vous pourriez essayer un xpath comme:
'//div[contains(text(), "{0}") and @class="inner"]'.format(text)
vous pouvez également l'utiliser avec Page Object Pattern, E. g:
essayez ce code:
@FindBy(xpath = "//*[contains(text(), 'Best Choice')]")
WebElement buttonBestChoice;
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"));
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')]")
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.