1

我在 Groovy 脚本中使用 HtmlUnit 来解析网页。我也希望能够检索每个元素的最终样式。这是一个测试脚本,它遍历整个页面并转储元素和属性,希望还有样式。

经过一番挖掘,我找到了http://old.nabble.com/Access-to-element-coputed-style-td24654513.html,这让我发现基本的 htmlunit Grab 调用不包括他提到的类:com.gargoylesoftware.htmlunit.javascript.host.ComputedCSSStyleDeclaration.

但我确实ComputedCSSStyleDeclarationhttp://www.jarvana.com/jarvana/view/org/jvnet/hudson/htmlunit/2.2-hudson-9/htmlunit-2.2-hudson-9.jar!/com/gargoylesoftware/找到了有关信息htmlunit/javascript/host/ComputedCSSStyleDeclaration.class?classDetails=ok

我使用该页面顶部的 Ivy 信息来构建我需要的 Grab 语句。但是,这两个条目似乎相互冲突。这是我的代码:

@Grab('org.jvnet.hudson:htmlunit:2.2-hudson-9')
@Grab('net.sourceforge.htmlunit:htmlunit:2.10')

import com.gargoylesoftware.htmlunit.*
import com.gargoylesoftware.htmlunit.javascript.host.*

RefreshHandler rh = new RefreshHandler() {
    void handleRefresh( final Page page, final URL url, final int seconds ) {}
}

client = new WebClient(BrowserVersion.FIREFOX_10)
client.setRefreshHandler(rh)

client.javaScriptEnabled = false
client.appletEnabled = false
client.cssEnabled = true
page = client.getPage('http://www.google.com/')
parseChildren(page.documentElement)

def parseChildren(node) {
    println "open ${node.nodeName}"
    node.attributes.each { attr ->
        println "   ${attr.key}/${attr.value.name} = ${attr.value.value}"
    }
    //ComputedCSSStyleDeclaration style = ((HTMLElement)node.getScriptObject()).jsxGet_currentStyle()
    //println "       style: ${style.dump()}"
    node.childElements.each { child ->
        parseChildren(child)
    }
    println "close ${node.nodeName}"
}

如果我按上面显示的顺序运行 Grab 语句,脚本运行完美,但没有样式信息。但是,如果我尝试取消注释与 CSS 样式相关的两行,我会收到以下错误:

捕获:java.lang.VerifyError:com.gargoylesoftware.htmlunit.javascript.host.HTMLElement 类覆盖最终方法 jsxGet_tagName.()Ljava/lang/String;java.lang.VerifyError:com.gargoylesoftware.htmlunit.javascript.host.HTMLElement 类覆盖最终方法 jsxGet_tagName.()Ljava/lang/String;

另一方面,如果我颠倒两个 Grab 语句的顺序,我会得到这个异常:

捕获:groovy.lang.MissingPropertyException:没有这样的属性:FIREFOX_10 类:com.gargoylesoftware.htmlunit.BrowserVersion groovy.lang.MissingPropertyException:没有这样的属性:FIREFOX_10 类:com.gargoylesoftware.htmlunit.BrowserVersion at testHtmlUnit.run(testHtmlUnit .groovy:13)

这两者之间显然存在某种互动。看起来 hudson jar 包含一个完整但旧的 HtmlUnit 实现,当它最后出现时会覆盖当前的 2.10 版本。但是当它首先出现时,如上所示,HTMLElement 似乎与 JavaScript 实现代码中的某些内容发生冲突。

底线是我想添加从 HtmlUnit 检索 CSS 样式的功能。如果这是正确的方法,我需要让这些罐子很好地协同工作。如果这是获取这些样式的错误方法,我将不胜感激有关如何完成它的帮助。不管怎样,谢谢!

4

0 回答 0