获取所有表行并使用 CasperJS 中的 XPath 查询返回它们
Getting all table rows and returning them using an XPath query in CasperJS
我正在使用Casper.js来自动进行常规上传。我已经设法上传了文件并检查它是否有效,但我想解析如果出现错误则返回的表,但我得到错误[error] [remote] findAll(): invalid selector provided "[object Object]":Error: SYNTAX_ERR: DOM Exception 12
.这是我代码的相关部分:
casper.then(function() {
if (this.fetchText('.statusMessageContainer').match(/Sorry, the file did not pass validation. Please review the validation errors in the report below/)) {
this.echo("Upload failed!", "ERROR");
errors = this.evaluate(function() {
var errorRows = __utils__.findAll({
type: 'xpath',
path: '//table[@id="uploadTable"]/tr[position()>1]'
});
return Array.prototype.forEach.call(errorRows, function(e) {
return e;
});
});
this.echo(JSON.stringify(errors));
} else {
this.echo("Upload successful", "INFO");
}
});
有什么想法吗?
虽然你可能有一个XPath语法错误,但你必须知道你不能从传递给evaluate()
方法的闭包中返回DOM元素;你必须将你的NodeList
和HTMLelement
实例转换为一些原生的Javascript类型,例如。数组、对象、字符串等...
此外,ClientUtils 模块中还有一个方便的getElementsByXPath()
方法,您可以从加载的每个页面中自动注入的__utils__
实例中使用:
casper.then(function() {
if (this.fetchText('.statusMessageContainer').match(/Sorry, the file did not pass validation. Please review the validation errors in the report below/)) {
this.echo("Upload failed!", "ERROR");
var errors = this.evaluate(function() {
var errorRows = __utils__.getElementsByXPath('//table[@id="uploadTable"]/tr[position()>1]');
return Array.prototype.map.call(errorRows, function(e) {
return e.innerText; // let's get node text instead of HTMLelement!
});
});
this.echo(JSON.stringify(errors));
} else {
this.echo("Upload successful", "INFO");
}
});
您还可以使用 ClientUtils 书签在浏览器控制台中测试您的选择器。例如,单击书签并在 js 控制台中执行此操作:
__utils__.getElementsByXPath('//table[@id="uploadTable"]/tr[position()>1]')
然后你会看到你的选择器是否正确(它在我身边工作——我的意思是它在语法上是正确的)。
从您的错误来看,您的选择器似乎有问题。从我所看到的来看,它的设置正确,除了一件事:尝试将'//table[@id="uploadTable"]/tr[position()>1]'
更改为'//table[@id='uploadTable']/tr[position()>1]'
(将"更改为")
除此之外,您的 XPath 在语法上看起来是正确的,所以我不确定为什么它会成为无效的选择器。
- 在 JavaScript 中查找包含 XPath 字符串的所有元素
- 使用XPath选择包含文本的节点,而不考虑CasperJS中的空白
- 将变量传递到CasperJS中的XPath表达式中
- 当我尝试两个 DOM 中的 get 元素时,HTML 和 Xpath 结果未定义
- 获取所有表行并使用 CasperJS 中的 XPath 查询返回它们
- 在存储在变量中的xml上运行Xpath(获取“未捕获的类型错误:未定义不是函数”)
- 计算 XML 中的 XPath 表达式
- CasperJS中的CSS和XPath选择器
- 使用XPath使用JavaScript在XML文件中的子节点上进行迭代
- 尝试使用自定义Firefox扩展/加载项中的xpath和javascript引用页面中的文本时失败
- 使用javascript中的名称空间评估xpath的问题
- IE中的XPath查询使用基于零的索引,但W3C规范是基于一的.我该如何处理差额呢?
- 量角器-计算xpath中的元素并将其存储到var中
- AJAX中的XPath和通配符
- 通过Selenium Webdriver中的Java Script Executor传递复杂的xpath
- javascript中的Xpath评估相对于某些元素不起作用
- 无法通过selenium Web驱动程序中的xpath单击按钮
- 给定xPath,是否有可能突出显示JavaFX webView中的元素?
- XPATH 中的第 n 个前置元素(同级或祖先)
- 使用xpath中的动态变量