XPATH для ссылки href не работает. Получение недопустимого селектора: это должен быть элемент

#java #selenium #xpath

#java #selenium #xpath

Вопрос:

Я пытаюсь автоматизировать пару сценариев Selenium с этого веб-сайта

я пытался щелкнуть ссылку «категории», указав приведенный ниже XPATH

 //a[contains(text(), 'CATEGORIES')]/@href
  

Я получаю InvalidSelector ошибку. Не могли бы вы, пожалуйста, предложить альтернативный XPATH для этого?

Ответ №1:

Просто для справки:

 <ul>
  <li><a href="index.php">HOME</a></li>
  <li><a href="catlist.php">CATEGORIES</a></li>
  <li><a href="brands.php">BRANDS</a></li>
  <li><a href="products.php">PRODUCTS</a></li>
  <li><a href="cart.php">MY CART</a></li>
  <li><a href="tracking.php">TRACKING</a></li>
  <li><a href="customerlogin.php">ACCOUNT</a>
  </li>
  <li><a href="faq.php">FAQ'S</a></li>
  <li><a href="aboutus.php">ABOUT US</a></li>
</ul>  

Альтернативный способ с использованием linktext:
=> По.linkText(«КАТЕГОРИИ»)

 driver.findElement(By.linkText("CATEGORIES")).click();
  

Комментарии:

1. linkText(«») не всегда работает. В этом случае это может сработать.

2. @kajal kundu: Всегда ли это работает с помощью.xpath(«//a[содержит(text(), ‘CATEGORIES’)]»))??

Ответ №2:

Используйте класс action, чтобы щелкнуть по элементу.

 Actions action=new Actions(driver);
action.moveToElement(driver.findElement(By.xpath("//a[contains(text(), 'CATEGORIES')]"))).click().build().perform();
  

Пожалуйста, обратите внимание: используйте следующий импорт.

 import org.openqa.selenium.interactions.Actions;
  

Комментарии:

1. Существует проблема с этим ответом: когда набор узлов из text() теста узла передается в качестве аргумента для contains функции, он будет приведен string функцией. Короче говоря, вы бы тестировали только первый текстовый узел. Правильное выражение должно быть //a[contains(.,'CATEGORIES')]

2. @Alejandro: полностью согласен.

Ответ №3:

Раздел «КАТЕГОРИИ» на странице, которую вы пытаетесь автоматизировать, хранится в виде текста в структуре html, поэтому вы можете найти его, используя приведенный ниже xpath, который находит его, сопоставляя его текст:

 WebElement categoriesSection = driver.findElement(By.xpath("//a[text()='CATEGORIES']"));
  

Комментарии:

1. почему вы изменили свой ответ?

2. Поскольку на странице было две категории, и сначала я написал xpath для других категорий, затем я обнаружил, что OP запрашивает категории с тегом привязки, поэтому я отредактировал свой xpath.

3. Сначала прочитайте вопрос, что ищет OP. Просто давать ответ — не лучшая практика.

4. OP упомянул категории, и если вы проверите веб-страницу, на странице есть две категории, поэтому я запутался, и именно поэтому я впоследствии изменил свой xpath, и если вы увидите историю редактирования, логика, которую я использовал, одинакова для обеих. Однако да, я постараюсь, чтобы этого не произошло в будущем.

5. Я проверил. Другой элемент — текстовое поле теперь скажите мне, как щелкнуть текстовое поле. Упомянутый OP хочет щелкнуть по привязке, а не по текстовому полю. Вот почему я сказал сначала прочитать.