使用CasperJS提交表内容

时间:2014-05-25 17:55:47

标签: javascript web-scraping phantomjs casperjs

我正在尝试使用CasperJS填充两个字段,提交表单,并打印出以下页面的内容。但是,我似乎没有成功点击按钮转到下一页。我试图按照CasperJS上的教程/示例和关于SO How to login into a website with CasperJS?的答案。但是,区别在于我没有提交一个包含多个填充值的表格。

请在下面找到我的代码:

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

casper.start('https://a836-propertyportal.nyc.gov/Default.aspx', function() {});


casper.evaluate(function(block, lot) {
    document.querySelector('#ctl00_SampleContent_ctl01_txtBlock').value = block;
    document.querySelector('#ctl00_SampleContent_ctl01_txtLot').value = lot;
    document.querySelector('#ctl00_SampleContent_ctl01_btnSearchBBL').click();
}, '01000', '0011');


casper.run(function() {
    // echo results in some pretty fashion
    this.echo('we are this far in the code..');
    // this.echo(this.getPageContent());
    var links = document.querySelectorAll('td.contentDataElement');
    this.echo(links.length);
    for(var i=0; i<links.length; i++) {
        this.echo(links[i]);
    }
});

1 个答案:

答案 0 :(得分:2)

casper.evaluate不是单步函数,但您在与startrun相同的级别上使用它。因此,将casper.evaluate更改为casper.thenEvaluate

此外,您无法访问casper中的document,但只能访问页面上下文,就像您使用casper.evaluate调用一样。

您的固定代码使用casper.getElementsInfo函数来获取所需元素的某些属性。您不能将DOM元素从页面上下文传递给casper,它们必须是number,string,[]或{}类型。

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

casper.start('https://a836-propertyportal.nyc.gov/Default.aspx');

casper.thenEvaluate(function(block, lot) {
    document.querySelector('#ctl00_SampleContent_ctl01_txtBlock').value = block;
    document.querySelector('#ctl00_SampleContent_ctl01_txtLot').value = lot;
    document.querySelector('#ctl00_SampleContent_ctl01_btnSearchBBL').click();
}, '01000', '0011');

casper.then(function() {
    // echo results in some pretty fashion
    this.echo('we are this far in the code..');
    // this.echo(this.getPageContent());
    var links = this.getElementsInfo('td.contentDataElement');
    this.echo(links.length);
    for(var i=0; i<links.length; i++) {
        this.echo(JSON.stringify(links[i]));
    }
});

casper.run();