在尝试使用Selenium在python中查找元素时,我一直收到NoSuchElementException。我正在等待页面完全加载,我正在切换到正确的框架(或者至少我认为是这样!)。
以下是代码:
driver.get("https://www.arcgis.com/home/signin.html")
driver.implicitly_wait(10)
driver.switch_to_frame("oAuthFrame")
elem = driver.find_element_by_name('username')
elem1 = driver.find_element_by_name('password')
以下是我尝试访问的网页部分:
<input id="user_username" class="textBox" type="text" name="username" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false">
位于
内<iframe dojoattachpoint="_iFrame" id="oAuthFrame" scrolling="no" style="display: block; border: 0px;" marginheight="0" marginwidth="0" frameborder="0" width="400" height="500"...>
您可以在https://www.arcgis.com/home/signin.html
查看自己的源代码完整错误输出:
Traceback (most recent call last):
File "C:\Python34\beginSample.py", line 12, in <module>
elem = driver.find_element_by_name('username')
File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", l
ine 302, in find_element_by_name
return self.find_element(by=By.NAME, value=name)
File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", l
ine 662, in find_element
{'using': by, 'value': value})['value']
File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", l
ine 173, in execute
self.error_handler.check_response(response)
File "C:\Python34\lib\site-packages\selenium\webdriver\remote\errorhandler.py"
, line 164, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: 'no such element\n
(Session info: chrome=35.0.1916.153)\n (Driver info: chromedriver=2.9.248315,pl
atform=Windows NT 6.1 SP1 x86_64)'
如果有人可以帮我弄清楚什么是错的,我会非常感激。
更新:我现在正在使用操作,我已经调试到没有错误,但也没有输入任何内容。这是代码:
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
actions = ActionChains(driver)
actions.send_keys("sd")
actions.send_keys(Keys.TAB)
actions.send_keys("bg")
actions.perform()
答案 0 :(得分:0)
我个人试着坚持使用xpath并利用xquery功能。您仍然可以使用其他附件,因为它们通常是元素的“属性”,但它为包含搜索的复杂类型提供了更大的灵活性。我能够找到带有以下两个附加xpath的用户名/密码字段。你不应该首先切换到iframe ......虽然有些像name这样的直接调用似乎不起作用...... xpath版本对我有用。
element = driver.find_element_by_xpath("//input[@name='username']")
element1 = driver.find_element_by_xpath("//input[@name='password']")
<强>更新强>: 我能够复制这个问题...... 我不确定为什么定位器不能正常运行,但这是一个可行的工作。加载页面时焦点的默认位置是用户名框。
actions = selenium.webdriver.common.action_chains.ActionChains(driver)
actions.SendKeys("sd").Perform()
actions.SendKeys(selenium.webdriver.common.Keys.Tab).Perform()
actions.SendKeys("bg").Perform()
http://selenium.googlecode.com/git/docs/api/py/webdriver/selenium.webdriver.common.action_chains.html 如果我能想出一种直接连接到字段的方法,我会再次更新。
更新:对于Chrome,如果您获取特定的iFrame,您会看到一条错误消息,指出您的浏览器不支持此iFrame。我相信通信故障可能在浏览器中无法正确读取它...即使它似乎渲染它并正确地允许功能。由于Selenium基于DOM选择,因此它会尝试利用类似的行为来找到它。我建议尝试driver.execute_script("script goes here")
并尝试使用javascript纯粹找到它,看看是否可行。您当然必须继续使用javascript并直接使用javascript修改控件属性/属性,然后为该按钮执行javascript submit事件。