使用Selenium对隐藏元素进行数据输入(Python 2.7) - 元素不可见

时间:2018-01-10 00:24:56

标签: python selenium

我正在编写一个脚本,使用Selenium和Python 2.7登录我的银行帐户。从历史上看,它有效,但它现在抛出一个ElementNotVisibleException异常。这是我的代码:

import time
import os 
import subprocess
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import ui

user_id = raw_input('Enter your account number')
password = raw_input('Enter your password')

driver = webdriver.Chrome()  # Optional argument, if not specified will search path.

def regular():

    site = driver.get('https://www.meridiancu.ca/');

    enter_user_id = driver.find_element_by_xpath('//*[@id="memberNo"]').send_keys(user_id)

regular()

这是我的错误消息:

Traceback (most recent call last):
  File "C:\Users\Desktop\Programming\Python Files\Monthly\Banking.py", line 50, in <module>
    regular()
  File "C:\Users\Desktop\Programming\Python Files\Monthly\Banking.py", line 19, in regular
    enter_user_id = driver.find_element_by_xpath('//*[@id="memberNo"]').send_keys(user_id)
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 349, in send_keys
    'value': keys_to_typing(value)})
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 493, in _execute
    return self._parent.execute(command, params)
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 256, in execute
    self.error_handler.check_response(response)
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, in check_response
    raise exception_class(message, screen, stacktrace)
ElementNotVisibleException: Message: element not visible**
  (Session info: chrome=63.0.3239.84)
  (Driver info: chromedriver=2.30.477700 (0057494ad8732195794a7b32078424f92a5fce41),platform=Windows NT 10.0.16299 x86_64)

enter_user_id = driver.find_element_by_xpath('//*[@id="memberNo"]')

引发了异常

4 个答案:

答案 0 :(得分:0)

我主要熟悉C#,所以你可能需要花一点时间找到确切的方法翻译,但这就是我的建议:

首先,看看你是否找到了一个实际上并不是你想要的元素(应该有一个element.Highlight()方法,或者如果它不起作用,则为元素。位置)

然后,看看是否有任何儿童掩盖它(如果它确实点击了它们)

如果这不起作用,use action chains将鼠标移动到元素的位置并单击它。

如果您需要帮助实施此

,请随时问我

答案 1 :(得分:0)

因为你的xpath可以匹配5个元素而第一个元素是隐藏的,这就是报告&#39; ElementNotVisiableException&#39;的原因。

为什么你的剧本以前有效,但现在。我认为网站重新设计,现在它支持响应差异浏览器大小。对于不同的浏览器大小,UserID有5个输入框。

更改为

enter_user_id = driver.find_element_by_css_selector('div.desktop input[name="memberNo"]').send_keys(user_id)

请首先在浏览器DevTool中手动测试css选择器:div.desktop input[name="memberNo"],确认它可以在您的浏览器大小下运行。如果它无法正常工作,请自行更改css选择器。

答案 2 :(得分:0)

当您尝试将 xpath 标识为 //*[@id="memberNo"] 会员编号/用户ID 字段时,此xpath完全正确匹配HTML中的 5 元素。因此,我们需要构建一个唯一的cssxpath,它将唯一标识会员编号/用户ID 字段,如下所示:

  • <强> xpath

    driver.find_element_by_xpath("//div[@class='homepage-banner-block-grx desktop']//input[@id='memberNo' and @type='text']").send_keys(user_id)
    
  • <强> css_selector

    driver.find_elements_by_css_selector("div.homepage-banner-block-grx.desktop input#memberNo[type=text]").send_keys(user_id)  
    

注意

  • 构建xpath时,请确保我们需要避免START TO JUMP CONTENT LINK部分mobile nav部分中的字段会员编号/用户ID ,并使用{ {1}}课程。

  • 此外,我们需要确保mobile-buttons标识文字字段,而不是隐藏字段。

  • 最后,如果您在元素上调用xpath方法,则返回 void

答案 3 :(得分:-1)

问题在于有5个INPUT个标记,每个标记的标识为memberNo,但只有一个标记可见。我在过去的这种情况下所做的是获取与该定位器匹配的元素集合,并将列表过滤到仅可见的那些。您最终应该只在列表中使用一个元素,即您想要的元素。这应该看起来像

memberNos = filter(lambda e: e.is_displayed(), driver.find_elements_by_css_selector("#memberNo"))
memberNos[0].send_keys(user_id)