我在Groovy脚本中使用HtmlUnit来解析网页。我希望能够检索每个元素的最终样式。这是一个测试脚本,它遍历整个页面并转储元素和属性,希望是样式。
经过一番挖掘,我发现http://old.nabble.com/Access-to-element-coputed-style-td24654513.html,这让我发现基本的htmlunit Grab调用不包括他所提到的类:com.gargoylesoftware.htmlunit.javascript.host.ComputedCSSStyleDeclaration
。
但我确实在http://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找到了有关ComputedCSSStyleDeclaration
的信息。
我使用该页面顶部的常春藤信息来构建我需要的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样式相关的两行,我会收到此错误:
Caught:java.lang.VerifyError:class com.gargoylesoftware.htmlunit.javascript.host.HTMLElement重写final方法jsxGet_tagName。()Ljava / lang / String; java.lang.VerifyError:class com.gargoylesoftware.htmlunit.javascript.host.HTMLElement重写final方法jsxGet_tagName。()Ljava / lang / String;
另一方面,如果我颠倒两个Grab语句的顺序,我会得到这个例外:
抓住:groovy.lang.MissingPropertyException:没有这样的属性:FIREFOX_10 for class:com.gargoylesoftware.htmlunit.BrowserVersion groovy.lang.MissingPropertyException:没有这样的属性:FIREFOX_10用于类:com.gargoylesoftware.htmlunit.BrowserVersion 在testHtmlUnit.run(testHtmlUnit.groovy:13)
这两者之间显然存在某种相互作用。看起来hudson jar包含一个完整但旧的HtmlUnit实现,它会覆盖当前的2.10版本。但是当它首先出现时,如上所示,似乎HTMLElement与JavaScript实现代码中的某些内容相冲突。
最重要的是我想添加从HtmlUnit中检索CSS样式的功能。如果这是正确的方法,我需要让这些罐子很好地协同工作。如果这是获取这些风格的错误方法,我会很感激如何实现它的帮助。无论哪种方式,谢谢!