我想知道是否有一种方法可以两次调用casperjs getElementsInfo,但是我尝试做下面类似的事情,但是没有运气。想知道是否可以解决此问题吗?
var rows = this.getElementsInfo('table.dateentrytable tr');
var cells = rows[0].getElementsInfo('td');
答案 0 :(得分:1)
您不能,对于这样的情况,我找到了一个解决方案,使用XPath和while循环,例如,此代码循环遍历具有未定义行数的表:
i= 1;
var x = require('casper').selectXPath;
while (this.exists(x('/html/body/form/div[3]/div[4]/div/div/div/table/tbody/tr[' + i + ']/td[1]'))) {
this.echo(this.fetchText(x('/html/body/form/div[3]/div[4]/div/div/div/table/tbody/tr[' + i + ']/td[1]')));
this.echo(this.fetchText(x('/html/body/form/div[3]/div[4]/div/div/div/table/tbody/tr[' + i + ']/td[2]')));
i++;
}
在您的情况下,请使用getElementInfo()代替echo()。
答案 1 :(得分:0)
getElementsInfo()
。CasperJS返回一个JSON对象数组,这些数组代表您以以下格式选择的元素:
[
{
"attributes": {
"align": "left",
"dir": "ltr",
"id": "hplogo",
"onload": "window.lol&&lol()",
"style": "height:110px;width:276px;background:url(/images/srpr/logo1w.png) no-repeat",
"title": "Google"
},
"height": 110,
"html": "<div nowrap=\"nowrap\" style=\"color:#777;font-size:16px;font-weight:bold;position:relative;left:214px;top:70px\">France</div>",
"nodeName": "div",
"tag": "<div dir=\"ltr\" title=\"Google\" align=\"left\" id=\"hplogo\" onload=\"window.lol&&lol()\" style=\"height:110px;width:276px;background:url(/images/srpr/logo1w.png) no-repeat\"><div nowrap=\"nowrap\" style=\"color:#777;font-size:16px;font-weight:bold;position:relative;left:214px;top:70px\">France</div></div>",
"text": "France\n",
"visible": true,
"width": 276,
"x": 62,
"y": 76
}
]
如您所见,innerHTML表示为可通过调用html
属性(即rows[0].html
)访问的字符串。
如果可能的话,您应该只修改传递给getElementsInfo()
的选择器:
var cells = this.getElementsInfo('table.dateentrytable tr td');
否则,如果这不是一个选项,则可以将结果HTML字符串(即rows[0].html
)解析为DOM元素,然后使用getElementsByTagName()
或等效方法选择单元格。