У меня не работает функция 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 команда).

Другие вопросы по тегам