是否可以在已经通过getElementsInfo检索到的元素上使用getElementsInfo?

时间:2018-07-03 23:18:15

标签: javascript phantomjs casperjs

我想知道是否有一种方法可以两次调用casperjs getElementsInfo,但是我尝试做下面类似的事情,但是没有运气。想知道是否可以解决此问题吗?

var rows = this.getElementsInfo('table.dateentrytable tr');
var cells = rows[0].getElementsInfo('td');

2 个答案:

答案 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&amp;&amp;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()或等效方法选择单元格。