我正在编写一个脚本,使用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"]')
答案 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 元素。因此,我们需要构建一个唯一的css
或xpath
,它将唯一标识会员编号/用户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)