我正在尝试创建一个函数,我可以从任何测试中调用它来查看传递的元素(链接文本,Css选择器,Xpath,ID),单击元素,然后验证来的URL加载后。我遇到的问题是它在函数完成之前返回。
我知道我需要实现异步和回调,但我很难理解结构。
clickIDverifyURL: function clickByID (elementVar, elementURL){
var rem = this.remote;
// if statements to look at elementVar and select the right one.. example:
// rem.setFindByTimeout(10000)
// .findByXpath (elementVar)
// .click()
// .end()
return this.remote
// if I code it right, I shouldn't need this sleep right?
.sleep(30000)
.getCurrentUrl()
.then(function(currURL) {
console.log(currURL);
try {
assert.strictEqual(currURL, elementURL, "This test checks to see if the current URL is correct.")
}
catch (e)
{
console.log(e)
}
});
}
感谢任何帮助或评论。
答案 0 :(得分:0)
你走在正确的轨道上。假设您要单击该元素,等待页面转换,然后检查生成的URL,您可以执行以下操作:
clickIDverifyURL: function (elementURL) {
return function (element) {
return this.parent
.then(function () {
return element.click();
})
// Wait for the page transition. This can be a sleep, or you can search for an
// element that should be on the new page (intern will implicitly wait for it
// to appear), or use pollUntil to wait for a more specific condition.
.sleep(1000)
// Get the page URL
.getCurrentUrl()
.then(function (url) {
assert.strictEqual(url, elementURL);
});
}
}
您可以使用它:
.findElementByCssSelector('.someselector')
.then(myModule.clickIDverifyURL('expectedURL'))
clickIDVerifyURL
接收一些配置数据(预期的URL)并返回一个可以在Command then
回调中调用的函数。这些函数在其上下文中具有parent
属性,该属性引用父命令链(从this.remote
开始的函数链)。
请注意,调用Elements的方法(如上面的element.click()
)会返回Promises,而不是Commands。这意味着只能链接标准的Promise方法,而不是click
,findElementByX
等命令方法。这就是为什么上面的代码从this.parent
开始内链而不是element
。
<强>更新强>
相同的基本结构适用于其他类型的辅助方法。例如,如果您想使用辅助方法进行查找,则可能如下所示:
findBySomething: function (selector) {
return function () {
var setContext = arguments[arguments.length - 1];
return this.parent
.findByCssSelector(selector)
.then(function (element) {
setContext(element);
});
}
}
然后你可以做
this.remote
.then(myModule.findBySomething('.selector'))
.then(myModule.clickIDverifyURL('expected URL'))