Selenium中的iFrame问题

时间:2011-06-15 20:30:36

标签: python iframe selenium

我正在尝试使用Selenium(在Python中)抓取一个几乎完全是Javascript的网页 例如,这是页面的正文:

<body class="bodyLoading">
<!-- this is required for GWT history support -->
<iframe id="__gwt_historyFrame" role="presentation" width="0" height="0" tabindex="-1" title="empty" style="position:absolute;width:0;height:0;border:0" src="javascript:''">  </iframe>
<!-- For printing window contents  -->
<iframe id="__printingFrame" role="presentation" width="0" height="0" tabindex="-1" title="empty" style="width:0;height:0;border:0;"   />


<!-- TODO : RECOMMENDED if your web app will not function without JavaScript enabled -->
<noscript>
<div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
 Your web browser must have JavaScript enabled in order for
 Regulations.gov to display correctly.
</div>
</noscript>
</body>

出于某种原因,selenium(使用Firefox引擎)不评估此页面上的javascript。如果我使用get_html_source函数,它只返回上面的html,而不是我在浏览器(以及Selenium浏览器中)中看到的JavaScript导入的HTML。不幸的是,我无法弄清楚iFrame中的src属性只是说javascript:我无法弄清楚。

有关如何确保Selenium处理此iFrame的任何想法?

1 个答案:

答案 0 :(得分:4)

iframe是单独的文档,因此您不会将其内容包含在主页的HTML代码中;你必须单独阅读它们。

您可以使用Selenium的select_frame函数执行此操作。

您可以通过其名称,CSS选择器,xpath引用等访问框架,与其他元素一样。

当您选择框架时,您可以更改Selenium的上下文,这样您就可以像访问当前页面一样访问框架的内容。

如果帧中有帧,则可以通过帧树继续此过程。

显然,您需要一种返回帧路径的方法。 Selenium提供此功能,允许您使用相同的select_frame函数,使用relative=up参数将上下文移动到当前帧的父级,或relative=top移动到浏览器中的主页面。

因此,使用此功能,您可以浏览页面中的帧。

您无法一次访问所有内容;只有一个帧可以同时出现在上下文中,因此您永远无法进行单个get_html_source调用并立即获取所有帧的内容,但您可以在Selenium脚本中浏览页面中的帧并分别获取每个帧的HTML源代码。

希望有所帮助。

相关问题