我一直在研究Jasmine自定义匹配器,以检查页面是否可访问。
重要的一点如下:
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;
我遇到的问题是_result
(不是results
)总是一个空对象。
我怀疑问题是AxeBuilder(...).analyze(...)
是异步但不返回承诺。
我的测试不是从Karma运行的,它是通过我的Protractor配置启动的。
如果我的怀疑是真的,我将如何将其包含在承诺中?
答案 0 :(得分:2)
如果可能,您应该使用量角器
中提供的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);
});
答案 1 :(得分:1)
您可以实现回调概念,以防止在结果对象准备好之前执行语句' 返回结果' 。您可以尝试使用以下代码。
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;
}
答案 2 :(得分:0)
我不熟悉AxeBuilder。正如你所提到的,AxeBuilder.analyze()是一个异步方法,你需要在analyze方法中返回_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方法之前返回_result
变量。