点击 CasperJS 并没有真正起作用

Click in CasperJS doesn't really work

我试着点击这个按钮:

<input class="right boutonActionTableau nouveau" onclick="addPeriode()" style="margin:0 0 10px 0 !important;" type="button" value="Période">

我的脚本:

var casper = require('casper').create({
    verbose: true,
    logLevel: 'debug',
    pageSettings: {
        loadImages:  false,
        loadPlugins: false
    },
    clientScripts: ["jquery.min.js"]
});

casper.start(url, function() {
    this.userAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X)');
    this.fill('form[action="/Login/DoLogin"]', {
        'Login': 'login',
        'Password': 'password'
    }, true);
    this.click('form[action="/Login/DoLogin"]');
});

casper.thenOpen(url, function() {
    this.echo('ok');
    this.mouseEvent('click','input[class="right boutonActionTableau nouveau"]');
    this.capture('test-screen1.png');
});

casper.then(function() {
    this.capture('test-screen4.png');
});

casper.run();

我没有错误,但是当我截屏时,我的页面没有改变... 在我的网络浏览器中,单击此按钮会在上一个表单之后添加一个表单(如果我单击 3 次,我还有 3 个其他表单)

如果在我的控制台 chrome 我输入:$(function(){addPeriode();}); 没关系...

当您在 casper.evaluate() 中调用它时,您可以 运行 与 Chrome 控制台中相同的 JavaScript,因为它是沙盒 window进入页面。

您可以致电

casper.evaluate(function(){
    addPeriode();
});

casper.evaluate(function(){
    var el = document.querySelector('input.right.boutonActionTableau.nouveau');
    el.click();
    // or
    el.onclick();
});

不过正常点击应该是可以的。您可以尝试点击后稍等

casper.thenOpen(url, function() {
    this.echo('ok');
    this.click('input.right.boutonActionTableau.nouveau');
    this.capture('test-screen1.png');

}).wait(5000).then(function() {
    this.capture('test-screen4.png');
});

你应该使用click()而不是mouseEvent(),除非你有特殊原因。 IIRC,mouseEvent() 要求被点击的按钮位于当前视口中,而 click() 只希望它位于页面的任何位置。

您的代码的第二个问题在这里:

input[class="right boutonActionTableau nouveau"]

要么使用:

input.right.boutonActionTableau.nouveau

如 Artjom 的回答,或者,如果您真的想要 attribute syntax,那么这样:

input[class*="right"][class*="boutonActionTableau"][class*="nouveau"]

顺便说一句,您可能会发现我的故事 in this post 很有用。在那种情况下,link(我认为没有被点击)实际上很好并且被点击了;所涉及的 Ajax 调用返回错误消息,这就是屏幕截图从未更新的原因。但我确实探索了很多点击的方法!

没关系,page.error,我看到问题了:kendoUI。 casperjs 在我之前的操作结束之前加载 thenopen。现在可以这样了:

casper.start('links.net', function() {

    this.fill('form[action="/Login/DoLogin"]', {
        'Login': 'gfdgdfg',
        'Password': 'dfgdfg'
    }, true);
    this.click('form[action="/Login/DoLogin"]');

    this.thenOpen('links2.net', function() {
    this.echo('loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooool');    
    this.click('input.right.boutonActionTableau.nouveau');
    this.capture('test-screen1.png');

})

我的第一个脚本(不起作用):

    casper.start('links.net', function() {

        this.fill('form[action="/Login/DoLogin"]', {
            'Login': 'fghfgh',
            'Password': 'fghfghfgh'
        }, true);
        this.click('form[action="/Login/DoLogin"]');


        }).wait(5000).then(function() {
            this.capture('testlol.png');
        });


    });

  casper.thenOpen('links2.net', function() {
       this.echo('loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooool');
       this.wait(10000);
       this.click('input.right.boutonActionTableau.nouveau');
       this.wait(10000);
       this.capture('test-screen1.png');

    }).wait(5000).then(function() {
        this.capture('testlol.png');
});

非常感谢您的帮助