Как найти XPath элемента класса, который имеет более одного вхождения на странице? - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь заставить Selenium нажимать на кнопки «вверх» на сайте, похожем на reddit. На сайте есть записи от разных пользователей, и под каждой записью есть кнопки «вверх» и «вниз». То, что я хочу сделать, это заставить Selenium нажать на первую кнопку upvote (которая принадлежит записи вверху) на странице. Я пытался использовать функцию «Копировать XPath» в Chrome, но все кнопки upvote на странице возвращают один и тот же XPath:

//*[@id="eksico-chevron-up-thick"]/path

А вот так выглядит сайт при необходимости:

enter image description here

Итак, есть ли способ найти XPath первой кнопки upvote? Я думал о чем-то вроде:

//*[@id="eksico-chevron-up-thick"]/[1]

и т.д.. Заранее спасибо.

Редактировать: HTML-код одного из элементов upvote:

enter image description here

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Элемент, на который вы пытаетесь щелкнуть, находится под shadow dom, как упомянуто в структуре html, и в настоящее время селен не поддерживает работу с элементами под теневым доменом.
Справка: https://medium.com/rate-engineering/a-guide-to-working-with-shadow-dom-using-selenium-b124992559f

Итак, если вы хотите нажать на элемент, вы можете использовать JavaScriptExecutor, например:

WebElement element = driver.findElement(By.id("eksico-chevron-up-thick"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);

По умолчанию он щелкает сам первый элемент, и если вы хотите щелкнуть конкретный n-й элемент, вы можете взять элементы в списке и затем отправить индекс этого элемента внутри метода, чтобы щелкнуть этот элемент. .

0 голосов
/ 31 марта 2019

Если вы хотите нажать на первый, вы можете использовать Driver.find_elements_by_xpath(//*[@id="eksico-chevron-up-thick"]/path)[1].click()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...