CasperJS parse next page after button click

点点圈 提交于 2019-12-29 08:22:27

问题


I use casperjs for grab some test.

Algorithm is open URL parse page, click button for load next page. How to grab next pages until test is complete. All question get random and I don't now next question before form submitted.

I need parse pages like a cycle or recursive. My code is:

casper.start(startUrl, function () {
    this.click('#training');
    this.evaluate(function () {
        $('input[type="submit"]:first').click();
    });
});

casper.then(function () {
    var currentUrl = this.getCurrentUrl(),
        startIdPos = currentUrl.indexOf('=') + 1,
        questionId = currentUrl.slice(startIdPos),
        content = $(this.getHTML()),
        answers = [],
        question,
        startCorrectAnswerPos = content.find('script:nth-child(2)').html().indexOf('var bc='),
        correctAnswer = content.find('script:nth-child(2)').html().slice(startCorrectAnswerPos + 8, startCorrectAnswerPos + 9);

    question = content.find('table.quizz p.qw').html();

    console.log(">>>>>>" + this.getCurrentUrl());

    this.fill('form', {
        'answer': correctAnswer
    }, true);
});

casper.run();

This code complete parse only one page, but doesn't redirect to next page and parse it. What I do wrong?


回答1:


EDIT: You need to nest the steps for the following pages, because on every page you evaluate if it is necessary to go further. Also you should check the URL after you submitted the form.

function answer() {
    var currentUrl = this.getCurrentUrl(),
        startIdPos = currentUrl.indexOf('=') + 1,
        questionId = currentUrl.slice(startIdPos),
        content = $(this.getHTML()),
        answers = [],
        question,
        startCorrectAnswerPos = content.find('script:nth-child(2)').html().indexOf('var bc='),
        correctAnswer = content.find('script:nth-child(2)').html().slice(startCorrectAnswerPos + 8, startCorrectAnswerPos + 9);

    question = content.find('table.quizz p.qw').html();

    console.log(">>>>>>" + this.getCurrentUrl());

    if (question) {
        this.then(function(){
            this.fill('form', {
                'answer': correctAnswer
            }, true);
        });
        this.then(answer);
    }
};

casper.then(answer);

Exchange this code for your casper.then block.


Previous Answer: I don't know what kind of button/link #training is, but it may be that you need to wait for the change in the page to occur. You could use the casper.waitForSelector function.

Also I'm not sure why you write

this.evaluate(function () {
    $('input[type="submit"]:first').click();
});

and not simply this.click('input[type="submit"]:first');.



来源:https://stackoverflow.com/questions/23291977/casperjs-parse-next-page-after-button-click

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!