Как подтвердить результаты поиска «find_element_by» с использованием Python и Selenium? - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь автоматизировать вход в систему до https://auth.tesla.com/login, но застреваю при попытке ввести мой адрес электронной почты.

Я пробовал следующие строки кода Python: email_box = driver.find_element_by_xpath("//form[1]") или email_box = driver.find_element_by_link_text('Email') с последующим email_box.clear()'

Но я получаю сообщение об ошибке Element must be user-editable in order to clear it Что говорит о том, что я не нашелправый элемент. Мои вопросы: есть ли способ определить, какой именно HTML-элемент был найден кодом find_element_by? Или, может быть, есть лучший способ найти почтовый ящик и ввести мой адрес электронной почты в? (Я делаю это с Raspbian Buster, используя Selenium 3.141.0 и Chromium 74.0.3729.157). Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 октября 2019

Ваша строка кода email_box = driver.find_element_by_xpath ("// form [1]") находит форму, а не поля ввода. Вы можете проверить это с помощью атрибутов и методов WebElement:

  • get_attribute (name) (значение атрибута name элемента)
  • text (текст в элементе, например 'hello'in hello)

Пример:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

email_box = driver.find_element_by_xpath("//form[1]")
print(email_box.text)

Вывод:

'Sign In\nI forgot my password\nSIGN IN\nCreate an account'

Так вот для чего Ваш браузер.find_element_by_xpath ("// form [1] ") найдено.

Существует много способов получить доступ к этому полю электронной почты и проверить его.

Если вы уверены, что веб-страница останется прежней, вы можете использовать XPATH для этого вводаполе:

 xp='/html/body/div[2]/div/form/div[1]/div/div[2]/input'
 email_box = driver.find_element_by_xpath(xp)
 email_box.send_keys('Test')

Другой способ - собрать все входные данные и идентифицировать их. Это больше для того, чтобы знать, что к чему, чем находить и использовать поле электронной почты напрямую. :

input_list = driver.find_elements_by_class_name("input")
for field in input_list:
    print(input_list.index(i), i.get_attribute('placeholder'))

Вывод:

0 Username
1 Email
2 Password

Итак, теперь вы знаете, что есть 3 поля ввода, второе - это адрес электронной почты, после чего идет пароль. Предполагая, что эта страница останется прежней. Теперь вы можете заполнить их текстом:

input_list[1].send_keys('email@email.com')
input_list[2].send_keys('Secret_password')

Вы также можете написать что-то самостоятельно на входе и попытаться определить значение (тест уже выполнен из предыдущего кода):

 xp='/html/body/div[2]/div/form/div[1]/div/div[2]/input'
 email_box = driver.find_element_by_xpath(xp)
 email_box.get_attribute('value')
0 голосов
/ 10 октября 2019
  1. Если вы хотите визуализировать выбранный элемент на странице, после выбора вы можете применить к нему несколько JS, чтобы вы могли видеть, какой элемент у вас есть (цель отладки)

    email_box = driver.find_element_by_xpath ("// form [1]") driver.execute_script ('arguments [0] .setAttribute ("style", "color: red; рамка: 2px solid red;")', email_box)

  2. driver.find_element_by_link_text('Email'): это неправильно, потому что на этой странице нет ссылки (элемент LINK является элементом ) с текстом «email». Также вы не можете очистить элементы . Обычно clear применяется на входах.

  3. driver.find_element_by_xpath("//form[1]"): это неправильно, потому что здесь вы получаете первый элемент на странице. Снова формы не могут быть очищены.

  4. То, что вы ищете: css selector:

    form # вход в форму для входа [placeholder = 'Email']

или xpath

//form[@id='login-form']//input[@placeholder='Email']
Также, когда вы открываете страницу в браузере Chrome и открываете инструменты разработчика (F12), переходите на вкладку элементов;откройте поиск (нажмите ctr + F), вы можете вставить туда свой селектор xpath / css и посмотреть, какой элемент выбран
...