AngularJS:在e2e测试中访问$scope对象

AngularJS:在e2e测试中访问$scope对象,angularjs,angularjs-e2e,Angularjs,Angularjs E2e,我正在构建一个数学教程应用程序,并希望使用angular的e2e测试套件测试我的UI 目前,我正在制作一个分数页面,该页面生成一个随机分数,显示一系列着色和非着色框,并要求用户输入由着色形成的分数 使用e2e测试,我想测试UI如何响应正确和不正确的输入;然而,由于分数在页面加载时是随机的,所以我不知道测试内部的“正确”输入是什么 要获得输入的正确答案,最简单的方法是访问位于控制器$scope.problemObject的分数对象,并调用其API函数.getNumerator()和.getDeno

我正在构建一个数学教程应用程序,并希望使用angular的e2e测试套件测试我的UI

目前,我正在制作一个分数页面,该页面生成一个随机分数,显示一系列着色和非着色框,并要求用户输入由着色形成的分数

使用e2e测试,我想测试UI如何响应正确和不正确的输入;然而,由于分数在页面加载时是随机的,所以我不知道测试内部的“正确”输入是什么

要获得输入的正确答案,最简单的方法是访问位于控制器
$scope.problemObject
的分数对象,并调用其API函数
.getNumerator()
.getDenominator()
。然而,我还没有找到一种方法从我的测试中访问这个对象

我的控制器的相关线路包括:

$scope.problemObject = Fraction.random();
// This produces an object with two relevant 
// functions (getNumerator() & getDenominator())
我尝试过的

  • binding()
起初我认为
binding()
可以满足我的需要,但是对
binding('problemObject')
binding('problemObject.getNumerator()的所有调用“
等发出一个错误,表示无法找到绑定。我怀疑这是因为
$scope.problemObject
$scope.problemObject.getNumerator()的返回值未直接绑定到UI

  • angular.element().scope()
从我正在测试的页面上的控制台执行
angular.element('#problem').scope().problemObject
,效果非常好;但是,从我的测试中尝试同一行会出现以下错误:“选择器未实现”

我还尝试了一些变化:

元素(“#问题”).scope().problemObject
:错误:“对象”没有方法“scope”


angular.element(element(“#problem”)).scope().problemObject
:错误:“无法读取未定义的”的属性“problemObject”

我猜e2e测试中的“element”和“angular.element”是不同的对象。 您可能需要尝试从视图中读取值

如果是输入字段

var value = element('#problem').val();
否则,类似于:

var value = element('#problem').text();
(在我看来,从e2e查看范围对象是一种欺骗。)

编辑 我完全误解了网页的问题和结构。 很抱歉给你带来了困惑。 它必须根据着色框和非着色框的编号验证输入字段(本例中为“td”元素)


想法是一样的,它试图从视图中获取数字,而不是从$scope中获取数字。

结果表明,问题在于存储在jQuery的
数据中的范围。由于jQuery将数据存储在哈希表中,作为
$.cache
全局,一旦我们超出了运行测试网页的框架,我们就不再能够访问它们.我解决这个问题的方法是访问iframe窗口内的jQuery(方便地在
$window
参数中给出)

下面是我访问范围的方法。您可以执行
scope(“#myElement”,“foo.bar”)
来查询
$scope.foo.bar

angular.scenario.dsl('scope', function() {
return function(selector, entry) {
    return this.addFutureAction('find scope variable for \'' + selector + '\'', 
        function($window, $document, done) {
            var $ = $window.$; // jQuery inside the iframe
            var elem = $(selector);
            if (!elem.length) {
                return done('No element matched \'' + selector + '\'.');
            }
            var entries = entry.split('.');
            var prop = elem.scope();
            for (var i in entries) {
                prop = prop[entries[i]];
            }
            done(null, prop);
        });
    };
});

问题是我需要的值(分数的分子和分母)不直接绑定到DOM。它们存在于悬挂在控制器作用域之外的分数对象中。它们的值在运行时通过随机化例程确定。通常,我在e2e测试中不需要这些值;但是,我想测试UI对正确和不正确输入的响应。测试无法知道什么是正确的t input是,除非它能以某种方式访问这些值。我总是可以将它们放在
数据-
元素中进行测试,但我希望有更好的解决方案。如果您不清楚我的建议,很抱歉。如果显示数字,则表示它是dom树的一部分(或者是图像还是其他?)。你不能直接访问文本元素吗?这就是我的意思。例如,如果它是“{number}”,那么我可以使用jquery通过“$('span').text()”访问该数字。谢谢你坚持我的观点。页面上唯一的元素(除了一些说明文本)是两个输入框(用于用户的分子和分母答案)和一个可视的文本(没有任何文本数据的HTML表格)它表示分数。我可以使用可视化工具来推断控制器中分数对象的状态,但这会将真理的来源移动到自定义指令的输出,这本身可能有缺陷。您可以在此处看到该页面的原型、非随机版本:我根据对t的正确理解来编辑我的响应view.binding()只适用于在HTML文档中查找{{bindingName}}表达式的值。这通常是一个原语,而不是一个对象。你解决过这个问题吗?我遇到过类似的问题,不知道为什么会被否决。这是一个很好的解决问题的方法,对我来说很有用。
angular.scenario.dsl('scope', function() {
return function(selector, entry) {
    return this.addFutureAction('find scope variable for \'' + selector + '\'', 
        function($window, $document, done) {
            var $ = $window.$; // jQuery inside the iframe
            var elem = $(selector);
            if (!elem.length) {
                return done('No element matched \'' + selector + '\'.');
            }
            var entries = entry.split('.');
            var prop = elem.scope();
            for (var i in entries) {
                prop = prop[entries[i]];
            }
            done(null, prop);
        });
    };
});