如何在返回之前等待功能完成?
How to wait for function to complete before returning?
我正在尝试创建一个我可以从任何测试中调用的函数,该函数将查看正在传递的元素(link 文本、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)
}
});
}
感谢任何帮助或评论。
你走在正确的轨道上。假设你想点击元素,等待页面转换,然后检查结果 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)和 return 一个可以在命令的 then
回调中调用的函数。这些函数在它们的上下文中有一个 parent
属性 引用父命令链(函数链从 this.remote
开始)。
请注意,调用元素的方法,如上面的 element.click()
,return 承诺,而不是命令。这意味着只能链接标准的 Promise 方法,不能链接 click
、findElementByX
等命令方法。这就是为什么上面的代码从 this.parent
而不是 [=22= 开始内部链的原因].
更新
相同的基本结构适用于其他类型的辅助方法。例如,如果您想使用辅助方法进行查找,它可能看起来像:
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'))
我正在尝试创建一个我可以从任何测试中调用的函数,该函数将查看正在传递的元素(link 文本、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)
}
});
}
感谢任何帮助或评论。
你走在正确的轨道上。假设你想点击元素,等待页面转换,然后检查结果 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)和 return 一个可以在命令的 then
回调中调用的函数。这些函数在它们的上下文中有一个 parent
属性 引用父命令链(函数链从 this.remote
开始)。
请注意,调用元素的方法,如上面的 element.click()
,return 承诺,而不是命令。这意味着只能链接标准的 Promise 方法,不能链接 click
、findElementByX
等命令方法。这就是为什么上面的代码从 this.parent
而不是 [=22= 开始内部链的原因].
更新
相同的基本结构适用于其他类型的辅助方法。例如,如果您想使用辅助方法进行查找,它可能看起来像:
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'))