循环刷新页面直到选择器可用

Loop refresh page until selector is available

我在 casperjs 中有一个脚本,它会转到一个网站,选中一个框(如果可用),然后单击一个按钮继续该脚本。

现在我有一个 cronjob,它每秒执行一次直到复选框可用。我想做的是执行脚本并刷新页面,直到复选框可用。

我尝试过 while 循环,但脚本崩溃了,我尝试了 repeat 函数,但并不理想,因为我不知道在复选框可用之前我必须尝试多少次。

这是我的脚本,以备不时之需:

casper.start(url1, function(){
    this.click('a[title="Chile"]');
});

casper.thenOpen(url2, function() {
    if(this.exists('#acepta_terminos')){ //this is where I check the checkbox
        seguir=false;
        this.click('#acepta_terminos');
        this.click('input[type="button"][name="continuar"]');

        this.waitForSelector('#contenedor', function(){
            this.fillSelectors('form[name="formulario"]',{
                '*[name="foid_tipo_1"]'                 :'NI', 
                '*[name="foid_numero_1"]'               :persona.rut,
            },true);

            this.click('#id_declaro_input');
            this.click('input[type="button"][name="continuar"]');
        });

        casper.then(function(){
            this.capture('4e.png');
        });
    } //cierre de if exists
});

casper.run();

这是递归完成的。

function check() {
    this.thenOpen(url2, function(){
        if(this.exists('#acepta_terminos')){
            seguir=false;
            this.click('#acepta_terminos');
            this.click('input[type="button"][name="continuar"]');

            this.waitForSelector('#contenedor', function(){
                this.fillSelectors('form[name="formulario"]',{
                    '*[name="foid_tipo_1"]'                 :'NI', 
                    '*[name="foid_numero_1"]'               :persona.rut,
                },true);

                this.click('#id_declaro_input');
                this.click('input[type="button"][name="continuar"]');
            });

            casper.then(function(){
                this.capture('4e.png');
            });
        } else {
            this.wait(5000, check);
        }
    });
}

casper.start(url1, function(){
    this.click('a[title="Chile"]');
}).then(check).run();

请注意,在函数内部,所有异步函数(then*wait*)都必须在同步函数(如 click)之后执行。