我正在尝试实施以下测试方案:
问题是在新浏览器窗口中打开的页面是非角度页面,而我正在执行点击的主页面是角度页面 。
这是我的第一次尝试:
it("should show logo", function () {
var logo = scope.page.logo;
expect(logo.isDisplayed()).toEqual(true);
// opens a new page on click
logo.click().then(function () {
browser.getAllWindowHandles().then(function (handles) {
browser.switchTo().window(handles[1]).then(function () {
expect(browser.getCurrentUrl()).toEqual('http://myurl.com/');
});
// switch back to the main window
browser.switchTo().window(handles[0]);
});
});
});
失败了:
错误:等待Protractor与页面同步时出错: “在窗户上找不到角”
这是可以理解的。
我的第二次尝试是使用ignoreSynchronization
布尔标志:
browser.ignoreSynchronization = true;
logo.click().then(function () {
browser.getAllWindowHandles().then(function (handles) {
browser.switchTo().window(handles[1]).then(function () {
expect(browser.getCurrentUrl()).toEqual('http://myurl.com/');
});
// switch back to the main window
browser.switchTo().window(handles[0]);
});
这实际上使这个特定的测试通过而没有任何错误,但是它会影响在此之后执行的每个测试,因为browser
是一个全局对象并且在测试之间共享 - 量角器不再与页面上的角度同步导致各种错误。
我应该如何实施测试?
作为一种解决方法,我可以将restartBrowserBetweenTests
setting更改为true
并更改ignoreSynchronization
值而不会出现任何问题 - 但它会大大减慢测试速度。
答案 0 :(得分:12)
验证完成后,您可以将ignoreSynchronization
设置为false。但请注意,ignoreSynchronization是同步的,而其他所有内容(click / get / etc)都是异步的,因此您需要小心。可能最安全的方法是在beforeEach中将其设置为true,在afterEach中将其设置为false,并且只测试该测试中的单个徽标单击。
答案 1 :(得分:1)
另一种解决方案:自sleep
以来我使用过getWindowHandles
仅返回一个窗口名称(父/角窗口)。如果有,请告诉我
是一种更好的方式。
this.validateProductPageInfo = function (productTitle) {
browser.sleep(5000);
browser.getAllWindowHandles().then(function (handles) {
if (handles.length === 2) {
browser.switchTo().window(handles[1]).then(function () {
var prodTitle = by.xpath('//h1[@id="fw-pagetitle"]');
browser.driver.findElement(prodTitle).getText().then(function (text) {
expect(text).toBe(productTitle);
});
});
browser.switchTo().window(handles[0]);
} else {
console.log("Error in switching to non angular window");
}
});
};