javascript
  • xpath
  • phantomjs
  • casperjs
  • 2012-07-07 124 views 4 likes 
    4

    我有一个网页与该行之间以检索CasperJS元素的属性:如何使用XPath表达式

    <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__ 
    
    +0

    您不能在casperjs环境中直接使用__utils__。您必须使用[Casper.evaluate()](http://casperjs.org/api.html#casper.evaluate)方法。 – NiKo 2012-07-31 22:00:19

    +0

    @videador你能指出你如何设法解决这个问题吗? – codecowboy 2014-01-04 17:40:06

    回答

    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);  
    }); 
    
    +1

    'x()'不检索元素。它只是创建与您手动创建的“xpath_arr”完全相同的对象。 – 2015-10-06 13:40:34

    3

    正如评论指出的那样,你将不得不使用__utils__evaluate回调中,因为它被注入到该页面。既然你想(ED)的href,你可以使用:

    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获取该元素的完整信息:

    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使用缩短包括所有的属性(但只有一些属性)。

    相关问题