检查元素是否存在然后检查它是否显示

时间:2017-06-07 12:59:01

标签: promise protractor

我需要检查弹出窗口是否存在,如果有,我需要检查它是否显示然后对其执行某些操作。

我已实施以下内容。我想知道是否有更好的方法来实现这一点。

 licenseUpdate.isPresent().then(function (item) {

                if (item == true) {
                    licenseUpdate.isDisplayed().then(function (res) {

                        if (res == true){

                            licenseUpdate.click();
                        };
                         });

                }

            });

1 个答案:

答案 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版本(您不应该),则需要使用传统的匿名函数替换箭头函数。

有关页面对象设计模式的一些有用链接:

PageObjects

Martin Fowler PageObject

代码解释(或至少,即计划):

  • 使用$查找元素,但您可以使用任何策略 由量角器支持。 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值解析。 这是无害的,但被认为是一个很好的做法,保持一致的返回值,总是一个布尔值,有时不是布尔值,有些则是空值。