4

行間にこれを含むWebページがあります:

<a href="http://foo.com/home.do?SID=3443132">...

XPath を使用して「href」属性を抽出する必要があります。CasperJS の API には、 clientutils.getElementByXPathに関する情報が記述されています。

これが私のコードです:

phantom.casperPath = '..n1k0-casperjs-5428865';
phantom.injectJs(phantom.casperPath + '\\bin\\bootstrap.js');

var casper = require('casper').create();

var url = "...";

casper.start(url, function() {
casper.echo("started");
});

var x = require('casper').selectXPath;           

casper.then(function() 
{
casper.echo("getsid");  
    this.test.assertExists(x('//a[contains(@href, "home.do?SID=")]'), 'the element exists');
var element = __utils__.getElementByXPath('//a[contains(@href, "home.do?SID=")]');    
});

しかし、それは失敗します。これを返します:

false
undefined
started
getsid
PASS the element exists  <== XPATH WORKS
FAIL ReferenceError: Can't find variable: __utils__
#    type: uncaughtError
#    error: "ReferenceError: Can't find variable: __utils__"
ReferenceError: Can't find variable: __utils__
4

2 に答える 2

3

これを試して:

phantom.casperPath = '..n1k0-casperjs-5428865';
phantom.injectJs(phantom.casperPath + '\\bin\\bootstrap.js');

var url = "...";
var casper = require('casper').create();
var x = require('casper').selectXPath;

casper.start(url, function() {

 casper.echo("started");

});      

casper.then(function() {

 casper.echo("getsid");  

 var xpath = '//a[contains(@href, "home.do?SID=")]';
 var xpath_arr = { type: 'xpath', path: xpath};

 this.test.assertExists(xpath_arr, 'the element exists');

 var element = x(xpath);    
});
于 2012-07-30T16:13:25.033 に答える
3

コメントで指摘されているように、コールバックはページに挿入されるため__utils__、コールバック内で使用する必要があります。evaluateが欲しかったのでhref、次を使用できます:

casper.then(function(){
    casper.echo("getsid");  
    this.test.assertExists(x('//a[contains(@href, "home.do?SID=")]'), 'the element exists');
    var href = this.evaluate(function(){
        var element = __utils__.getElementByXPath('//a[contains(@href, "home.do?SID=")]');
        return element.href;
    });
});

これは、次の使用法で短縮できますcasper.getElementAttribute

casper.then(function(){
    casper.echo("getsid");  
    this.test.assertExists(x('//a[contains(@href, "home.do?SID=")]'), 'the element exists');
    var href = this.getElementAttribute(x('//a[contains(@href, "home.do?SID=")]'), "href");
});

casper.getElementInfoを使用して、すべての属性 (一部のプロパティのみ) を含む要素の完全な情報を取得することもできます。

于 2014-08-05T17:20:21.357 に答える