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