是否有可能在'executeScript'中解决承诺?

时间:2015-06-01 14:47:40

标签: javascript selenium-webdriver jasmine protractor webdriverjs

我正在尝试使用Protractor + Jasmine为我的非Angular应用程序编写我的第一个测试。

我需要调用我的app全局实例的API函数,得到结果并在测试中进行比较。该函数的传入参数之一是回调,一旦数据准备好就会调用它。该功能在一段时间内执行,具体取决于app的配置。

我试图解决这个回调函数中的promise对象并在测试中处理它。这是我的代码的简化版本,它也不起作用。看起来脚本arguments[0].fulfill("Some data");永远不会执行,因为测试因超时失败并显示消息:

  

等待规格完成10000毫秒后超时

describe('Text', function() {
    it('should be displayed on stage with set value', function() {
        var deferred = protractor.promise.defer();
        var promise = deferred.promise;

        promise.then(function (data) {
            console.log(data);
        });

        browser.driver.executeScript('arguments[0].fulfill("Some data");', deferred);
    });
});

是否可以在函数executeScript()的上下文中解析(履行)promise对象?还有其他方法可以解决这个问题吗?

UPD:此代码适合我。谢谢!

describe('Text', function() {
    it('should be displayed on stage with set value', function() {
        var deferred = protractor.promise.defer();

        browser.driver.executeAsyncScript(function () {
            var callback = arguments[arguments.length - 1];

            MyApp.apiFunction({
                callback: function (callbackParams) {
                    callback(callbackParams);
                }
            });
        }, function (data) { // Callback
            deferred.fulfill(data);
        }).then(function (result) {
            // Do what you need with data...
            console.log('Result: ', result);
        });
    });
});

2 个答案:

答案 0 :(得分:3)

executeAsyncScript()具体是您所需要的。

Understanding execute async script in Selenium主题引用@hankduan:

  

在关心调用中的返回值时使用executeAsyncScript   脚本,但该返回值不会立即可用。这是   如果你不能轮询结果,尤其是必要的,但必须得到   使用回调或承诺的结果(您必须转换为   回调自己)。

答案 1 :(得分:0)

Jasmine有一个名为done的异步处理器 所以,如果你将它推迟,我认为它应该工作

 it('should be displayed on stage with set value', function(done) {
 browser.driver.executeScript('arguments[0].fulfill("Some data");', function()

    {
 Object.defineProperty(this, "promise", {
          get: function () { done() },
          enumerable: true
      });


done()
});