我的应用程序具有“条款和条件”模式,该模式仅在某些情况下出现。我希望量角器测试在出现模态时单击“同意”,而在未出现模态时不执行任何操作。
这是我的方法,我尝试等待元素出现,如果没有出现,则捕获错误。如果出现按钮,则单击它,测试通过。但是,如果未出现该按钮,则测试将失败,并显示“元素花的时间太长...”消息。
waitForAgree() {
var until = protractor.ExpectedConditions;
try {
browser.wait(until.visibilityOf(this.agreeTerms), 5000, 'Element taking too long to appear in the DOM');
this.agreeTerms.click();
this.continue.click();
} catch (e) {
console.log("not found");
}
}
我也尝试了以下方法。这给我消息Failed: Cannot read property 'agreeTerms' of undefined
clickAgree() {
//browser.ignoreSynchronization = true;
this.agreeTerms.isPresent().then(function (isPresent) {
if (isPresent) {
this.agreeTerms.click();
this.continue.click();
}
else {
console.log("not found");
}
})
}
感谢您对这些错误的任何帮助。
答案 0 :(得分:0)
如果size of list
等于 1 ,我会将该网络元素存储在列表中(在这种情况下,知道按钮存在,因此单击它)。如果该列表返回零,则打印失败消息。
我将使用 findElements 而不是 findElement 。
这是定义列表的方式:
var elems = driver.findElements(By.xpath("your locator"));
要计算尺寸,您可以使用以下方法:
var keys = Object.keys(elems);
var len = keys.length
之后:
if (len == 1){
this.agreeTerms.click();
this.continue.click();
}
else{
Do something here, button did not appear.
}
答案 1 :(得分:0)
我尝试了第一个方法的替代方法,并且该方法有效。我不完全确定为什么我的问题中的第一个失败了,并且成功了。如果有人想详细说明,请提前谢谢。如果您只需要一种可行的方法,请在这里:
kind: Endpoints
apiVersion: v1
metadata:
name: externalDB
namespace: default
subsets:
- addresses:
- ip: 10.128.0.2
ports:
- port: 7199
name: interface
答案 2 :(得分:0)
为了详细说明为什么第一种方法行不通,我们应该注意,使用Promise
而不调用.catch
通常是一个坏主意,因为大多数时候我们永远都不知道是错误的,try/catch
根本无济于事。这也是您的备用方法成功的原因,因为您正在.catch
上调用Promise
。
如果您有兴趣使第一种方法可行,那么您应该使用async/await
,如下所示:
async waitForAgree() {
var until = protractor.ExpectedConditions;
try {
await browser.wait(until.visibilityOf(this.agreeTerms), 5000, '...too long...');
this.agreeTerms.click();
this.continue.click();
} catch (e) {
console.log("not found");
}
}
请注意,在函数名称前应加上关键字async
,在对await
的调用前应注意browser.wait
。请注意,这是ES6
功能。
希望有帮助