gpt4 book ai didi

javascript - 焦点问题使测试失败

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:32:53 25 4
gpt4 key购买 nike

我使用的是 osx 10.9.2、protractor 0.21.0、selenium-server-standalone 2.40.0 和 chromedriver 2.9。

我遇到了一些问题,(我相信)是由于窗口聚焦问题造成的。

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

我试图通过这样做来补救这种情况但无济于事:

browser.driver.getAllWindowHandles().then(function(handles) {
console.log(handles[0]);
browser.driver.switchTo().window(handles[0]);
});

这种情况导致我的一些测试失败。例如,包括使用 bootstrap datepicker 单击字段的测试不会显示日历,并且使我的测试无法与 datepicker 日历交互。

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

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

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

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

最佳答案

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

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

克服这些问题的辅助函数

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

关于javascript - 焦点问题使测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23100816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com