【问题标题】:Non-angular page opened with click - angular not defined using ignoreSynchronization or waiting for Angular without通过单击打开的非角度页面 - 未使用 ignoreSynchronization 定义角度或等待 Angular 而没有
【发布时间】:2015-12-08 15:09:54
【问题描述】:

经过大量研究和修补,我似乎实际上无法让我的量角器测试执行任何其他操作,除了出现与 Angular 相关的错误,即使我使用浏览器来避免检测到 Angular。

测试涉及一个 Angular 应用程序,在其中打开一个下拉菜单,然后单击控制台的链接;控制台在单独的窗口中打开一个非 Angular 管理页面。

所以根据我发现的许多信息丰富的 SO 帖子,我首先使用了这个...

browser.driver.getAllWindowHandles().then(function(handles) {
    browser.driver.switchTo().window(handles[1]).then(function() {
//expect for new window here
            });
        });

这似乎奏效了,因为我可以很容易地通过repl 到达窗口。 问题是何时添加了以下任一...

browser.driver.getAllWindowHandles().then(function(handles) {
    browser.driver.switchTo().window(handles[1]).then(function() {
        expect(browser.getLocationAbsUrl()).toContain('/console/login.jsp');
        expect(browser.driver.findElement(By.css('th.login')).getText()).toEqual('Login');
            });
        });

一个期望检查 URL,另一个检查页面上的 header 元素,这是一个表头。当我运行它时,我得到以下信息:

等待量角器与页面同步时出错:“在窗口上找不到角度”

当我决定在函数或beforeEach 中使用browser.ignoreSynchronization = true 时,无论是否将afterEach 设置为false,我都会得到以下信息:

JavascriptError: 角度未定义

我似乎无法得到任何“有用”的错误来帮助我调试它,并且在repl 中尝试它并没有帮助,因为我遇到了同样的问题。 全面地说,在没有获得第二个窗口的情况下尝试我的 URL 期望会给我根,而另一个会失败。 只是做一个或另一个会导致同样的问题。 更改为常规语法 (element(by.css...)) 不会改变任何事情。

【问题讨论】:

  • 您尝试获取 URL 的方法不是非常“AngularJS”,例如将“$state”注入 Angular 测试控制器然后获取 url 会简单得多从那里,例如 $state.href() 。您还可以使用“元素”来访问 DOM 元素,您可以在这里找到它正在使用的地方:stackoverflow.com/questions/19429025/…

标签: angularjs selenium protractor e2e-testing webdriverjs


【解决方案1】:

我的第一个问题就这么多...

看来我使用 browser.getLocationAbsUrl() 是为了用于 Angular 页面,并导致我的问题... 本质上,即使我相信我使用的是纯 Webdriver 调用,该调用仍然需要页面上的 Angular 才能工作...... 如another post 中所述,browser.driver.getCurrentUrl() 的使用是使用 Webdriver 的非 Angular 调用,并解决了问题。因此,最终的代码如下...

browser.sleep(1000); //to wait for the page to load
        browser.driver.getAllWindowHandles().then(function(handles) {
            browser.driver.switchTo().window(handles[1]).then(function() {
                expect(browser.driver.getCurrentUrl()).toContain('/console/login.jsp');
                expect(browser.driver.findElement(By.css('th.login')).getText()).toEqual('Login');
            });
        });

这可以在不设置 ignoreSynchronization 的情况下工作,顺便说一句。 我意识到修复它可能会相对简单,只是没想到我会这么快得到它(我打算昨晚提交问题,但今天早上发布了它)。

无论如何,我希望这至少对于面临同样问题的其他人来说是一个很好的参考。

【讨论】:

【解决方案2】:

似乎getLocationAbsUrl 是有角的绝对网址。
尝试改用本机驱动程序 getCurrentUrl。

-- 期望(browser.getLocationAbsUrl()).toContain('/console/login.jsp');
++ 期望(browser.driver.getCurrentUrl() ...

【讨论】:

  • 谢谢,我意识到这一点,并在您发布此内容时写下答案。不过,文档页面的链接肯定很有帮助;正是反复试验让我自己找到了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
相关资源
最近更新 更多