2014-11-20 3 views
1

Если в кассе, я нажимаю только одну кнопку, тогда все работает нормально. Следующий тест проходит тест.CasperJS не работает на AngularJS

casper.then(function() { 
    this.click('#loginB'); 
    this.fill('#loginEmailField', { 
     'loginEmail': '[email protected]', 
    }, 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

Возможно, вам лучше использовать транспортир. Он автоматически ожидает, что область scope.digest будет оцениваться и, таким образом, намного быстрее, чем может быть когда-либо. Если вы действительно хотите использовать Каспер, вам может понадобиться проверить, как это делает транспортитчик. Вы можете начать поиск в репозитории github для функции waitForAngular. –

ответ

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"); 
}); 
+0

Хммммм. Я попробовал wait(), но он не работал, и теперь он работает ... Он работает, когда время установлено на 1000. Кроме того, waitForSelector тоже не работает. –

+0

Кроме того, хотя это работает, я не думаю, что это очень изящное решение. На самом деле, я должен ждать около 1 с до и после каждого события click(). Это неэффективно. Любой другой способ решить это? –

+0

Правильно, в AngularJS обычно узлы находятся в DOM, но скрыты. Я изменил первый 'waitForSelector' на' waitUntilVisible', чтобы отразить это. Я не думаю, что есть лучшая альтернатива. –

1

я получил хорошие результаты, используя Resurrectio, в CasperJS test recorder Расширение Chrome. Первый сгенерированный тест в моем приложении AngularJS уже использовался casper.waitUntilVisible, поэтому я никогда не сталкивался с проблемой синхронизации. Может быть, вы также можете воспользоваться его использованием?

Смежные вопросы