【问题标题】:Problems implementing e2e test with AngularJS scenario and redi使用 AngularJS 场景和 redi 实现 e2e 测试的问题
【发布时间】:2013-06-20 11:52:54
【问题描述】:

我开始使用angular-scenario 在我的 django 应用程序中编写 e2e 测试,但从一开始我就被阻止了。

我在我的应用程序中开辟了一种伪造用户登录的方法,因此我可以开始测试应用程序功能,但我无法让它工作。这是我的测试代码:

describe("E2E test", function () {

    beforeEach(function () {
        // This actually kills any session in the server
        browser().navigateTo('/backdoor/');
    });

    it('should "fake" login', function () {
        browser().navigateTo('/backdoor/?username=jane.doe');
        ....
    });
});

在服务器端,当有人点击'/backdoor/?username=some.valid.user' 时,我会验证用户,然后重定向到'/messages/',结果是对客户端的 302 响应。

我可以在我的日志中看到 karma 命中 /backdoor/,然后是 /backdoor/?username=jane.doe',它实际上通过重定向并命中 '/messages'

[20/Jun/2013 11:20:20] "GET /backdoor/ HTTP/1.1" 200 5844
[20/Jun/2013 11:20:20] "GET /backdoor/?username=jane.doe HTTP/1.1" 302 0
[20/Jun/2013 11:20:20] "GET /messages/ HTTP/1.1" 200 35632
[20/Jun/2013 11:20:20] "GET /static/css/bootstrap.min.css HTTP/1.1" 200 103314
..... tons of css and javascript fetching

但是,此时,我收到以下错误:

Chrome 27.0 (Linux) E2E test should "fake" login FAILED
browser navigate to '/backdoor/?username=jane.doe'
http://localhost:9203/base/spec/e2e/e2e.spec.js?1371726473000:20:13: Sandbox Error: Application document not accessible.
Chrome 27.0 (Linux): Executed 1 of 1 (1 FAILED) (14.336 secs / 13.967 secs)

在浏览器中调试时,我什至看到/messages 视图加载了几分之一秒,然后它就消失了。我在控制台中收到此错误:

Blocked a frame with origin "http://localhost:9203" from accessing a frame with `origin "http://localhost:8000"`. Protocols, domains, and ports must match.

我猜这是正常行为,因为 karma 使用嵌入式 iframe 进行测试,而不是 webdriver。

这是我的配置文件,它是我的其他中途和单元测试业力 conf 文件的修改副本,可以很好地与 jasmine 配合使用。 (我已经下载了最新的angular-scenario.js文件):

basePath = '.';

files = [
     // ANGULAR_SCENARIO,
    'js/libraries/angular-scenario/angular-scenario.js',
     ANGULAR_SCENARIO_ADAPTER,
    'js/libraries/jquery-1.7.2.min.js',
    'js/libraries/angular-unstable/angular.js',
    'helpers/angular-mocks.js',
    'js/libraries/lodash.js',
    'js/libraries/underscore.observable.js',
    'js/libraries/date.js',
    'js/variables.js',
    'js/angular/*.js',
    'spec/e2e/*.js'
];

autoWatch = true;

browsers = ['Chrome'];

singleRun = false;

colors = true;

logLevel = LOG_INFO;

port = 9203;
runnerPort = 9303;
captureTimeout = 5000;

proxies = {
  '/': 'http://localhost:8000/'
};

urlRoot = 'e2e';

我一定遗漏了一些微不足道的东西,因为这是一个需要测试的基本东西,但我已经研究了一整天,我一直找不到解决方案。

我们将非常感谢您对此问题的任何帮助!

【问题讨论】:

    标签: testing angularjs angular-scenario


    【解决方案1】:

    我也是这个主题的初学者,但是我在这里遇到类似的问题已经有一段时间了,我刚刚找到了解决方案。我希望它和你的问题一样。

    从我能掌握的任何信息来看,似乎存在 karma 网络服务器,用于将所有请求代理到您的网络服务器。这样,您的测试就能够访问“框架”,因为 karma Web 服务器与测试在同一个域上运行。

    因此,您的测试请求任何带有 browser().navigateTo('/whatever/'); 的 url,该请求由 karma Web 服务器(即 localhost:9876)接收,它将此请求代理到运行您的 Web 应用程序的实际 Web 服务器(即 localhost:8000)。我不知道引擎盖下会发生什么,但是您的测试代码可以以某种方式与框架一起使用。此外,在运行 karma 网络服务器的情况下,如果您在浏览器中手动输入 http://localhost:9876/whatever,您可以像访问 http://localhost:8000/whatever 一样访问该 url

    所有这些代理似乎都适用于我的静态示例,但是,当我开始使用 django 后端时,我开始遇到与您一样的错误。每当我直接在浏览器中访问http://localhost:9876/whatever 时,我都可以正常查看 URL,但是 由于某种原因,业力测试无法访问框架。

    在拉了很多头发之后,我发现实际发生的事情是我的http://localhost:9876/whatever url 自动重定向到http://localhost:8000/whatever/(我仍然不知道为什么)并且通过该重定向,测试正在尝试从另一个域访问框架。只需在 url 后面附加一个尾随 '/',我就停止了这种重定向,并且我的测试能够访问框架。

    在您的情况下,尝试在您的 karma 网络服务器打开时在浏览器中手动访问所有 url(来自 karma 网络服务器),并检查您是否总是通过 karma 网络服务器而不是通过您的网络访问这些 url应用程序 Web 服务器(地址应始终指向 localhost:9876 而不是 localhost:8000)。在我看来,通过这些重定向,您的测试开始直接访问您的网络应用程序。

    我希望有人能澄清一下这个代理是如何工作的,以及为什么重定向会从中逃脱。

    【讨论】:

    • 我还遇到了攻击没有尾部斜杠的 url 会导致 karma 遵循重定向但角度场景不会在其 iframe 中呈现。将我所有的 url 更改为以 '/' 结尾只是绕过重定向问题,它不能解决它。顺便说一句,你被重定向的原因是 django 默认行为,看看这个:docs.djangoproject.com/en/dev/ref/settings/#append-slash
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2016-05-19
    相关资源
    最近更新 更多