【发布时间】:2021-11-19 13:04:25
【问题描述】:
我正在尝试使用 python selenium 执行一些自动化功能,但遇到了一些奇怪的行为。
html的总体布局:
<html>
<body>
<div class="parent">
<iframe style="display: none"> ... </iframe>
<iframe style="display: none"> ... </iframe>
<iframe style="display: block">
#document
...
<div class="someClass"> ... </div>
</iframe>
<iframe style="display: none"> ... </iframe>
<iframe style="display: none"> ... </iframe>
</div>
</body>
现在,每个 iframe 实际上都有相同的内部 html,并且来自网站的代码似乎是随机选择哪个 iframe 获取display="block"。但是,我找不到任何 iframe。
我尝试了一种标准方式:iframe = driver.find_elements_by_xpath("//iframe[contains(@style, 'display:block')]")
失败了,然后我试图找到任何 iframe:driver.find_element_by_tag_name("iframe")
它们都没有找到任何 iframe 元素。我看到以下错误:
Traceback (most recent call last):
File "myfile.py", line 60, in <module>
iframe = driver.find_element_by_xpath("//iframe[contains(@style, 'display: block')]")
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
return self.find_element(by=By.XPATH, value=xpath)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
'value': value})['value']
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: The result of the xpath expression "//iframe[contains(@style, 'display: block')]" is: [object HTMLIFrameElement]. It should be an element.
(Session info: chrome=93.0.4577.63)
关于为什么 xpath 返回 [object HTMLIFrameElement] 以及为什么我在通过 xpath 搜索时无法像访问其他对象一样访问它有什么想法吗?
编辑
新代码选项 1:
iframes = driver.find_elements_by_xpath(".//iframe[contains(@style,'display: block')]")
这仍然会引发与上面完全相同的错误
新代码选项 2:
parent = driver.find_element_by_xpath("//div[@class='parent']")
iframes = parent.find_elements_by_tag_name("iframe")
// when I print typeof iframes here, it's a list of dicts
// find the right index. Here, for simplicity, I just set it a default value
index = 4
// ...
driver.switch_to.frame(iframes[index])
我收到以下错误:
Traceback (most recent call last):
File "myfile.py", line 76, in <module>
driver.switch_to.frame(iframe)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\switch_to.py", line 89, in frame
self._driver.execute(Command.SWITCH_TO_FRAME, {'id': frame_reference})
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: missing 'ELEMENT'
(Session info: chrome=93.0.4577.82)
当我打印出 iframe 时:
[{}, {}, {}, {}, {u'ontouchmove': {}, u'ontouchstart': {}}, {}, {}, {}, {}, {}]
作为参考,这是我要访问的页面。有时您必须刷新几次才能获得挑战,而使用 selenium 时会更频繁。此外,使用无头模式会导致每次都发生挑战...https://catalog.usmint.gov/coins/coin-programs/morgan-and-peace-silver-dollar-coins/
【问题讨论】:
-
没有。正如我在问题中提到的那样,我什至在尝试切换到它之前都找不到该元素
-
您是否已在 selenium 中导出了 html 源代码,以确保这些元素存在以供手动检查/搜索?与在完整桌面浏览器中呈现的方式相比,目标网页可能不会像您期望的那样通过模拟浏览器呈现。我记得在过去广泛追查类似的问题只是发现 webdriver 浏览器呈现完全不同的内容与完整的 chrome 浏览器。
-
我确实尝试导出 html,但它正在动态呈现。在导出的 html 中,我确实看到了一些 iframe 元素,但它们都没有子元素。这与我在查看开发人员选项时看到的不同,但我认为如果它是动态渲染的,我希望看到不同,对吧?
标签: python selenium selenium-webdriver iframe captcha