是否可以解决“executeScript”中的承诺?

Vre*_*ost 5 javascript jasmine selenium-webdriver protractor webdriverjs

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

我需要调用我的应用程序全局实例的 API 函数,获取结果并在测试中进行比较。该函数传入的参数之一是回调,数据准备好后立即调用。该函数的执行时间取决于应用程序的配置。

我尝试解析此回调函数内的 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);
    });
});
Run Code Online (Sandbox Code Playgroud)

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

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);
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

ale*_*cxe 5

executeAsyncScript()正是您所需要的。

引用理解在 Selenium 中执行异步脚本主题中的@hankduan:

当您关心调用脚本中的返回值,但该返回值不会立即可用时,请使用executeAsyncScript。如果您无法轮询结果,但必须使用回调或承诺(您必须自己将其转换为回调)获取结果,则这一点尤其必要。