2016-10-22 3 views
0

Я беру курс селена онлайн, и мы автоматизируем вход в систему. Лекция устарела и обновляется веб-сайт, который мы используем (Quora).Поиск разделов с меняющимися именами классов (селен)

Проблема заключается в том, что поля ввода имеют случайным образом сгенерированные имена классов, что делает "find_element_by_id метод бесполезен.

Я не могу понять, как войти в систему для различных сеансов. Как я выбираю эти поля во время различных сессий (которые имеют разные имена классов). Это то, что мой код выглядит следующим образом. Спасибо заранее. Я попытался попросить инструктор, конечно, но он hasnt ответил всю неделю.

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


driver = webdriver.Chrome(executable_path = r'/Users/mpbro17/Desktop/chromedriver') 

driver.get('https://www.quora.com') 

driver.find_element_by_id("__w2_fy0VXDC_email").clear() 
driver.find_element_by_id("__w2_fy0VXDC_email").send_keys("[email protected]") 
driver.find_element_by_id("__w2_fy0VXDC_password").clear() 
driver.find_element_by_id("__w2_fy0VXDC_password").send_keys("testpassword1") 
driver.find_element_by_id("__w2_fy0VXDC_submit_button").click() 

ОШИБКА

Traceback (most recent call last): 
    File "/Users/mbpro/Desktop/projects/scraping_course/test_quora_login.py", line 13, in <module> 
    driver.find_element_by_name("email").clear() 
    File "/usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 92, in clear 
    self._execute(Command.CLEAR_ELEMENT) 
    File "/usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 494, in _execute 
    return self._parent.execute(command, params) 
    File "/usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute 
    self.error_handler.check_response(response) 
    File "/usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.InvalidElementStateException: Message: invalid element state: Element is not currently interactable and may not be manipulated 
    (Session info: chrome=53.0.2785.143) 
    (Driver info: chromedriver=2.24.417412 (ac882d3ce7c0d99292439bf3405780058fcca0a6),platform=Mac OS X 10.11.5 x86_64) 

ответ

0

Try CSS селекторы вместо:

driver.find_element_by_css_selector('[id$="email"]') 
driver.find_element_by_css_selector('[id$="password"]') 
driver.find_element_by_css_selector('[id$="submit_button"]') 
+0

Я попытался это, но я все еще получаю Erorr «линии 192, в check_response рейза exception_class (сообщение, экран, StackTrace) selenium.common .exceptions.InvalidElementStateException: Сообщение: недопустимое состояние элемента: элемент должен быть доступен для редактирования, чтобы очистить его. " – tafra

0

Вы могли бы использовать метод find_element_by_name, чтобы найти элементы (адрес электронной почты и пароль) и CSSSelector для кнопки Вход. Я думаю, это не уберет вас от разочарования.

driver.find_element_by_name("email").clear() 
driver.find_element_by_name("email").send_keys("[email protected]") 
driver.find_element_by_name("password").clear() 
driver.find_element_by_name("password").send_keys("testpassword1") 
driver.find_element_by_css_selector("input[value='Login']").click() 
+0

Я пробовал имена классов и это .. Я продолжаю получать ошибку. Я вставил его в вопрос – tafra

+0

Я не говорил о именах классов. В тегах, над которыми вы работаете, есть атрибут «имя». Это один из подходов к поиску локатора в селене. –

+0

Я знаю .. Я просто даю вам знать, что еще я пробовал. Поиск элемента по имени все еще дал мне ошибку в вопросе. Вы посмотрели? – tafra

0

Вы должны пойти с именем, как оно стандартно. Однако, если вы идете по свойству имени, есть два элемента.

enter image description here

Так идут ниже

XPath
//div[@class='regular_login']//input[@name='email'] 
//div[@class='regular_login']//input[@name='password'] 
//div[@class='regular_login']//input[contains(@class,'submit')] 
+0

hmm, Ive никогда не использовал find_element_by_xpath() Как бы это выглядело? Возьмите много попыток. Я не могу понять это – tafra

Смежные вопросы