Невозможно ввести пароль с помощью SendKeys() в Selenium Python

#python #selenium #web-scraping

#python #селен #очистка веб-страниц

Вопрос:

Я пытаюсь написать программу, использующую Selenium WebScraping для взаимодействия с моей электронной почтой. Код, который я вставил ниже, предназначен только для процесса входа в систему. Я изменил адрес электронной почты и пароль.

 from selenium import webdriver

#Edge
driver = webdriver.Chrome()

#Open the website
driver.get('https://login.live.com/login.srf?wa=wsignin1.0amp;rpsnv=13amp;ct=1602431674amp;rver=7.0.6737.0amp;wp=MBI_SSLamp;wreply=https://outlook.live.com/owa/?nlp=1&RpsCsrfState=2c3ee82f-9893-34e5-fd04-e3b4c3e2ccc4amp;id=292841amp;aadredir=1amp;CBCXT=outamp;lw=1amp;fl=dob,flname,wldamp;cobrandid=90015')

log_in_button = driver.find_element_by_name("loginfmt")

log_in_button.send_keys('myemail@outlook.com')

next_button = driver.find_element_by_id("idSIButton9")

next_button.click()

password_button = driver.find_element_by_name("passwd")

password_button.send_keys('my_password')
  

Однако, когда я запускаю это (с правильным адресом электронной почты и паролем), программа, похоже, не может ввести пароль на последнем шаге. Журнала ошибок нет, и моя программа отлично вводит мою электронную почту, но не может ввести пароль. Я пытался использовать несколько разных способов поиска элемента HTML, включая

 find_element_by_type()

find_element_by_id()

find_element_by_class_name()
  

а также

 find_element_by_css_selector()
  

Большинство из этих методов заканчивались StaleElementReferenceException, некоторые заканчивались не удается найти элемент, а остальные вообще не работали.

Кто-нибудь знает способ ввода пароля с помощью Selenium, я предполагаю, что либо я использую неправильный элемент, либо Microsoft по какой-то причине намеренно блокирует такое поведение.

Любая помощь приветствуется. Спасибо.

Комментарии:

1. после нажатия кнопки next добавьте паузу в несколько секунд, соответственно 5 секунд. или используйте expected conditions , если вы хотите, чтобы это было действительно быстро

Ответ №1:

Лучше всего избегать time.sleep() , где это возможно. time.sleep() ненужное замедление ваших скриптов.

Рекомендуется всегда использовать явное ожидание, чтобы избежать проблем с синхронизацией.

Используйте WebDriverWait () и дождитесь element_to_be_clickable ()

 password_button =WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME,"passwd")))
  

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

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

Дальнейшее изучение вы можете найти ниже Явных ожиданий