Javascript 焦点问题导致测试失败

Javascript 焦点问题导致测试失败,javascript,angularjs,selenium-webdriver,protractor,Javascript,Angularjs,Selenium Webdriver,Protractor,我正在使用osx 10.9.2、量角器0.21.0、selenium server standalone 2.40.0和chromedriver 2.9 我有一些问题,这(我相信)是由于窗口聚焦问题 当我使用量角器运行e2e测试时,浏览器窗口将显示,但我的终端仍然是焦点。这一点很明显,因为“终端”仍然显示在我的菜单栏中,而不是“Chrome”(osx行为指示哪个应用程序处于焦点) 我试图通过这样做来补救这种情况,但没有成功: browser.driver.getAllWindowHandles(

我正在使用osx 10.9.2、量角器0.21.0、selenium server standalone 2.40.0和chromedriver 2.9

我有一些问题,这(我相信)是由于窗口聚焦问题

当我使用量角器运行e2e测试时,浏览器窗口将显示,但我的终端仍然是焦点。这一点很明显,因为“终端”仍然显示在我的菜单栏中,而不是“Chrome”(osx行为指示哪个应用程序处于焦点)

我试图通过这样做来补救这种情况,但没有成功:

browser.driver.getAllWindowHandles().then(function(handles) {
  console.log(handles[0]);
  browser.driver.switchTo().window(handles[0]);
});
这种情况导致我的一些测试失败。例如,包含使用引导日期选择器单击字段的测试将不会显示日历,并且使我的测试无法与日期选择器日历交互

firefox上的情况更糟。如果浏览器没有焦点,Firefox在点击时甚至不会显示任何下拉菜单

有趣的是,当我在浏览器窗口第一次出现后手动单击它时,测试将正常工作

当我尝试另一种方法时:在新安装的DebianLinux上进行测试,但仍然不起作用。行为与上述类似


这些是我的配置文件:

不幸的是,IE和Firefox不能确保windows处理程序的顺序,所以我们需要迭代它们。关注新的浏览器窗口/选项卡也可能很棘手

我遇到了这些问题,因此我创建了:

一个帮助函数来解决这些问题 该助手的示例用法 最后是waitForMainWindow助手
我发现了一线希望!我使用安装程序从中降级了chrome,焦点问题消失了。。(不过firefox上的问题仍然存在)

如果你在谷歌上搜索“Chrome34焦点问题”,你会发现一些可能与此问题相关的报告。例如:

但我仍然不知道这是一个bug还是Chrome34的预期行为。所以现在我阻止google updater并使用Chrome33

// Needs an element to make sure we are on the correct popup
var waitForPopUpHandle = function(elm, errorMessage) {
    if (errorMessage == null) {
        errorMessage = 'Expected a new browser tab or window to pop up';
    };
    if (elm == null) {
        throw 'waitForPopUpHandle needs an element to wait for!';
    };

    browser.ignoreSynchronization = true; // not a protractor page
    // IE & Firefox don't ensure the windows handlers order, so we need iterate them.
    // First wait to have more that 1 browser tab
    browser.manage().timeouts().implicitlyWait(300); // a reasonable wait-retry time
    var i = 0;
    var popUpHandle = browser.driver.wait(function() {
        return browser.getAllWindowHandles().then(function(handles) {
            if (handles.length > 1) {
                return browser.switchTo().window(handles[i]).then(function() {
                    return browser.driver.isElementPresent(elm).then(function(result) {
                        if (result) {
                            return handles[i];
                        } else {
                            browser.sleep(400); // give it a break
                            i = i + 1;
                            if (i >= handles.length) {
                                i = 0;
                            };
                            return false;
                        };
                    });
                });
            } else {
                browser.sleep(400); // give it a break
                return false;
            };
        });
    }, browser.params.timeouts.pageLoadTimeout, errorMessage);
    // restore implicit wait
    browser.manage().timeouts().implicitlyWait(0); //restore

    return popUpHandle;
};
var popUpHandle = waitForPopUpHandle(by.css('div.some-element-unique-to-that-popup'));
browser.switchTo().window(popUpHandle).then(function() {
    browser.ignoreSynchronization = true; // not an angular page
    browser.driver.findElement(by.css('div.some-element-unique-to-that-popup')); // wait for the elm
    // your expect()'s go here ...
    // ...
    browser.close().then(function() {
        // This close() promise is necessary on IE and probably on Firefox too
        var mainTab = waitForMainWindow();
        expect(browser.switchTo().window(mainTab).then(function() {
            browser.ignoreSynchronization = false; // restore if main window is an angular page
            // Ensure we are back on the main window
            // ....
            return true;
        })).toBe(true);
    });
});
var waitForMainWindow = function(errorMessage) {
    if (errorMessage == null) {
        errorMessage = 'Expected main browser window to be available';
    };

    browser.ignoreSynchronization = true; // not an angular page
    return browser.driver.wait(function() {
        return browser.getAllWindowHandles().then(function(handles) {
            if (handles.length > 1) {
                var hnd = handles[handles.length - 1];
                return browser.switchTo().window(hnd).then(function() {
                    return browser.close().then(function() {
                        browser.sleep(400); // wait for close
                        return false;
                    });
                });
            } else {
                return handles[0];
            };
        });
    }, 5000, errorMessage);
};