焦点问题使测试失败

时间:2014-04-16 05:34:40

标签: 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().then(function(handles) {
  console.log(handles[0]);
  browser.driver.switchTo().window(handles[0]);
});

这种情况导致我的一些测试失败。例如,包含单击带引导日期选择器的字段的测试将不会显示日历,并且使我的测试无法与日期选择器日历交互。

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

有趣的是,当我第一次出现后手动点击浏览器窗口时,测试将正常运行。

当我尝试不同的方法时:在新安装的debian linux上进行测试,仍然无法正常工作。行为与上述相似。

这些是我的配置文件:https://gist.github.com/giosakti/ca24a13705d15f4374b0

2 个答案:

答案 0 :(得分:3)

不幸的是IE& Firefox不确保Windows处理程序的顺序,所以我们需要迭代它们。而关注新的浏览器窗口/标签也很棘手。

我遇到了这些问题所以我创建了:

克服这些问题的帮助函数

// 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);
    });
});

最后是waitForMainWindow帮助

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);
};

答案 1 :(得分:-2)

我发现了一线希望!我使用来自http://google-chrome.en.uptodown.com/mac/old的安装程序降级了chrome并且焦点问题已经消失..(问题仍然存在于firefox上)..

如果您在Google上搜索“chrome 34焦点问题”,您会发现一些可能与此问题相关的报告。例如:https://productforums.google.com/forum/#!topic/chrome/pN5pYf2kolc

但我仍然不知道这是否是Chrome 34的错误或预期行为。所以现在我阻止谷歌更新并使用Chrome 33。