我正在使用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
答案 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);
});
});
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。