Войдите, выбрав кнопку через Selenium в Python

Я пытаюсь войти в свою учетную запись через эта ссылка на веб-странице Market Watch через Python и с помощью пакета Selenium. Я могу выбрать кнопку «Войти» и нажать на нее, но ничего не происходит, и поэтому я не могу получить доступ к нужной мне веб-странице.

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

<div class = "sign-in">
    <button class = "solid-button basic-login-submit">
        <span class = "text" data-token = "signIn" token-title = "signIn" title = "Sign In">
        Sign In
        </span>
    </button>
</div>
<div class = "create-connect" style = "display: none;">
    <button class = "solid-button basic-login-connect">
        <span class = "text" data-token = "yesConnect">
        Yes, connect
        </span>
    </button>
    ...some other buttons for facebook connection 

Мой код следующий:

    driver.get("https://sso.accounts.dowjones.com/login?state=g6Fo2SBQQURPVkxkcTR0RW1zX21NSmxLY3F4Q2RoUm5QTWV4UaN0aWTZMmdhRm8yU0IwUW01dVV6WjJiVXhVUmtaRVRXd3dlamM1UVdjNVIweExiVFJVYlc5WFl3o2NpZNkgNWhzc0VBZE15MG1KVElDbkpOdkM5VFhFdzNWYTdqZk8&client=5hssEAdMy0mJTICnJNvC9TXEw3Va7jfO&protocol=oauth2&prompt=login&scope=openid%20idp_id%20given_name%20family_name%20email%20djid%20prts&response_type=code&redirect_uri=https%3A%2F%2Faccounts.marketwatch.com%2Fauth%2Fsso%2Flogin&nonce=ac689d94-8b8f-4e6d-9255-439f58fc3c0f&connection=DJldap&ui_locales=en-us-x-mw-3-8&ns=prod%2Faccounts-mw#!/signin") #this is the link above 

username = driver.find_element_by_id("username")
password = driver.find_element_by_id("password")

username.send_keys("[email protected]")
password.send_keys("***")

driver.find_element_by_xpath(".//*[contains(text(), 'Sign In')]").click()
driver.find_element_by_xpath(".//*[contains(text(), 'Yes, connect')]").click()

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

Мне интересно узнать:

  1. Что я делаю неправильно
  2. почему когда я нажимаю на кнопку "Войти" ничего не происходит
  3. как преодолеть это

Я также безуспешно пробовал:

driver.find_element_by_css_selector("solid-button.basic-login-submit")

Судя по HTML-коду на этой странице, у <form> нет атрибута действия, поэтому я уверен, что JavaScript прослушивает события onclick или onsubmit. Нажатие этого с помощью Selenium может неправильно запускать события DOM. Возможно, вы захотите попробовать вызвать событие клика с помощью JavaScript.

Greg Burghardt 05.04.2019 21:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
1 348
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

пытаться :

 driver.find_element_by_class_name('sign-in')

Попробуйте использовать следующий код. Это должно работать. Предоставьте WebdriverWait после вставки значения в тестовое поле.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver=webdriver.Chrome()
driver.get("https://sso.accounts.dowjones.com/login?state=g6Fo2SBQQURPVkxkcTR0RW1zX21NSmxLY3F4Q2RoUm5QTWV4UaN0aWTZMmdhRm8yU0IwUW01dVV6WjJiVXhVUmtaRVRXd3dlamM1UVdjNVIweExiVFJVYlc5WFl3o2NpZNkgNWhzc0VBZE15MG1KVElDbkpOdkM5VFhFdzNWYTdqZk8&client=5hssEAdMy0mJTICnJNvC9TXEw3Va7jfO&protocol=oauth2&prompt=login&scope=openid%20idp_id%20given_name%20family_name%20email%20djid%20prts&response_type=code&redirect_uri=https%3A%2F%2Faccounts.marketwatch.com%2Fauth%2Fsso%2Flogin&nonce=ac689d94-8b8f-4e6d-9255-439f58fc3c0f&connection=DJldap&ui_locales=en-us-x-mw-3-8&ns=prod%2Faccounts-mw#!/signin") #this is the link above

username = driver.find_element_by_id("username")
password = driver.find_element_by_id("password")

username.send_keys("[email protected]")
password.send_keys("***")
WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH,"//button[@class='solid-button basic-login-submit']"))).click()

Даже после того, как была нажата кнопка входа, я не вошел в систему. Я использовал ссылку href «вход» из «https://www.marketwatch.com/», и это сработало.

from selenium import webdriver
from selenium.webdriver import Firefox
from time import sleep


driver = webdriver.Firefox(executable_path=r'C:\\Py\\geckodriver.exe');

# driver.get('https://sso.accounts.dowjones.com/login?state=g6Fo2SBJbUhZMUdPZlJfOEJSRWgxLVVFNXhoR3E5cFdaVlI4dKN0aWTZMmdhRm8yU0JaV0ZCWVluSmxNM2c0UjJSVk4wNXFlSHByUW5SUU1sRnpjMjFDVkVoeFNno2NpZNkgNWhzc0VBZE15MG1KVElDbkpOdkM5VFhFdzNWYTdqZk8&client=5hssEAdMy0mJTICnJNvC9TXEw3Va7jfO&protocol=oauth2&prompt=login&scope=openid%20idp_id%20roles%20email%20given_name%20family_name%20djid%20djUsername%20djStatus%20trackid&response_type=code&redirect_uri=https%3A%2F%2Faccounts.marketwatch.com%2Fauth%2Fsso%2Flogin&nonce=4b5092ee-62d1-47cb-a16e-2ceb396b059c&connection=DJldap&ui_locales=en-us-x-mw-0&mg=ss-ngx#!/signin')
driver.get('https://accounts.marketwatch.com/login?target=https%3A%2F%2Fwww.marketwatch.com%2F')

sleep(5)

username = driver.find_element_by_id("username")
password = driver.find_element_by_id("password")

username.send_keys("[email protected]")
password.send_keys("***")

sign_in = driver.find_element_by_xpath(".//*[@id='basic-login']/div[1]/form/div/div[7]/div[1]/button")

sign_in.click()
Ответ принят как подходящий

Ваша попытка очень близка. Изменение кода с вашей попытки на

# You'll need to import these dependencies
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

button = WebDriverWait(driver,1000).until(By.CSS_SELECTOR,"button.solid-button.basic-login-submit")

button.click()

WebDriverWait(0,1000) заставляет программу искать элемент 1000 секунд. Это лучше, потому что дает время для загрузки страницы.

Сейчас это не работает, username.send_keys тоже будет неправильно.

Frank Wang 25.10.2021 16:21

Другие вопросы по теме