斯宾纳 - 访问 DOM



我刚刚了解到浏览器的"查看源代码"和"检查元素"之间存在差异。当我在特定网页上使用火狐中的"检查"时,我得到以下结果:

<html>
 ...
    <div class="someClass" id="someID" style="z-index: 12001; left: 0px; top: -487px; width: 1288px; height: 843px; opacity: 0.7; visibility: visible;">
 ...
</html>

但是,当我使用"查看源代码"时,我没有看到这个元素。当我通过 Spynner 访问网页并解析 html 时,会出现看不到元素的问题。由于我需要知道"可见性"的值,我的问题是:如何在 Spynner 中访问 DOM?

我已经尝试了以下源代码:

br = spynner.Browser()
br.show()
br.load(url)
ret = br.runjs('document.getElementById('someID');")
print ret

但这只会打印出来:

<PyQt4.QtCore.QVariant object at 0x9870e64>

//

编辑

由于 ret 是一个 QVariant,我设法通过修改我的代码将其转换为 PyObject:

ret = br.runjs('document.getElementById('someID').getAttribute('style');")
print ret.toPyObject()

我现在唯一的问题是:打印仅显示"样式"的第一个值

z-index: 9999;

我可以以某种方式访问其他值(左侧、顶部、高度、不透明度、可见性)吗?

动态添加的控件在浏览器的视图源选项(在 Mozilla 中)中不可见,但它们会在 DOM 中更新。您可以直接搜索元素并读取其可见性值。

//read visibility value and store it in x
var x =  document.getElementById("someID").getAttribute("visibility");
alert(x); // display value of x in a pop

我发现我搞砸了我的代码。我插入了"someOtherID",而不是"someID",它不包含我正在寻找的属性。这个愚蠢的错误花了我很多时间。

然后另一件事是:我正在寻找的元素是一个java弹出窗口。如果用户提供不允许的输入,则此弹出窗口将显示并需要确认。所以我现在所做的不是检查弹出窗口是否"可见",而是检查确认按钮是否"未禁用"。这是通过以下方式完成的:

val items = document.getElementsByTagName('input');
for(var i=0; i<items.length; i++){
  if(items[i].getAttribute('name') == inputName){
    if(items[i].getAttribute('disabled') == null){
      items[i].click();}}}

这个 js 代码通过 spynner 内部的 runjs()-方法调用。解决方案可能是行人,但它对我有用。我也知道这个解决方案非常具体。但也许有一天有人可能会遇到类似的问题。

最新更新