Asynchronous 如何用Jasmine/量角器将“AxeBuilder.analysis()”包装在promise中?
我一直在工作的茉莉自定义匹配器,以检查是否有一个网页是可访问的 重要的一点如下所示:Asynchronous 如何用Jasmine/量角器将“AxeBuilder.analysis()”包装在promise中?,asynchronous,jasmine,promise,protractor,Asynchronous,Jasmine,Promise,Protractor,我一直在工作的茉莉自定义匹配器,以检查是否有一个网页是可访问的 重要的一点如下所示: var _result = {}; AxeBuilder(browser.driver).analyze(function(results) { if (util.equals(results.violations.length, expected)) { _result.pass = true; _result.message = 'Selection was acce
var _result = {};
AxeBuilder(browser.driver).analyze(function(results) {
if (util.equals(results.violations.length, expected)) {
_result.pass = true;
_result.message = 'Selection was accessible.';
} else {
_result.pass = false;
_result.message = results.violations;
}
});
return result;
我的问题是\u result
(而不是results
)始终是空对象
我怀疑问题在于AxeBuilder(…).analyze(…)
是异步的,但不返回承诺
我的测试不是从业力运行的,而是通过量角器配置启动的
如果我的怀疑是真的,我该如何把它包装成承诺呢?我对AxeBuilder不熟悉。正如您提到的,AxeBuilder.analyze()是一个异步方法,您需要在analyze方法中返回
\u result
变量。试试下面的代码
return AxeBuilder(browser.driver).analyze(function(results) {
if (util.equals(results.violations.length, expected)) {
_result.pass = true;
_result.message = 'Selection was accessible.';
} else {
_result.pass = false;
_result.message = results.violations;
}
return _result;
});
在执行analyze方法之前,您在代码中返回
\u result
变量。您可以实现回调概念,以防止在result对象准备就绪之前执行语句“return result”。你可以试试下面的代码
var _result = {firstvalue:"test"};
AxeBuilder(browser.driver).analyze(function(results,callback) {
if (util.equals(results.violations.length, expected)) {
_result.pass = true;
_result.message = 'Selection was accessible.';
} else {
_result.pass = false;
_result.message = results.violations;
}
callback(result);
});
var callback=function(result){
return result;
}
如果可能,您应该使用量角器中提供的WebDriverJS承诺
function builder() {
return AxeBuilder(browser.driver).analyze(function(results) {
var deferred = protractor.promise.defer();
if (util.equals(results.violations.length, expected)) {
_result.pass = true;
_result.message = 'Selection was accessible.';
deferred.fulfill(_result);
} else {
_result.pass = false;
_result.message = results.violations;
deferred.reject(_result);
}
return deferred;
});
}
这是你可以使用它的方法
builder().then(function(_result) {
console.log(_result.pass);
}, function(err) {
console.error(err);
});
谢谢你的快速回复。这似乎不起作用,因为它不返回承诺,我的代码的其余部分在完成工作之前执行。我想我需要用承诺来包装它(不知何故)。这很有趣,看起来很有希望(没有双关语),但对我来说仍然不起作用。我认为
AxeBuilder(browser.driver)。analyze
失败了。回调是否在被调用的范围内?也许在里面添加一个控制台日志,看看它是否到达那里?我没有成功。对不起,情况没有改变result。pass
是未定义的。@atwright147,创建一个具有任何值的对象,而不是创建空的obejct var\u result={first:“Test”};