web-dev-qa-db-fra.com

Selenium WebDriver ne trouve pas d'élément par le texte du lien

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.

11
Taelus

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();
22
Marielle

Utilisez xpath et text ()

driver.findElement(By.Xpath("//strong[contains(text(),'" + service +"')]"));
4
user2932876
find_elements_by_xpath("//*[@class='class name']")

est une excellente solution

0
Jean François

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.

0
user2062360

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.

0
marchocolate