CasperJS在AngularJS上效果不佳

时间:2014-11-20 08:34:44

标签: javascript angularjs casperjs

如果在casper中,我只点击一个按钮,那么一切正常。以下代码通过了测试。

casper.then(function() {
    this.click('#loginB');
    this.fill('#loginEmailField', {
        'loginEmail':    'a@a.com',
    }, false);
    this.fill('#loginPasswordField', {
        'loginPassword':    'a',
    }, false);
    this.click('#loginClickButton');
    this.click('#logoutB');
    test.assertNotVisible('#logoutB', "logout item should not show");
    test.assertNotVisible('#loggedInItem', "loggedin item should not show");
    test.assertVisible('#loginB', "login item should show");
});

这也通过了:

casper.then(function() {
    test.assertNotVisible('#loginModal', "login modal not visible");
    this.click('#loginB');
    test.assertVisible('#loginModal', "login modal visible");
});

然后,如果在点击登录按钮后,用户想要注册,则应该显示注册模块。以下测试是否显示但测试失败:

casper.then(function() {
    this.click('#loginB');
    this.click('#signUpB');
    test.assertVisible('#signUpModal', "signup modal is visible after click");
    test.assertVisible('#UsernameField', "Username field on the signup modal should be visible too");
    test.assertNotVisible('#loginModal', "login modal should be invisible after click");
});

我手动尝试了网站,我确信它会显示出来。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

你有时间问题。所有then*wait*都是异步的,但大多数其他功能都不是。所以当你casper.click页面必须执行一些可能在某种意义上异步的动作时,这些动作反过来又不能阻止CasperJS在脚本中继续前进。
我有点惊讶你的前两个片段有效。

要解决此问题,您应该以静态方式正确等待:

casper.thenClick('#loginB');

casper.wait(100, function() {
    this.click('#signUpB');
});

casper.wait(100, function() { // or whatever time you expect here
    test.assertVisible('#signUpModal', "signup modal is visible after click");
    test.assertVisible('#UsernameField', "Username field on the signup modal should be visible too");
    test.assertNotVisible('#loginModal', "login modal should be invisible after click");
});

您也可以将其转换为动态版本:

casper.thenClick('#loginB');

casper.waitUntilVisible('#signUpB', function() {
    this.click('#signUpB');
});

// wait until the last selector that is generated otherwise 
// it can happen that the others fail, but the selector which 
// you waited for is really there
casper.waitUntilVisible('#UsernameField', function() {
    test.assertVisible('#signUpModal', "signup modal is visible after click");
    test.assertVisible('#UsernameField', "Username field on the signup modal should be visible too");
    test.assertNotVisible('#loginModal', "login modal should be invisible after click");
});

答案 1 :(得分:1)

我使用CasperJS测试记录器Chrome扩展程序Resurrectio获得了良好的效果。我的AngularJS应用程序中的第一个生成的测试已经使用casper.waitUntilVisible,因此我从未遇到计时问题。也许你也可以从它的使用中受益?