Транспортер - getText в качестве входных данных sendKeys и других действий

88
5

Я пишу тест транспортира, где мне нужно прочитать span/div с id = 'mylabel', используя getText(). Затем мне нужно передать значение на вход (id = 'myinput') с помощью sendKeys().


Итак, я делаю это:


var value;
element(by.id('mylabel')).getText().then(function(txt){
value = txt;
element(by.id('myinput')).sendKeys(value);
// do "other protractor tasks" with 'value'.
})

Но есть ли способ избежать вложенности, попросив транспортир выполнить sendKeys и последующие действия только после того, как установлена ​​переменная значения?


Это простой случай, но вскоре я обнаружил, что код попадает в многократное вложение из-за ожидания promises. Кроме того, я заметил, что транспортир не обеспечивает stacktrace, если "другие задачи транспортира" выдает ошибку из-за ошибки где-то вниз по линии (она просто зависает и истекает).


Я использую Protractor 2.1.0, и я работаю с страницами Angular JS.


Мне особенно интересно узнать, не является ли известная проблема иметь тихие ошибки во вложенных задачах с помощью Protractor и все равно решить ее?

спросил(а) 2021-01-25T17:51:01+03:00 4 месяца, 2 недели назад
1
Решение
77

Транспортировка ручки, по крайней мере, одного уровня promises без необходимости использования функции. Таким образом, вы можете ожидать синхронного потока.


Если вы ищете действие на основе событий, например просмотр значения для обновления, вы можете настроить что-то вроде этого:

function waitForTextToUpdate(elm, defaultText, timeout) {
if (typeof(timeout) === 'undefined') {
timeout = 10000;
}
return browser.driver.wait(function() {
return elm.getText().then(function(value) {
return !(value.indexOf(defaultText) > -1);
});
}, timeout, "Expectation error (waitForTextToUpdate): Timed out waiting for element state to change.");
}

ответил(а) 2021-01-25T17:51:01+03:00 4 месяца, 2 недели назад
63

Promises неизбежны в транспортире. Невозможно избежать обработки promises, но если вы хотите избежать вложенности, это можно легко сделать, используя функциональность цепочки .then(). Вот пример -


var value = '';
element(by.id('mylabel')).getText()
.then(function(txt){
value = txt;
})
.then(function(){
element(by.id('myinput')).sendKeys(value);
// do "other protractor tasks" with 'value'.
});

Для этой функции также доступен пакет npm. Q npm package. Он работает аналогично приведенному выше примеру, но более расширен.
Надеюсь, это поможет.

ответил(а) 2021-01-25T17:51:01+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема