最近使用htmlunit来作为后端抽取数据,htmlunit的DOM解析,使用xpath定位结点的过程发现有这个问题。
不知道是故意这么做,还是个bug。
于是对重写了前端获取xpath的代码,让它也忽略不可见Element,保持一致,可以解决我们的问题:
function getXPath(element){
if (element && element.id)
return '//*[@id="' + element.id + '"]';
var paths = [];
for (; element && element.nodeType == 1; element = element.parentNode){
var index = 0;
for (var sibling = element.previousSibling; sibling; sibling = sibling.previousSibling){
if (sibling.localName == element.localName && isVisible(sibling))
++index;
}
var tagName = element.localName.toLowerCase();
var pathIndex = (index ? "[" + (index+1) + "]" : "");
paths.splice(0, 0, tagName + pathIndex);
}
return paths.length ? "/" + paths.join("/") : null;
};
判断是否可见:
function isVisible(element){
var doc = element.ownerDocument;
var docView = XPCOMUtils.QI(doc,_CI.nsIDOMDocumentView);
var viewCss = XPCOMUtils.QI(docView.defaultView,_CI.nsIDOMViewCSS);
var computedCss = viewCss.getComputedStyle(element,"");
var visiable = computedCss.getPropertyCSSValue("visibility").getStringValue();
var display = computedCss.getPropertyCSSValue("display").getStringValue();
return visiable != "hidden" && display != "none";
}
其中XPCOMUtils是XPCOM的QueryInterface, createInstance,getService的一个代码简化的封装:
var _CI = Components.interfaces;
var _CC = Components.classes;
function XPCOMUtils() {}
(function() {
this.CCSV = function(cName, ifaceName)
{
if (_CC[cName])
return _CC[cName].getService(_CI[ifaceName]); // if fbs fails to load, the error can be _CC[cName] has no properties
else
alert("Can't get the components class name: " + cName);
};
this.CCIN = function(cName, ifaceName)
{
return _CC[cName].createInstance(_CI[ifaceName]);
};
this.QI = function(obj, iface)
{
return obj.QueryInterface(iface);
};
// ************************************************************************************************
}).apply(XPCOMUtils);
分享到:
相关推荐
HTMLUnit是一个Java库,设计用于模拟浏览器行为,特别是在无头模式下执行JavaScript并解析HTML文档。这个库在自动化测试、网页抓取以及其他需要与网页交互的场景中非常有用。通过HTMLUnit,开发者可以编写程序来模拟...
解析HTML文档时,HTMLUnit可能依赖`nekohtml-x.x.jar`,这是一个开源的非验证HTML解析器,它能够容忍HTML文档中的语法错误,并生成一个结构化的XML树。 4. **JavaScript支持**: 为了执行网页上的JavaScript代码...
HTMLUnit需要它来解析HTML文档,因为HTML本质上是XML的一个子集。这个版本的Xerces提供了对XML 1.0和1.1规范的支持,以及XML Schema和Namespaces的处理。 3. **httpclient-4.5.2.jar**:Apache HttpClient是一个...
5. **异常处理和错误报告**:HTMLUnit在遇到JavaScript错误或其他问题时会抛出异常,这有助于调试和定位代码中的问题。 6. **性能**:由于其轻量级设计,HTMLUnit通常比其他完整的Web浏览器模拟器(如Selenium ...
HTMLUnit的一个显著优点是它的速度,因为不需要启动真正的浏览器实例,所以执行速度比使用Selenium等其他工具要快得多。然而,由于它是一种无头浏览器模拟,对于某些复杂的页面交互或特定的JavaScript库支持可能会...
HTMLUnit的核心功能在于它可以解析和执行HTML、JavaScript,甚至CSS,这使得它在进行网页自动化测试时非常有用。由于它是无头的,即没有图形用户界面,所以它非常适合在服务器环境中运行,例如持续集成(CI)流程中。 ...
这些依赖通常会自动解决,但如果使用的是较旧的HTMLUnit版本,可能需要手动添加缺失的jar包。 总的来说,HTMLUnit是一个强大且灵活的工具,可以让你在Java环境中无需实际浏览器即可执行Web交互。它简化了网页爬虫的...
3. **快速且轻量级**:由于不依赖于完整的浏览器引擎,HTMLUnit比其他类似的工具(如Selenium)更快,占用资源更少,特别适合大规模的Web抓取项目。 4. **页面解析**:HTMLUnit能够解析HTML文档,提取出所需的信息...
在HTMLUnit中,NekoHTML帮助处理不完整的或非标准的HTML代码,确保正确解析页面结构。 6. **sac**:Simple API for CSS (SAC) 是一个用于解析CSS的抽象语法树API。HTMLUnit可能使用SAC来解析CSS规则,以便理解和...
1. **HtmlUnit主库**:这是核心的HTMLUnit.jar文件,提供了对HTML文档的解析、渲染和交互功能。 2. **WebClient**:HTMLUnit的WebClient类允许模拟浏览器行为,如发送HTTP请求、处理响应、设置cookies等。 3. **...
5. **异常处理**:当遇到JavaScript错误或者网络问题时,HTMLUnit会抛出异常,帮助开发者定位问题。 二、使用场景 1. **自动化测试**:HTMLUnit常用于编写自动化Web应用测试,因为它可以模拟用户交互,如点击按钮...
2. **JavaScript支持**:HTMLUnit不仅仅解析HTML,还支持执行JavaScript代码,这对于理解和操作动态生成的网页内容至关重要。它使用 Rhino 和 Netty 引擎来处理JavaScript,能够处理AJAX请求和其他基于JavaScript的...
基于Apache Nutch 1.8和Htmlunit组件,实现对于AJAX加载类型页面的完整页面内容抓取解析。 According to the implementation of Apache Nutch 1.8, we can't get dynamic HTML information from fetch pages ...
6. **错误处理**:HTMLUnit会捕获并报告JavaScript错误,帮助开发者调试和优化代码。 7. **性能**:由于其无头特性和轻量级设计,HTMLUnit通常比启动完整浏览器更快,减少了资源消耗。 为了在Java项目中使用...
NekoHTML能处理不规范的HTML,确保HTMLUnit可以正确地解析页面。 3. **net.sourceforge.cssparser.jar**:这个库用于解析和操作CSS样式。HTMLUnit使用它来理解和应用网页的CSS规则,从而呈现元素的样式。 4. **...
5. **异常处理**: 在处理网页时,HTMLUnit可能会遇到各种错误,如网络超时、无效的HTML或JavaScript错误。开发者需要学习如何捕获和处理这些异常,确保测试脚本的健壮性。 6. **API使用**: 学习HTMLUnit的API是使用...
5. **异常处理**:在处理网页时,HTMLUnit会抛出各种异常来表示可能出现的问题,如找不到元素、JavaScript错误或网络问题。开发者需要捕获这些异常来确保测试的健壮性。 6. **API文档**:`htmlunit-2.14`中的API...
HTMLUnit是Java编程语言中的一款无头Web浏览器库,它模拟了浏览器的行为,但不涉及图形用户界面。这个工具主要用于自动化测试和网络爬虫,因为它能够解析HTML、执行JavaScript,并与网页上的各种元素进行交互。在...
这些jar包的组合使得HTMLUnit能够正确解析和执行网页,包括处理HTML、CSS、JavaScript以及进行网络通信,从而为开发者提供了一种强大的无头浏览器解决方案。在使用HTMLUnit时,确保这些依赖项完整并正确配置,可以...