函数setFindTimeout对我不起作用

时间:2017-09-25 16:05:57

标签: javascript intern leadfoot

我在Intern上为Web应用程序编写功能测试。 我有一个文件,其中我描述了测试中的所有操作,还有一个测试,这些操作被称为

例如:

有一个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 个答案:

答案 0 :(得分:0)

你是什么意思&#34;它掉线&#34;?测试是否会引发超时错误?

一个潜在的问题是组件可见性。在加载页面和您尝试与之交互的元素之间是否有一些延迟(例如,JS淡入动画)? findBy命令返回找到的第一个元素,但该元素可能不可见。如果它不可见,则实习生无法与之互动,而type之类的命令将失败。要等到元素可见,请使用findDisplayedByCssSelector

请注意,间距在CSS选择器中很重要。选择器"input [name = userName]"实际上正在查找name=userName元素中包含属性input的元素。假设实际意图是选择具有特定名称属性的输入,则应将其格式化为'input[name="userName"]'

另请注意,end()命令仅在find命令之后才需要,并且在帮助程序命令的命令链末尾通常不需要{从this.parent开始的事情) 。因此,例如,在end中的get之后不需要openRegistrationend中最多只需要一个inputTextByCssSelector (对于findByCssSelector命令)。

答案 1 :(得分:0)

当我第一次开始学习如何使用实习生并且遇到类似的问题时,我尝试了类似的东西(只是不使用TypeScript)。

对我来说,问题是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))

这可以解决您的问题。