Selenium Python ElementNotVisibleException

1

Я использую Selenium с python, и я пытаюсь заполнить регистрационную форму, мне удалось заполнить поле имени пользователя, но не удалось завершить пароль. Это html:

<div class="loginNotVodafone" style="">

        <form id="loginNotVodafone" name="loginNotVodafone" action="https://urlblabla" method="post">      
          <!-- // GDPR select -->

          <fieldset>
          <input type="text" id="userFake2" name="userFake2" value="" autocomplete="off" placeholder="Username">
          <input type="hidden" id="user" name="UserName" class="hiddenTwo" value="">
          </fieldset>

          <fieldset>
          <input id="password" name="Password" value="" type="password" autocomplete="off" placeholder="Password">
          </fieldset>

        </form>
</div>

и это мой код:

inputuser = driver.find_element_by_id("userFake2")
inputuser.send_keys('[email protected]')
sleep(1);

password = driver.find_element_by_xpath(".//fieldset[.//input[@id='password']]")
password.click()
sleep(1);
password.send_keys('password')

Я всегда подтверждаю ошибку:

selenium.common.exceptions.ElementNotVisibleException: Message: element not 
visible

Проследить:

Traceback (most recent call last):
File "C:\Users\stefa\eclipse-workspace\main.py", line 36, in <module>
password.send_keys('password')
File "C:\Users\stefa\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 479, in send_keys
'value': keys_to_typing(value)})
File "C:\Users\stefa\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 628, in _execute
return self._parent.execute(command, params)
File "C:\Users\stefa\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 320, in execute
self.error_handler.check_response(response)
File "C:\Users\stefa\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
(Session info: chrome=67.0.3396.99)
(Driver info: chromedriver=2.41.578737 (49da6702b16031c40d63e5618de03a32ff6c197e),platform=Windows NT 10.0.17134 x86_64)

EDIT: с помощью этих команд я могу позволить курсору мигать в поле пароля:

password = driver.find_element_by_xpath("//*@id='loginNotVodafone']/fieldset[2]").click()
password.send_keys('password')

но получил сообщение об ошибке:

password.send_keys('password')
AttributeError: 'NoneType' object has no attribute 'send_keys'

EDIT2: сделано, см. Мой ответ ниже

  • 0
    Можете ли вы опубликовать полный TraceBack
  • 0
    добавлено в пост
Теги:
selenium
login

2 ответа

1
Лучший ответ

была проблема в xpath, поэтому я использовал аддон ChroPath для Chrome и дал мне правильный абсолютный и относительный путь

поэтому правильная команда была:

password = driver.find_element_by_xpath("/html[1]/body[1]/div[3]/div[1]/div[1]/div[1]/div[4]/form[1]/fieldset[3]/input[1]").send_keys('password')

или относительный Xpath:

password = driver.find_element_by_xpath("//form[@id='loginNotVodafone']//input[@id='password']").send_keys('password')
0

Попробуйте использовать WebDriverWait:

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "Password")))

Примечание: вам нужно добавить некоторые импортные товары:

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

WebDriverWait будет ждать не менее 10 секунд, пока элемент не будет доступен для кликабельности и только затем щелкнет по нему. Весь код будет выглядеть так:

inputuser = driver.find_element_by_id("userFake2")
inputuser.send_keys('[email protected]')

password = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "Password")))
password.click()
sleep(1); # make sure, that you really need this pause
password.send_keys('password')

EDIT: вы также можете попробовать использовать JavaScript:

inputuser = driver.find_element_by_id("userFake2")
inputuser.send_keys('[email protected]')

password = driver.find_element_by_id("password")
driver.execute_script("arguments[0].click();", password)
sleep(1); # make sure, that you really need this pause
password.send_keys('password')
  • 0
    спасибо за вашу помощь, но теперь я получаю "TimeoutException (message, screen, stacktrace)", он все еще не находит поле пароля
  • 0
    Это поле видно в браузере? Вы уверены, что это поле в формате HTML, которое вы опубликовали?
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню