【问题标题】:Non-angular page opened after a click单击后打开的非角度页面
【发布时间】:2015-02-14 00:29:08
【问题描述】:

我正在尝试实现以下测试场景:

  • 单击页面上的徽标
  • 断言打开了一个新的浏览器窗口(Chrome 中的选项卡)并检查当前 URL

问题是在新的浏览器窗口中打开的页面是一个非角度页面,而我正在执行点击的主页是一个有角度的页面 .

这是我的第一次尝试:

it("should show logo", function () {
    var logo = scope.page.logo;
    expect(logo.isDisplayed()).toEqual(true);

    // opens a new page on click
    logo.click().then(function () {
        browser.getAllWindowHandles().then(function (handles) {
            browser.switchTo().window(handles[1]).then(function () {
                expect(browser.getCurrentUrl()).toEqual('http://myurl.com/');
            });

            // switch back to the main window
            browser.switchTo().window(handles[0]);
        });
    });
});

失败:

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

这是可以理解的。

我的第二次尝试是使用 ignoreSynchronization 布尔标志:

browser.ignoreSynchronization = true;
logo.click().then(function () {
    browser.getAllWindowHandles().then(function (handles) {
        browser.switchTo().window(handles[1]).then(function () {
            expect(browser.getCurrentUrl()).toEqual('http://myurl.com/');
        });

        // switch back to the main window
        browser.switchTo().window(handles[0]);
    });

这实际上使这个特定的测试通过而没有任何错误,但它会影响在此之后执行的每个测试,因为browser 是一个全局对象并且在测试之间共享 - 量角器不再与页面上的角度同步,从而导致各种错误。

我应该如何实施测试?


作为一种解决方法,我可以将 restartBrowserBetweenTests setting 更改为 true 并更改 ignoreSynchronization 值而不会出现任何问题 - 但它会显着减慢测试速度。

【问题讨论】:

    标签: javascript angularjs testing protractor end-to-end


    【解决方案1】:

    验证完成后,您可以将 ignoreSynchronization 设置为 false。但是,请注意,ignoreSynchronization 是同步的,而其他所有内容(单击/获取/等)都是异步的,因此您需要小心。可能最安全的方法是在 beforeEach 中将其设置为 true,在 afterEach 中将其设置为 false,然后在该测试中测试单个徽标单击。

    【讨论】:

    • 是的,将其设置在 it 块的末尾会使其有时有效,有时无效 - 行为变得不一致。我会尝试beforeEachafterEach 并回复您。谢谢!
    • 是的,将ignoreSynchronization 设置回falseafterEach() 成功了!
    【解决方案2】:

    另一个解决方案:我使用了sleep,因为getWindowHandles 是 只返回一个窗口名称(父/角窗口)。让我知道是否有 是更好的方法。

    this.validateProductPageInfo = function (productTitle) {
        browser.sleep(5000);
        browser.getAllWindowHandles().then(function (handles) {
            if (handles.length === 2) {
                browser.switchTo().window(handles[1]).then(function () {
                    var prodTitle = by.xpath('//h1[@id="fw-pagetitle"]');
                    browser.driver.findElement(prodTitle).getText().then(function (text) {
                        expect(text).toBe(productTitle);
                    });
                });
                browser.switchTo().window(handles[0]);
            } else {
                console.log("Error in switching to non angular window");
            }
        });
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 2023-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多