У меня есть тест транспортира, который проходит - ДОПОЛНИТЕЛЬНО Я добавляю утверждение "ожидать" до конца. Как только я это сделаю, я получаю InvalidElementStateError: недопустимое состояние элемента. Я знаю, что транспортир асинхронен, так что он строит очередь обещаний и по какой-то причине утверждает это утверждение, но я понятия не имею, почему.
describe('compose', function() {
it('should send a message', function() {
browser.ignoreSynchronization = true;
browser.findElement(by.id('compose-link')).click();
browser.sleep(2000);
//select recipient
var el = element(by.name('input_to'));
el.click();
el.sendKeys('a');
//wait for server to autofill...
browser.sleep(500);
el.sendKeys(protractor.Key.ENTER);
//SNIP...
//keep clicking buttons, filling out fields etc...
//END SNIP
//select category
el = element(by.id('section-3')).element(by.css('.secret'));
el.sendKeys('cl')
el = element(by.id('send-now'));
el.click();
//wait for confirmation message
browser.sleep(1000);
expect(element(by.id('confirm-sent')).getText()).toEqual('Task Sent!');
});
});
BTW, ignoreSynchronization имеет значение true, поскольку в противном случае браузер не сможет синхронизироваться, по-видимому, из-за автозаполнения сервера на некоторых элементах. Я могу повернуть ignoreSync обратно после этих полей, но это не имеет значения - мне все равно нужно делать browser.sleep всюду, чтобы заставить тестовую работу, поэтому я просто оставляю ее равной true.
Если элемент появляется в элементе click() элемента, то подождите, пока функция click() вернет обещание, а затем попробуйте проверить, чтобы элемент был видимым с помощью функции wait(). Затем получите текст элемента. Использование функции wait() более подходит для использования, чем sleep(). Здесь фрагмент этой функциональности -
var ele = element(by.id('confirm-sent');
el.click().then(function(){
browser.wait(protractor.ExpectedConditions.visibilityOf(ele), 10000)
.then(function(){
expect(ele.getText()).toEqual('Task Sent!');
});
});
Надеюсь это поможет.