代码之家  ›  专栏  ›  技术社区  ›  Stefano

Selenium Python元素不可见异常

  •  1
  • Stefano  · 技术社区  · 6 年前

    我在Python中使用Selenium,并试图完成一个登录表单,我已经 成功完成用户名字段,但无法完成密码。这是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@email.com')
    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)
    

    编辑: 通过这些命令,我可以让光标在密码字段中闪烁:

    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'
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Stefano    6 年前

    xpath中有一个问题,所以我为Chrome使用了一个名为ChroPath的插件,它给了我正确的绝对和相对路径

    所以正确的命令是:

    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')
    
        2
  •  0
  •   Andrei Suvorkov    6 年前

    尝试使用 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
    

    网络驱动器 将至少等待10秒,直到元素可以单击,然后才单击它。整个代码如下:

    inputuser = driver.find_element_by_id("userFake2")
    inputuser.send_keys('email@email.com')
    
    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')
    

    编辑: 你也可以尝试使用 JavaScript :

    inputuser = driver.find_element_by_id("userFake2")
    inputuser.send_keys('email@email.com')
    
    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')