Можно ли использовать getElementsInfo для элементов, уже полученных через getElementsInfo? - PullRequest
0 голосов
/ 04 июля 2018

Мне интересно, если есть способ дважды вызвать casperjs getElementsInfo, я попытался сделать что-то похожее на приведенное ниже, но безуспешно. Хотите знать, есть ли способ обойти это?

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

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Вы не можете, решение, которое я нашел для таких случаев, как 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++;
}

В вашем случае вместо echo () используйте getElementInfo ().

0 голосов
/ 04 июля 2018

Нет, вы не можете дважды вызвать 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() или эквивалентный метод.

...