我需要检查弹出窗口是否存在,如果有,我需要检查它是否显示然后对其执行某些操作。
我已实施以下内容。我想知道是否有更好的方法来实现这一点。
licenseUpdate.isPresent().then(function (item) {
if (item == true) {
licenseUpdate.isDisplayed().then(function (res) {
if (res == true){
licenseUpdate.click();
};
});
}
});
答案 0 :(得分:0)
如果您正在使用页面对象(您应该),您可以编写如下内容:
clickLicenseUpdate() {
const licenseUpdate = $(licenseUpdateCssSelector);
return licenseUpdate.isPresent()
.then((isPresent) => {
if (!isPresent) { return false; }
return licenseUpdate.isDisplayed();
})
.then((isDisplayed) => {
if (!isDisplayed) { return false; }
return licenseUpdate.click().then(() => true);
})
}
请注意,如果您使用的是旧的JS版本(您不应该),则需要使用传统的匿名函数替换箭头函数。
有关页面对象设计模式的一些有用链接:
代码解释(或至少,即计划):
$
查找元素,但您可以使用任何策略
由量角器支持。
browser.findElement(by.className('license'))
相当于
$('license')
,browser.findElement(by.id('license'))
相当于
$('#license')
。查看Protractor文档以获取更多示例。isPresent
方法确定元素是否存在
这页纸。 isPresent
返回一个解析为布尔值的promise
值。 then
总是返回一个承诺。您可以从中返回原始值
onFulfilled
回调,该值将转换为承诺
以相同的价值解决。这是在这里完成的:if (!isPresent) { return false; }
;或者你可以回复另一个承诺
从onFulfilled
回调和then
返回的承诺将被解决或拒绝具有相同的返回承诺值。
这就是这里所做的:return licenseUpdate.isDisplayed();
。 isDisplayed()
也会返回
承诺将解决此元素是否是当前
在页面上可见。
如果你不是,这可能有点压倒性的 用来处理承诺。请查看Promises/A+
click
方法的元素,惊喜,同时返回
承诺(WebDriverJS API is based on promises)。isPresent
为false
行if (!isPresent)
,返回false立即绕过
licenseUpdate.isDisplayed()
执行并使用false值解析。在那里面
case isDisplayed
value为false,并返回false
立即绕过licenseUpdate.click()
执行。clickLicenseUpdate
会返回一个承诺
如果元素不存在或者存在但不存在,则解析为false
显示。为了使clickLicenseUpdate
返回值保持一致,我建议您等待licenseUpdate.click()
,然后返回一个布尔值,因为它在此处完成:return licenseUpdate.click().then(() => true);
(using implicit return from arrow functions)因为承诺返回click()
以void值解析。
这是无害的,但被认为是一个很好的做法,保持一致的返回值,总是一个布尔值,有时不是布尔值,有些则是空值。