Как извлечь текст со страницы списка категорий товаров в виде Xpath и добавить его в список в Selenium Java
Я пытаюсь выбрать название каждого продукта на странице списка категорий следующим образом (например: https://www.prana.com/women/clothing/tops.html).
У меня есть цикл for, проходящий через Xpath, но он продолжает выдавать ошибку о том, что "Xpath" - это [текст объекта], это должен быть элемент. Что правильно. Мой вопрос, как я могу получить текст? Я осмотрелся повсюду, но, похоже, не могу найти правильный ответ. Это то, что я имею сейчас.
List<WebElement> allElements = driver.findElements(By.xpath("//*[@id=\"root-wrapper\"]/div/div/div[3]/div/div[4]/div[2]/div[3]/ul/li[1]/a/h2/text()"));
for(int i=0; i <allElements.size(); i++) {
allElements = driver.findElements(By.xpath("//*[@id=\"root-wrapper\"]/div/div/div[3]/div/div[4]/div[2]/div[3]/ul/li["+i+"]/a/h2/text()"));
}
System.out.println(Integer.toString(allElements.size()));
for (WebElement element: allElements) {
System.out.println((element).getText());
Поэтому я хочу, чтобы это продолжалось до тех пор, пока не останется больше этих "элементов" (текста), а затем перечислю их для меня.
Любая помощь будет принята с благодарностью.
Я видел нечто похожее с href здесь: итерация в списке продуктов на нескольких страницах с селеном Java
Я собираюсь посмотреть, смогу ли я реализовать это с
driver.findElements(By.className(".product-name *then enter a blank variable here*" );
2 ответа
text()
в XPath используется для соответствия TextNode. Помимо TextNode в HTML есть ElementNode и AttributeNode.
Но для селена он может только найти / вернуть ElementNode, вы можете использовать отображаемый текст TextNode в XPath, чтобы он соответствовал желаемому ElementNode, но не можете попросить selenium вернуть TextNode.
Поэтому удалите text()
в конце вашего xpath, затем позвоните getText()
API WebElement
получить текст элемента.
Вы можете создать список с нужными элементами, вызывающими WebDriverWait для видимости всех элементов, и извлечь необходимый текст в цикле, и вы можете использовать следующее решение:
Блок кода:
driver.get("https://global.prana.com/women/clothing/tops.html#page=1"); List<WebElement> allElements = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//h2[@class='product-name']"))); for (WebElement element: allElements) System.out.println((element).getText());
Консольный вывод:
FILLARY TOP REMI WAFFLE PULLOVER SHEA WAFFLE HOODIE SHELTON TOP PRAIRIE GROVE SWEATER PERCY TOP CHARLEY TOP ASTER TUNIC ASTER TUNIC PLUS FOUNDATION TURTLENECK FOUNDATION V-NECK PLUS FOUNDATION WRAP COZY UP T-SHIRT FOUNDATION WRAP PLUS FOUNDATION LONG SLEEVE CREW FOUNDATION LONG SLEEVE TUNIC SEABORD LONG SLEEVE TOP SEABORD SHORT SLEEVE TOP FOUNDATION SHORT SLEEVE V-NECK BACALL TOP PUREST TANK AZUL TOP SHILOH TOP