Селена Нажмите JS Кнопка - Python? - PullRequest
1 голос
/ 15 апреля 2020

Да, есть похожие вопросы, но, прочитав их, я не смог найти решение своей проблемы.

Следующая ситуация: я пытаюсь нажать кнопку "Ответить" на " https://charleston.craigslist.org/ctd/d/charleston-2018-nissan-sentra-sedan-4d/7108660907.html "и после выполнения этого щелчка появляется всплывающее окно, где я нажимаю другую кнопку, но давайте начнем с первой кнопки, так как сам щелчок" ответа "очень проблематичен.

Кнопка ответа имеет следующий X-путь:

'/html/body/section/section/header/div[2]/div/button'

, где указан исходный код:

<button role="button" class="reply-button js-only" data-href="/__SERVICE_ID__/chs/ctd/7108660907">
      reply
    </button> 

(см. Код на указанном веб-сайте).

Однако мой подход с Selenium (Python) не работает:

reply_button = '/html/body/section/section/header/div[2]/div/button'
driver.get('https://charleston.craigslist.org/ctd/d/charleston-2018-nissan-sentra-sedan-4d/7108660907.html')

driver.find_element_by_xpath(reply_button).click()

Каждый раз, когда я пытался, сайт просто загружался правильно (даже с реализацией time.sleep (x)) и пытался нажать на кнопку, но это не удается, и веб-сайт просто обновляется - я предполагаю, что они либо повторно открывают браузер, контролируемый Selenium, что щелчок не является законным, либо я ничего не поймал прямо в своем коде ... в состоянии помочь?

Кстати, я уже пытался найти "by_class_name", который тоже не работал.

1 Ответ

1 голос
/ 15 апреля 2020

Этот Xpath: '/html/body/section/section/header/div[2]/div/button' подобен тому, когда вы получаете карту с инструкциями, такими как step forward until you see a car then turn left 30° then step forward until you see a tree then hop twice then go to the second house to your right. Не безопасно использовать, избегайте таких путей. Если макет страницы изменится, ваш путь может стать недействительным.

Попробуйте сделать следующее:

button = driver.find_element_by_xpath('//*[@class="reply-button js-only"]')
button.click()

При нажатии кнопки открывается всплывающее окно «Показать номер телефона» (которое может быть найдено по адресу driver.find_element_by_xpath('//*[@class="show-phone"]') ).

Объяснение:

Если вам нужен правильный Xpath, проверьте, с чем вы хотите взаимодействовать. Кнопка, которую вы хотите нажать:

<button role="button" class="reply-button js-only" data-href="/__SERVICE_ID__/chs/ctd/7108660907">
      reply
    </button>

Вы можете видеть, что у нее нет тега "id", но это кнопка с указанным c классом. Вы можете сразу скопировать часть «class» -> class="reply-button js-only"

Теперь вы можете проверить, достаточно ли она уникальна:

driver.find_elements_by_xpath('//*[@class="reply-button js-only"]')

Если «find elements» возвращает один результат, как правило, вы должны быть в порядке. Вы можете видеть, что все, что я сделал, это вставил класс в это: driver.find_elements_by_xpath('//*[@ и это ]').

Если вам нужна большая точность, вы можете указать, что это кнопка:

driver.find_element_by_xpath('//button[@class="reply-button js-only"]')

Или это прямой потомок элемента с классом: class="actions-combo", поэтому более безопасный путь будет:

driver.find_element_by_xpath('//*[@class="actions-combo"]/button[@class="reply-button js-only"]')

Этот шаблон работает для всех атрибутов webelement, а не только для классов. Вы можете использовать role="button" тоже для дополнительной фильтрации. Посмотрите на Xpath, это довольно аккуратный материал.

...