Не могу ввести пароль gmail через скрипт python

webdriver
python
Теги: #<Tag:0x00007fedb8817f88> #<Tag:0x00007fedb8817e48>

(Сергей Александрович) #1

Здравствуйте, у меня win10 x64, python 3.6.4, FF 59.0.1 x64, selenium 3.11, geckodriver от 31.10.2017, не знаю, как версию посмотреть, есть строки кода:

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://mail.google.com")
login_func = driver.find_element_by_name("identifier")
login_func.send_keys("my_email")
driver.find_element_by_id("identifierNext").click()
pass_func = driver.find_element_by_name('password')
pass_func.send_keys("my_password")
driver.find_element_by_xpath("//*[@id='passwordNext']/content/span").click()

При последовательном вводе через IDLE все хорошо заходится, если запускаю это скриптом, то на вводе пароля получаю такую ошибку

raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [name="password"]

Если строку в скрипте поменять на такую

pass_func = driver.find_element_by_xpath("//input[@type='password']")

То через IDLE тоже все работает, а скриптом такая ошибка:

selenium.common.exceptions.ElementNotInteractableException: Message: Element <input class="VwCw" name="hiddenPassword" type="password"> is not reachable by keyboard

Подскажите, в чем затык, почему теряется управление? Уже и задержки ставил, и поиск и по name делал, в IDLE работает, из скрипта нет(


(Martin Schrader) #2

Ваша проблема решилась кликом по координатам, я думаю т.к. ето поле для пароля, то оно недоступно либо из соображений безопасности либо его просто надо активировать кликом…в любом случае клик по координатам у меня сработал. вот код:


from selenium import webdriver
import pyautogui
import time

driver = webdriver.Firefox()
driver.get("https://mail.google.com")
login_func = driver.find_element_by_name("identifier")
login_func.send_keys("sample_login")
driver.find_element_by_id("identifierNext").click()
time.sleep(2)
pyautogui.click(805, 536)
time.sleep(5)
pass_func = driver.find_element_by_name('password')
pass_func.send_keys("sample_password")
driver.find_element_by_xpath("//*[@id='passwordNext']/content/span").click()

(Сергей Александрович) #3

Спасибо, заработало! Не понял я, что это за координаты, но я не настолько html\css знаю) Мне для изучения для себя хватит)


(Martin Schrader) #4

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


(Dmytro Kryshtopenko) #5

это какой-то ужас :slight_smile: Лол, клик по координитам.
Если не все веб-элементы не видны, то:
Раз, делайте максимизацию окна браузера в настройках вебдрайвера после инициализации
Два, попросите верстальщиков увеличить min-body в верстке.
И опишите Page Object со Steps, а то глазам больно :slight_smile:


(Artur Korobeynyk) #6

Не видит поля потому что в момент нажатия некст код страницы обновляется. На это уходит примерно 1 или 2 секунды. В IDLE работает, потому что ввод последовательный и вы ждете пока появится окно с паролем. Скрипт не ждет и ищет поле пароля до того как оно появилось. Используйте что-то вроде waitFor для ожидания подгрузки элементов после клика на некст. Это я вам как мануальщик говорю.