У меня не работает функция setFindTimeout
Я пишу функциональные тесты для веб-приложения в интернете. У меня есть файл, в котором я описываю все действия в тесте, а также есть тест, где эти действия называются
например:
есть файл Action.ts
в нем функции, которые в тесте вызываются последовательно
//1
//open the registration window
openRegistration(): Command<void> {
return Action.openRegistration(this.parent);
}
static openRegistration(command: Command<any>): Command<void> {
return command
// click on the authorization menu
.setPageLoadTimeout (10000)
.get(intern.args.url)
.end()
}
//2
inputTextByCssSelector(selector: string, value: string): Command <void> {
return Input.inputTextByCssSelector(this.parent, selector, value);
}
static inputTextByCssSelector(
command: Command<any>,
selector: string,
value: string
): Command<void> {
return command
.setFindTimeout(10000)
.findByCssSelector(selector)
.click()
.type(value)
.end()
.end()
}
как это
.then(() => action.openRegistration())
.then(() => input.inputTextByCssSelector(
"input [name = userName]",
intern.args.username
))
.then(() => input.inputTextByCssSelector(
"input [name = password]",
intern.args.password
))
Но когда я запускаю тест, он падает.
Если я установлю явную задержку в конце openRegistration, например, как это
openRegistration(): Command<void> {
return Action.openRegistration(this.parent);
}
static openRegistration(command: Command<any>): Command<void> {
return command
.setPageLoadTimeout(10000)
.get(intern.args.url)
.sleep(7000)
.end()
}
тогда все работает
Почему не работает setFindTimeout(10000)
в inputTextByCssSelector
, но с sleep(7000)
в openRegistration
работает
2 ответа
Я попробовал что-то похожее на это (просто не использовал TypeScript), когда впервые начал изучать, как использовать intern, и столкнулся с некоторыми проблемами, похожими на то, что у вас возникло.
Проблема для меня заключалась в том, что Promise
цепочка не поддерживалась правильно во время выполнения теста. Вы должны попытаться внести небольшие изменения в свой код следующим образом, чтобы повысить согласованность Promise
цепь.
Например, ваш тестовый скрипт перед запуском выглядит так:
return this.remote
.then(() => action.openRegistration())
.then(() => input.inputTextByCssSelector("input[name = userName]", intern.args.username))
.then(() => input.inputTextByCssSelector("input[name = password]", intern.args.password))
Первое, что вам нужно сделать, это удалить эти функции стрелок. У меня было несколько проблем при использовании функций стрелок, а именно this.remote
Leadfoot/Session не передавался последовательно между методами, когда я делал это.
Итак, ваш первый .then()
Оператор вызывает метод с именем openRegistration()
, право? Отредактируйте свой метод, чтобы вместо этого вернуть function
который выполняет шаги, которые вы ищете:
static openRegistration(): Command<void> {
return function () {
return this.parent
.setPageLoadTimeout (10000)
.get(intern.args.url)
.end()
};
}
Итак, теперь ваш тестовый скрипт будет выглядеть примерно так (и при условии, что вы повторите этот шаблон для всех методов, которые вы вызываете):
return this.remote
.then(action.openRegistration())
.then(input.inputTextByCssSelector("input[name = userName]", intern.args.username))
.then(input.inputTextByCssSelector("input[name = password]", intern.args.password))
Это должно решить вашу проблему.
Что вы подразумеваете под "это падает"? Тест выдает ошибку тайм-аута?
Одна потенциальная проблема - видимость компонента. Есть ли некоторая задержка между загрузкой страницы и отображением элементов, с которыми вы пытаетесь взаимодействовать (например, JS исчезает в анимации)? findBy
Команды возвращают первый найденный элемент, но этот элемент может быть невидимым. Если он не виден, Стажер не может взаимодействовать с ним, и команда, как type
не удастся. Чтобы дождаться, пока элемент станет видимым, используйте findDisplayedByCssSelector
,
Обратите внимание, что интервал важен в селекторах CSS. Селектор "input [name = userName]"
на самом деле ищет элемент с атрибутом name=userName
содержится в input
элемент. Предполагая, что фактическое намерение состоит в том, чтобы выбрать вход с определенным атрибутом имени, он должен быть отформатирован как 'input[name="userName"]'
,
Также обратите внимание, что end()
Команды нужны только после find
команды, и, как правило, не нужны в конце цепочек команд в командах помощников (все начинается с this.parent
). Так, например, нет необходимости в end
после get
в openRegistration
и не более одного end
будет необходимо в inputTextByCssSelector
(для findByCssSelector
команда).