J'essaie de sélectionner un élément qui inclut une ancre, mais le texte est enfoui dans un paragraphe à l'intérieur d'un div. Voici le code HTML avec lequel je travaille:
<a class="item" ng-href="#/catalog/90d9650a36988e5d0136988f03ab000f/category/DATABASE_SERVERS/service/90cefc7a42b3d4df0142b52466810026" href="#/catalog/90d9650a36988e5d0136988f03ab000f/category/DATABASE_SERVERS/service/90cefc7a42b3d4df0142b52466810026">
<div class="col-lg-2 col-sm-3 col-xs-4 item-list-image">
<img ng-src="csa/images/library/Service_Design.png" src="csa/images/library/Service_Design.png">
</div>
<div class="col-lg-8 col-sm-9 col-xs-8">
<div class="col-xs-12">
<p>
<strong class="ng-binding">Smoke Sequential</strong>
</p>
Le code que j'utilise pour tenter de l'accrocher vise le texte "Fumée séquentielle" avec:
driver.findElement(By.linkText(service)).click();
Où la variable 'service' contient "Fumée séquentielle". Quand je le lance, j'obtiens l'erreur suivante:
org.openqa.Selenium.NoSuchElementException: Unable to locate element: {"method":"link text","selector":"Smoke Sequential"}
Toute aide serait grandement appréciée.
Le problème pourrait être dans le reste du code HTML, la partie que vous n'avez pas postée.
Avec cet exemple (je viens de fermer les balises ouvertes):
<a class="item" ng-href="#/catalog/90d9650a36988e5d0136988f03ab000f/category/DATABASE_SERVERS/service/90cefc7a42b3d4df0142b52466810026" href="#/catalog/90d9650a36988e5d0136988f03ab000f/category/DATABASE_SERVERS/service/90cefc7a42b3d4df0142b52466810026">
<div class="col-lg-2 col-sm-3 col-xs-4 item-list-image">
<img ng-src="csa/images/library/Service_Design.png" src="csa/images/library/Service_Design.png">
</div>
<div class="col-lg-8 col-sm-9 col-xs-8">
<div class="col-xs-12">
<p>
<strong class="ng-binding">Smoke Sequential</strong>
</p>
</div>
</div>
</a>
J'ai pu trouver l'élément sans problème avec:
driver.findElement(By.linkText("Smoke Sequential")).click();
S'il y a plus de texte à l'intérieur de l'élément, vous pouvez essayer une recherche par texte de lien partiel:
driver.findElement(By.partialLinkText("Sequential")).click();
Utilisez xpath et text ()
driver.findElement(By.Xpath("//strong[contains(text(),'" + service +"')]"));
find_elements_by_xpath("//*[@class='class name']")
est une excellente solution
Cela ne semble pas avoir de balises <a> </a>
, donc Selenium pourrait ne pas être capable de le détecter en tant que lien.
Vous pouvez essayer et utiliser
driver.findElement(By.xpath("//*[@class='ng-binding']")).click();
si c'est le seul élément de cette page avec cette classe.
Une approche de sélecteur de CSS pourrait certainement fonctionner ici. Essayer:
driver.findElement(By.CssSelector("a.item")).Click();
Cela ne fonctionnera pas s'il y a d'autres ancres avant celle-ci de l'élément de classe. Vous pouvez mieux spécifier l'élément exact si vous faites quelque chose comme "#mon_table> a.item" où ma_table est l'id d'une table dont l'ancre est un enfant.