`

HtmlUnit解析html会丢掉不可见的Element

阅读更多

最近使用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获取执行js代码后的html文档

    HTMLUnit是一个Java库,设计用于模拟浏览器行为,特别是在无头模式下执行JavaScript并解析HTML文档。这个库在自动化测试、网页抓取以及其他需要与网页交互的场景中非常有用。通过HTMLUnit,开发者可以编写程序来模拟...

    htmlunit依赖的所有jar

    解析HTML文档时,HTMLUnit可能依赖`nekohtml-x.x.jar`,这是一个开源的非验证HTML解析器,它能够容忍HTML文档中的语法错误,并生成一个结构化的XML树。 4. **JavaScript支持**: 为了执行网页上的JavaScript代码...

    htmlunit 及其 依赖包

    HTMLUnit需要它来解析HTML文档,因为HTML本质上是XML的一个子集。这个版本的Xerces提供了对XML 1.0和1.1规范的支持,以及XML Schema和Namespaces的处理。 3. **httpclient-4.5.2.jar**:Apache HttpClient是一个...

    htmlunit-2.1.5源码

    5. **异常处理和错误报告**:HTMLUnit在遇到JavaScript错误或其他问题时会抛出异常,这有助于调试和定位代码中的问题。 6. **性能**:由于其轻量级设计,HTMLUnit通常比其他完整的Web浏览器模拟器(如Selenium ...

    Htmlunit2.23-bin.zip

    HTMLUnit的一个显著优点是它的速度,因为不需要启动真正的浏览器实例,所以执行速度比使用Selenium等其他工具要快得多。然而,由于它是一种无头浏览器模拟,对于某些复杂的页面交互或特定的JavaScript库支持可能会...

    htmlunit基本jar包

    HTMLUnit的核心功能在于它可以解析和执行HTML、JavaScript,甚至CSS,这使得它在进行网页自动化测试时非常有用。由于它是无头的,即没有图形用户界面,所以它非常适合在服务器环境中运行,例如持续集成(CI)流程中。 ...

    htmlunit依赖jar包

    这些依赖通常会自动解决,但如果使用的是较旧的HTMLUnit版本,可能需要手动添加缺失的jar包。 总的来说,HTMLUnit是一个强大且灵活的工具,可以让你在Java环境中无需实际浏览器即可执行Web交互。它简化了网页爬虫的...

    htmlunit-2.31.jar

    3. **快速且轻量级**:由于不依赖于完整的浏览器引擎,HTMLUnit比其他类似的工具(如Selenium)更快,占用资源更少,特别适合大规模的Web抓取项目。 4. **页面解析**:HTMLUnit能够解析HTML文档,提取出所需的信息...

    java htmlunit-2.14

    在HTMLUnit中,NekoHTML帮助处理不完整的或非标准的HTML代码,确保正确解析页面结构。 6. **sac**:Simple API for CSS (SAC) 是一个用于解析CSS的抽象语法树API。HTMLUnit可能使用SAC来解析CSS规则,以便理解和...

    htmlUnit所需jar包

    1. **HtmlUnit主库**:这是核心的HTMLUnit.jar文件,提供了对HTML文档的解析、渲染和交互功能。 2. **WebClient**:HTMLUnit的WebClient类允许模拟浏览器行为,如发送HTTP请求、处理响应、设置cookies等。 3. **...

    htmlunit参考文档

    5. **异常处理**:当遇到JavaScript错误或者网络问题时,HTMLUnit会抛出异常,帮助开发者定位问题。 二、使用场景 1. **自动化测试**:HTMLUnit常用于编写自动化Web应用测试,因为它可以模拟用户交互,如点击按钮...

    htmlunit源码

    2. **JavaScript支持**:HTMLUnit不仅仅解析HTML,还支持执行JavaScript代码,这对于理解和操作动态生成的网页内容至关重要。它使用 Rhino 和 Netty 引擎来处理JavaScript,能够处理AJAX请求和其他基于JavaScript的...

    基于ApacheNutch和Htmlunit的扩展实现AJAX页面爬虫抓取解析插件nutch-htmlunit.zip

    基于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 ...

    htmlunit-2.20.zip

    6. **错误处理**:HTMLUnit会捕获并报告JavaScript错误,帮助开发者调试和优化代码。 7. **性能**:由于其无头特性和轻量级设计,HTMLUnit通常比启动完整浏览器更快,减少了资源消耗。 为了在Java项目中使用...

    htmlunit用到的jar包

    NekoHTML能处理不规范的HTML,确保HTMLUnit可以正确地解析页面。 3. **net.sourceforge.cssparser.jar**:这个库用于解析和操作CSS样式。HTMLUnit使用它来理解和应用网页的CSS规则,从而呈现元素的样式。 4. **...

    htmlunit2.9

    5. **异常处理**: 在处理网页时,HTMLUnit可能会遇到各种错误,如网络超时、无效的HTML或JavaScript错误。开发者需要学习如何捕获和处理这些异常,确保测试脚本的健壮性。 6. **API使用**: 学习HTMLUnit的API是使用...

    htmlunit-2.14

    5. **异常处理**:在处理网页时,HTMLUnit会抛出各种异常来表示可能出现的问题,如找不到元素、JavaScript错误或网络问题。开发者需要捕获这些异常来确保测试的健壮性。 6. **API文档**:`htmlunit-2.14`中的API...

    htmlunit-2.36和htmlunit-2.50,包括关联文件

    HTMLUnit是Java编程语言中的一款无头Web浏览器库,它模拟了浏览器的行为,但不涉及图形用户界面。这个工具主要用于自动化测试和网络爬虫,因为它能够解析HTML、执行JavaScript,并与网页上的各种元素进行交互。在...

    htmlunit所需要jar包

    这些jar包的组合使得HTMLUnit能够正确解析和执行网页,包括处理HTML、CSS、JavaScript以及进行网络通信,从而为开发者提供了一种强大的无头浏览器解决方案。在使用HTMLUnit时,确保这些依赖项完整并正确配置,可以...

Global site tag (gtag.js) - Google Analytics