Selenium WebDriver не может найти элемент по тексту ссылки

Я пытаюсь выбрать элемент, содержащий якорь, но текст похож на абзац внутри div. Здесь HTML, с которым я работаю:

<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>

Код, который я использую, чтобы попытаться зацепить его, нацелен на текст "Smoke Sequential":

driver.findElement(By.linkText(service)).click();

Если переменная "служба" содержит "Smoke Sequential" в ней. Когда я запустил его, я получаю следующую ошибку:

org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"link text","selector":"Smoke Sequential"}

Любая помощь будет принята с благодарностью.

Ответ 1

Проблема может быть в остальной части html, той части, которую вы не опубликовали.

В этом примере (я просто закрыл открытые теги):

<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>

Мне удалось найти элемент без проблем:

driver.findElement(By.linkText("Smoke Sequential")).click();

Если внутри элемента больше текста, вы можете попробовать найти частичный текст ссылки:

driver.findElement(By.partialLinkText("Sequential")).click();

Ответ 2

Использовать xpath и text()

driver.findElement(By.Xpath("//strong[contains(text(),'" + service +"')]"));

Ответ 3

У этого, похоже, нет тегов <a> </a>, поэтому селен, возможно, не сможет обнаружить его как ссылку.

Вы можете попробовать и использовать

driver.findElement(By.xpath("//*[@class='ng-binding']")).click();

если это единственный элемент этой страницы с этим классом.

Ответ 4

Подход CSS-селектора определенно может работать здесь. Попробуйте:

driver.findElement(By.CssSelector("a.item")).Click();

Это не будет работать, если перед этим одним из элементов класса есть другие привязки. Вы можете лучше указать точный элемент, если вы делаете что-то вроде "#my_table > a.item", где my_table - это идентификатор таблицы, в которой якорь является дочерним элементом.

Ответ 5

find_elements_by_xpath("//*[@class='class name']")

- отличное решение