如果在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");
});
我手动尝试了网站,我确信它会显示出来。我该如何解决这个问题?
答案 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
,因此我从未遇到计时问题。也许你也可以从它的使用中受益?