Ссылки Selenium xpath с драйвером Python Firefox не щелкают - PullRequest
1 голос
/ 15 марта 2019

Мне нужна помощь по указанному предмету.Я прилагаю скриншот, где я застреваю после входа в систему и нескольких кликов на веб-странице.И хромедрайвер, и гекодрайвер, одна и та же проблема.

Мне нужна кнопка «Запуск», показанная на картинке.Подсвеченные элементы показаны на изображении синим цветом, а путь xpath довольно прост: "r '// * [@ id =" HME-8-widget_launch_button "]'".

Я пробовал следующее:

driver = webdriver.Firefox();
...
Launch = r'//*[@id="HME-8-widget_launch_button"]'
link = driver.find_element_by_xpath(Launch)
act.move_to_element(link)
act.click()
act.perform()

Более простой

link.click()

тоже не работает.

Чего мне не хватает?screenshot Спасибо,

Элвин

Ответы [ 2 ]

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

Вы можете использовать как это

launchXpath = "//button[@id='HME-8-widget_launch_button']"
launchBtn = driver.find_element_by_xpath(launchXpath )
launchBtn.click()

Предложение: Вы также можете использовать id вместо xpath.

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

Ваш xPath, сохраненный в Launch, кажется неправильным.Прежде всего, если я правильно понимаю использование r'xpath', это сделает так, чтобы обратный слеш не экранировал символы.Я предполагаю, что act определено как ActionChains, и в этом случае остальная часть вашего кода должна работать, но я собираюсь предложить либо

xpath = "//*[@id='HME-8-widget_launch_button']"
link = driver.find_element_by_xpath(xpath)
link.click()

, если вы хотите повторно использовать этот элемент, либоесли вам не нужно повторно использовать его и просто хотите щелкнуть по нему, вы можете просто сделать

driver.find_element_by_xpath("//*[@id='HME-8-widget_launch_button']").click()

Изменить, чтобы добавить:

ПОДОЖДИТЕ. Я предполагаю, что вы пытаетесь нажать направильно ли выделен элемент в вашем изображении?в третьей строке вашего изображения есть еще один элемент с id='HME-8-widget_launch_button, и этот элемент будет найден первым.Я не могу сказать наверняка, не увидев ваш полный HTML, но вы можете использовать класс этой кнопки, чтобы выбрать свой элемент.Попробуйте следующее и дайте мне знать, если это работает:

link = driver.find_element_by_css_selector("button.hm-button.k-button")

Я не могу проверить это, но идентифицирует ли это ваш элемент?

Изменить, чтобы, надеюсь, устранить основную причину

О, я думаю, я знаю, почему ты не можешь нажать этоГлядя на скриншот, вы пытаетесь щелкнуть по элементу сразу после выполнения JavaScript.Если вы посмотрите на этот javascript, он вызывает функцию, которая делает запрос JQuery, который выглядит примерно так:

JQuery(yourElement).closest('.hm-widget').show()

Документация JQuery для closest() и show() здесь и здесь соответственно указывают, что closest('.hm-widget') будет «начинаться с текущего элемента» и идти «вверх по дереву DOM, пока не найдет совпадение для поставляемого селектора».Из вашего скриншота видно, что третий тег над тегом script имеет класс 'hm-widget hc-button', и я считаю, что именно для этого предназначен таргетинг .show(), и поэтому этот div отображается, скрывая ваш div и делая его не кликабельным.

Два предложения: попробуйте просто нажать на этот div и посмотреть, нажмет ли он кнопку.Я уверен, что вы можете сами разобраться в этой ошибке, например:

driver.find_element_by_css_selector('div.hm-widget.hc-button').click()

Или использовать любой селектор, который вы предпочитаете.Я предполагаю, что пользователь может нажать на эту кнопку даже после выполнения тега <script>, что заставляет меня думать, что вышеприведенное может сработать.

Если это не сработает, мне интересно, что произойдет, если вы попытаетесь бороться сjQuery сайта, использующий ваш собственный jQuery в driver.execute_javascript.Одна вещь, которую вы могли бы сделать, это попытаться использовать функцию jQuery detach, чтобы просто удалить нарушающий javascript, который я заметил.Я думаю, что это может быть достигнуто следующим образом:

css = "div.hm-widget-element > script"
scripts = driver.find_elements_by_css_selector(css)

Это хранит массив (как минимум) двух scripts из вашего изображения, поэтому scripts[0] будет идентифицировать скрипт над вашим выделенным элементом.Следующее должно удалить этот тег из DOM, чтобы вы (надеюсь) могли нажать на кнопку без препятствий.

driver.execute_script('Arguments[0].remove()', scripts[0])

Если ЭТО не работает, последнее, что нужно сделать, это попытаться удалить скрипт, который следует ваш выделенный элемент.Я не совсем уверен, что он делает, но, похоже, что-то делает с вашим целевым элементом.

driver.execute_script('Arguments[0].remove', scripts[1])

Если вы воспользуетесь этим подходом, я бы добавил выполнение javascript сразу после загрузки страницы и довы предпринимаете какие-либо действия в браузере.

Опять же, я не могу проверить это, поэтому дайте мне знать, как это происходит.

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