【问题标题】:protractor custom expected condition fails with error量角器自定义预期条件失败并出现错误
【发布时间】:2016-03-15 23:12:26
【问题描述】:

我正在尝试使用browser.wait 等待浏览器,并使用像这样的自定义 ExpectedCondition FunctionReturningANumber 仅返回一个数字,而 numberToCheck 是要检查该数字的数字。

var conditionFn = function () {
    return functionReturningANumber(param) === numberToCheck;
};

var condition = EC.and(conditionFn);
browser.wait(condition, 50000);

但是如果我执行这个,我会得到错误:fn(...).then is not a function,它基本上说,它期望一个承诺。我查阅了有关 ExpectedConditions 的文档,自定义的示例如下:

// You can define your own expected condition, which is a function that
// takes no parameter and evaluates to a promise of a boolean.
var urlChanged = function() {
     return browser.getCurrentUrl().then(function(url) {
      return url === 'http://www.angularjs.org';
   });
};

而且我看不到这里的承诺是如何创建的。我只看到,返回了一个布尔值,并且文档说 evaluates to a promise of a boolean 这让我更加困惑。

以上是为了等待API的响应,这是因为测试触发了一个后端进程,然后量角器需要等待。如果有更好的方法,我将不胜感激。

我正在使用量角器 3.1.1。

非常感谢任何帮助。

编辑:

我找到了解决这个问题的方法,由于某种原因,@alecxe 的逻辑解决方案不起作用,即使它是有道理的:

var numberFound = 0;
var done = false;
var check = function () {
    numberFound = functionReturnungANumber(param);
    if (numberFound != numberToCheck) {
        setTimeout(check, 4000);
    } else {
        done = true;
    }
};
check();
return done;

如果我将它添加到函数中并在调用该函数的测试中检索返回值,并在其中添加browser.wait(function () { return done; });,它就可以工作。

它并不漂亮,但出于某种原因,它是唯一有效的东西……至少对我来说。

【问题讨论】:

    标签: javascript angularjs protractor


    【解决方案1】:

    只是你不需要将Expected Condition函数包装成EC.and

    browser.wait(conditionFn, 5000);
    

    【讨论】:

    • 它没有返回一个承诺,我之前尝试过一次,但现在如果我这样做:var conditionFn = function () { var result = functionReturningANumber(param) === numberToCheck; console.log(result) return result; }; browser.wait(conditionFn, 50000); 它会打印false 很多次然后退出。为了测试我改变了,这个条件永远不会发生,但它只是退出,因为条件已经满足了。
    • @Sheldan 请查看更新 - 一个疯狂的猜测,但试一试。谢谢。
    • 如果我把它改成那样,它不会打印任何东西。如果我将其更改为conditionFn(),它将明显执行,与以前一样,但仅执行多次,然后退出。是否存在您可能知道的某种超时或执行次数?
    • @Sheldan 很好,它应该在计算为 false 时执行,直到超时(在这种情况下为 5 秒)。一旦它返回true,它将停止执行该函数。在您的情况下,它的行为不好吗?谢谢。
    • 不,如果我添加 console.log,它将打印大约 300 次 false,然后退出而不打印 true。如果重要的话,这是我执行的唯一测试。
    【解决方案2】:

    试试这个。

    browser.wait(conditionFn () {
        return url === 'http://www.angularjs.org';
    }, 8000);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多