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

from selenium import webdriver

chromedriver = r'C:\Users\dd\Desktop\chromedriver.exe'
browser = webdriver.Chrome(chromedriver)
url = 'https://www.fake.com/'

browser.get(url)

browser.find_element_by_id('txtLoginUserName').send_keys("Hello")
browser.find_element_by_id('txtLoginPassword').send_keys("There")
browser.find_element_by_id('btnLogin').click()

На данный момент я пытаюсь перейти к определенной кнопке / ссылке. Вот информация со страницы / элемента

 <a href="javascript:void(0)" style="text-decoration:none" onclick="InitiateCallBack('187', 'True', 'T-Mobile', 'https://www.fake.com/', 'TMobile')">T-Mobile</a>

Вот некоторые из вещей, которые я попробовал:

for elem in browser.find_elements_by_xpath("//*[contains(text(), 'T-Mobile')]"):
    elem.click

browser.execute_script("InitiateCallBack(187, True, T-Mobile, https://www.fake.com/, TMobile)")

Я также попытался найти теги и использовать селектор CSS, который я удалил из-за разочарования!

Конкретные вопросы

  1. Как использовать внутренний текст «T-Mobile», чтобы нажать кнопку?
  2. Как мне выполнить событие onclick?

Я пытался прочитать следующие ссылки, но до сих пор не удалось получить другой способ. Частично это связано с тем, что я еще не понимаю специфический синтаксис. Это только некоторые из вещей, на которые я смотрел. Я потратил около 3 часов, пробуя разные вещи, прежде чем приехать сюда!

Селен Python onclick () дает StaleElementReferenceExceptionhttp://selenium-python.readthedocs.io/locating-elements.html Python: Selenium для симуляции onclickhttps://stackoverflow.com/questions/43531654/simulate-a-onclick-with-selenium-https://stackoverflow.com/questions/45360707/python-selenium-using-onclick Запуск JavaScript в Selenium с использованием Python

2
Noctsol 27 Фев 2018 в 21:36

3 ответа

Лучший ответ

Как использовать внутренний текст «T-Mobile», чтобы нажать кнопку?

find_elements_by_link_text будет подходящим для этого случая.

elements = driver.find_elements_by_link_text('T-Mobile')
for elem in elements:
    elem.click()

Также есть by_partial_link_text локатор, если у вас нет полного точного текста.

Как мне выполнить событие onclick?

Простейшим способом было бы просто вызвать .click() для элемента, как показано выше, и событие, естественно, должно выполняться в это время.

Кроме того, вы можете получить атрибут onclick и использовать driver.execute_script для запуска js.

for elem in elements:
    script = elem.get_attribute('onlcick')
    driver.execute_script(script)

Редактировать:

Обратите внимание, что в вашем коде вы сделали element.click - это ничего не делает. element.click() (обратите внимание на паренов) вызывает метод click.

Есть ли способ использовать browser.execute_script () для события onclick

execute_script может вызвать эквивалентное событие, но при этом может быть больше слушателей, которых вы пропустили. Использование метода щелчка элемента является наиболее обоснованным. Вполне может быть много деталей реализации сайта, которые могут помешать вашим усилиям по автоматизации, но эти возможности безграничны. Трудно сказать, не видя реального контекста.
Вы можете использовать методы JS, чтобы щелкнуть элемент или иным образом взаимодействовать со страницей, но вы можете пропустить некоторые прослушиватели событий, которые происходят при использовании сайта «нормально»; Вы хотите подражать, более или менее, нормальному использованию как можно ближе.

2
sytech 16 Мар 2018 в 05:29

Что касается HTML , которым вы поделились, то совершенно очевидно, что веб-сайт использует JavaScript . Таким образом, для click() ссылки с текстом T-Mobile необходимо ввести WebDriverWait с предложением expected_conditions как element_to_be_clickable и ваш можно использовать следующий блок кода:

WebDriverWait(driver, 20).until(expected_conditions.element_to_be_clickable((By.XPATH, "//a[contains(.,'T-Mobile')]"))).click()
1
DebanjanB 28 Фев 2018 в 06:25

Ты можешь использовать это

 <div class="button c_button s_button" onclick="submitForm('rMTF')" style="margin-bottom: 30px;">
    <input class="v_small" type="button"></input>
    <span>
          Reset
    </span>
1
Firat 28 Фев 2018 в 12:25