Авторизация в Google [Python + Selenium]

251 просмотра
0
0 Комментариев

Прочитал основные функции Selenium, решил, что могу авторизоваться на какому-нибудь сайте и выбор пал на Google
вот отрывок кода:

webdriver.get('https://accounts.google.com')
email = webdriver.find_element_by_id('identifierId')
email.send_keys('hahaha')
next = webdriver.find_element_by_id('identifierNext')
next.click()
time.sleep(5)#думал, может страница не успевает появиться, нет не в этом причина:(
passwd = webdriver.find_elements_by_name('password')
passwd.send_keys('*bzZ%tEDsFF6PKBP')

Использовал webdriver Chrome

Можете ли подсказать в чем проблема.

На одном из форумов прочитал, что возможно, нужно вначале кликнуть на пароль, потом появится поле, настоящего пароля.
Я в принципе попробовал так сделать — в данном случае изменялся класс поля ввода, может быть и что-то еще, но не смог выделить это в консоли разработчика, т.к. как только страница теряла фокус, все менялось обратно.


Добавить комментарий

2 Answers

Python Опубликовано 16.12.2018
0

Лично у меня с Google-авторизацией проблема была в том, что скрипт пытался сработать до загрузки элемента. То есть, страница полностью загрузилась, а вот именно поля авторизации нет, ибо Selenium не мониторит Ajax загрузки. И я теперь при каждом открытии новой страницы проверяю наличие элемента:

# Типы проверки
# ID = "id"
# XPATH = "xpath"
# LINK_TEXT = "link text"
# PARTIAL_LINK_TEXT = "partial link text"
# NAME = "name"
# TAG_NAME = "tag name"
# CLASS_NAME = "class name"
# CSS_SELECTOR = "css selector"
 
#Функция проверки полной загрузки элемента
def check_load(check_type, check_id, timeout=5):
    try:
        #Проверяю наличие элемента
        element_present = EC.presence_of_element_located((getattr(By,check_type), check_id))
        WebDriverWait(driver, timeout).until(element_present)
    except TimeoutException:
        print("Timed out waiting for page to load")

Например, если менять регион на Яндексе, то вызов функции на главной странице:

#Проверяю, что страница загрузилась и элемент найден
check_load('CLASS_NAME', 'geolink__reg')

Возможно, поможет 🙂

Добавить комментарий
0

У вас стоит webdriver.find_elements_by_name, что возвращает список элементов, а не элемент, так должно работать:

passwd = webdriver.find_element_by_name('password')

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up