我在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
起作用
答案 0 :(得分:0)
你是什么意思&#34;它掉线&#34;?测试是否会引发超时错误?
一个潜在的问题是组件可见性。在加载页面和您尝试与之交互的元素之间是否有一些延迟(例如,JS淡入动画)? findBy
命令返回找到的第一个元素,但该元素可能不可见。如果它不可见,则实习生无法与之互动,而type
之类的命令将失败。要等到元素可见,请使用findDisplayedByCssSelector
。
请注意,间距在CSS选择器中很重要。选择器"input [name = userName]"
实际上正在查找name=userName
元素中包含属性input
的元素。假设实际意图是选择具有特定名称属性的输入,则应将其格式化为'input[name="userName"]'
。
另请注意,end()
命令仅在find
命令之后才需要,并且在帮助程序命令的命令链末尾通常不需要{从this.parent
开始的事情) 。因此,例如,在end
中的get
之后不需要openRegistration
,end
中最多只需要一个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))
这可以解决您的问题。