我目前正在使用 Selenium 进行网络爬虫应用程序,在几个成功的模块之后,以下情况让我陷入困境:我试图找到“菜单”类的一个元素,其文本“报告”位于名为的框架内“框架_应用”。
很简单,对吧?应该很简单:
browser = webdriver.Chrome()
#Do the necessary crawling to get to this specific menu...
browser.switch_to_frame('frame_applic')
for obj in browser.find_elements_by_class_name('menu'):
if obj.text == 'Reports':
bt_reports = obj
break
#The variable bt_reports should be the one requested.
这就是有趣的地方:虽然当我尝试切换到所需的框架时没有引发错误,但没有找到类名“menu”的元素。我肯定拼错了框架或类名,对吧?因此,在决定检查 HTML 并且不进行任何其他更改后,元素就在那里,就好像仅查看网页源代码的行为就改变了结果。这里可能发生什么?
我不允许发布完整的 HTML,但以下结构包含了该问题:
<html>
<head>
<TITLE>Page</TITLE>
</head>
<frameset ...>
<frame name="frame_menu" src="https:..." >
<frame name="frame_applic" src="menu.asp?...">
#document
<table width="100%" border="0" cellpadding="5" cellspacing="0">
<tr>
<td colspan="2" align="right">
<table width="95%" border="0" cellpadding="5" cellspacing="0">
<tr><td><a href="https:..." class="menu">Reports</a></td></tr>
<tr><td><a href="https:..." class="menu">Change Password</a></td></tr>
<tr><td><a href="https:..." class="menu">Change Secret Phrase</a></td></tr>
</table>
</td>
</tr>
</table>
</body>
<frame name="frame_bottom" src="https:...">
</frameset>
</html>
经过仔细检查,我发现根本问题是所需框架的源信息位于 Active Server Page (asp) 中,如下所示:
<frame name="frame_applic" src="menu.asp?...">
而且无法从我所在的页面直接访问它。
检查浏览器上的元素的行为显然会强制这些元素在 webdriver 实例中共存,从而允许我获取框架内的元素,而它们以前是无法访问的。
我能够通过首先找到请求的帧,然后将网络驱动程序指向它的源来解决这个问题,方法是:
browser.get(browser.find_element_by_xpath("//frame[@name='frame_applic']")\
.get_attribute('src'))
然后像我之前所做的那样简单地获取元素:
menu_list = browser.find_elements_by_class_name('menu')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)