【问题标题】:Protractor Returning Promise Instead of Attribute Value量角器返回 Promise 而不是属性值
【发布时间】:2018-01-15 06:35:26
【问题描述】:

我正在尝试使用下面的代码获取 html 属性的值并将其分配给 url_extension 变量,但我一直在获取 Promise 对象。这是我的代码:(注意:wd = browser.driver;

   ReturnNewArticleURL : function() {
      var url_extension = this.getArticleExtension();
      console.log("url_extension: ", url_extension);
      wd.get("http://any_website.com" + url_extension) 
      return url_extension;
},

    getArticleExtension : function() {
return wd.findElement( by.id ("confirm-unpublish-url")).getAttribute("value").then(function (text) {
  return text});
},

如果我在 getArticleExtension 模块中将“返回文本”更改为 console.log(text),那么它将在我的控制台中为 url 扩展名打印正确的值。我的问题基本上是在 .then() 函数之外获取文本值并在其他地方使用它。任何人都知道该怎么做或我做错了什么?

【问题讨论】:

    标签: javascript angularjs node.js selenium-webdriver protractor


    【解决方案1】:

    .getAttribute() 作为其他 Protractor/WebDriverJS 方法返回 promise

    这个想法是让你的函数返回一个承诺并在你需要一个实际值时解决:

    ReturnNewArticleURL : function() {
        this.getArticleExtension().then(function (url_extension) {
            console.log("url_extension: ", url_extension);
        }
    },
    
    getArticleExtension : function() {
        return wd.findElement(by.id("confirm-unpublish-url")).getAttribute("value");
    },
    

    【讨论】:

    • 这只会在控制台日志中返回正确的扩展名,据我所知。我最终想要做的是 wd.get(www.any_url.com + url_extension) 但这只是给了我“:ManagedPromise ...”而不是扩展名。我正在尝试使用扩展值而不是 ManagedPromise 但似乎无法做到这一点。我修改了我的问题以更好地反映这一点。
    【解决方案2】:

    在重新阅读和思考@alecxe 的答案之后,我能够弄清楚我需要做什么。显然我只能在 .then() 函数中访问我的属性值。对于其他试图解决这个问题的人,这是我让我的代码工作的方法:

     ReturnNewArticleURL : function() {
        var url_extension = this.getArticleExtension();
        console.log("url_extension: ", url_extension); //prints promise as expected
        url_extension.then(function (text) {wd.get("http://any_website.com"+ text ); 
    }), //this is how you use the url extension from the url_extension promise.
    
     getArticleExtension : function() {
          return wd.findElement( by.id ("confirm-unpublish-
           url")).getAttribute("value")
    },
    

    关键是在 .then() 函数内部使用 promise 值,而不是将其分配给外部变量。

    url_extension.then(function (text) {
    wd.get("http://any_website.com"+ text ); 
    }),
    

    由于量角器使用 node.js,它会异步读取代码,因此当我将值分配给一开始未评估的变量时,它们被分配了一个承诺。

    【讨论】:

    • 这正是我的意思,很抱歉没有以更清晰的方式表达这个想法,并感谢您总结了帮助您解决问题的原因!
    猜你喜欢
    • 1970-01-01
    • 2017-10-31
    • 2019-07-06
    • 2021-10-17
    • 2021-02-06
    • 2017-03-17
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多