Нажатие на кнопку с изменением xpath - PullRequest
1 голос
/ 14 февраля 2020

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

Для начала код HTML выглядит следующим образом:

<div tabindex="0" class="reactionInner-15NvIl" aria-label="♥️, press to react" aria-pressed="false" role="button"><img src="/assets/1afd3c799f3e158662a70498e83e2a87.svg" alt="♥️" draggable="false" class="emoji"><div class="reactionCount-2mvXRV" style="min-width: 9px;">1</div></div>

Сначала я попытался найти find_element_by_xpath:

driver.find_element_by_xpath('/html/body/div/div[1]/div/div[2]/div/div/div/div[2]/div[2]/div[2]/div[1]/div[1]/div/div/div[48]/div[1]/div[2]/div[2]/div[1]/div/div').click()

Но когда появляется новая возможность для этой реакции, xpath изменяется:

/html/body/div/div[1]/div/div[2]/div/div/div/div[2]/div[2]/div[2]/div[1]/div[1]/div/div/div[50]/div[1]/div[2]/div[2]/div[1]/div/div

Обратите внимание на единственную часть, заменяющую это div [48] на div [50]

Следующее, что я попробовал, было найти имя_класса_класса:

element = driver.find_element_by_class_name('reactionInner-15NvIl')
driver.execute_script("arguments[0].click();", element)

Причина, по которой я это сделал, заключалась в том, что у меня возникла проблема с простым выполнением:

driver.find_element_by_class_name('reactionInner-15NvIl').click()

Это Код выдаст мне ошибку, говорящую Message: element click intercepted: Element <div tabindex="0" class="reactionInner-15NvIl" aria-label="?, press to react" aria-pressed="false" role="button">...</div> is not clickable at point (405, 94). Other element would receive the click: <span id="NewMessagesBarJumpToNewMessages_122" class="span-3ncFWM">...</span>, и код не будет работать. Программа запускается с execute_script, но она ничего не делает, кнопка не нажимается. Так что, если у кого-то есть идеи, как можно нажать эту кнопку, любая помощь будет признательна!

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Индуцируйте WebDriverWait и ждите element_to_be_clickable() и следующий css селектор.

WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"div[class*='reactionInner-'][role='button']"))).click()

Вам необходимо импортировать следующие библиотеки.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

Обновление :

Стимулировать Javascript Executor для нажатия.

driver.execute_script("arguments[0].click();", WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"div[class*='reactionInner-'][role='button']"))))
0 голосов
/ 14 февраля 2020

Вы можете использовать xpath лучше, чем перемещаться между элементами, как вы делали это в первый раз.

Прежде всего, если вы можете изменить HTML на id или name, это лучше.

В этом случае вы можете использовать этот xpath:

//div[@class = "reactionInner-15NvIl"]

При поиске по классу это может вернуть несколько результатов, поэтому используйте функция find_elements_by_xpath, а затем выбрать точно один

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