2016-06-17 3 views
1

Я использую zombie.js для автоматизации тестирования действий браузера, в этом случае нажав кнопку, чтобы отправить форму.Zombie.js pressButton как получить доступ к пост-аякс-версии браузера?

Вне тестов в реальном браузере при нажатии кнопки запускается запрос AJAX. Когда запрос AJAX завершается, в тело документа добавляются два элемента div.alert.

Тест ниже нажимает кнопку и запускает запрос, но когда тест впоследствии запрашивает документ, ищущий ожидаемые элементы div, он не может их найти. Я считаю, что тест запрашивает «старую» версию документа, которая существует до завершения вызова AJAX. Мой вопрос: как я могу получить доступ к версии документа, который существует после вызов AJAX завершает и добавляет элементы?

context("when visited on the 'new' page", function(){ 
    before(function(){ return browser.visit('/'); }); 
    before(function(){ return browser.clickLink('new'); }); 

    context("when submitted with invalid values", function(){ 
    before(function(){ 
     return browser.pressButton("Submit") 
    }) 

    it("flash should include error messages", function(){ 
     var messages = browser.queryAll(".alert") 
     console.log(messages) 
     expect(messages.length).toEqual(2) 
    }) 
    }) 
}) 

Примечание: Я смотрел в тесты zombie.js и найти применение async и await, но когда я пытаюсь использовать эти ключевые слова в моем файле .js, он не признает их. Это может быть отдельной проблемой, но если для решения требуется async/await, как включить mocha для распознавания этих ключевых слов?

+0

'асинхр/await' является функция ES7. Возможно, вам удастся каким-то образом включить его. Однако я не понимаю, как это поможет вам. Проблема заключается в том, что ваш тестовый режим ожидает изменения DOM. Я вообще не использую Zombie, но я использую Selenium, который поставляется с функциями, которые делают именно это. Если у Zombie нет эквивалента, вы всегда можете опросить DOM. – Louis

+0

Спасибо за рекомендацию selenium – s2t2

+0

Мне нужно изменить мой предыдущий комментарий: 'async/await' не попал в ES7 (=== ES2016). ES2016 был одобрен, как вчера (который я узнал только сейчас), но они отрезали «асинхронный/ждущий» от него. Это может быть частью следующего пересмотра языка. – Louis

ответ

0

Вы можете изменить свои вызовы ajax, чтобы после обновления экрана они отправили событие против тела, называемого, например. «Действия завершены». Затем в ваших тестах вы можете создать функцию прослушивателя, которая возвращает обещание, которое не будет разрешено до получения события.

const actionAndWait = (action, eventName) => new Promise(resolve => { 

    const listener =() => { 
     browser.body.removeEventListener(eventName, listener); 
     resolve(); 
    }; 

    browser.body.addEventListener(eventName, listener); 
    action(); 
    browser.wait(); 

}); 

Ваш 'до' будет затем вызвать

return actionAndWait(() => browser.pressButton("Submit"), "action-completed"); 
Смежные вопросы