我有两个非角度页面,一个有我能够输入文本的表单,一旦我点击Invoke按钮,我得到另一个浏览器窗口(在Chrome中显示为一个选项卡),带有一些文本输出。新选项卡成为焦点,但是一旦我尝试获取新元素,它就会重新聚焦在第一个选项卡上。这是我的测试结果:
beforeEach(function () {
browser.ignoreSynchronization = true;
});
it('Do authentication of session', function () {
session.goToCommandPage().then(function () {
browser.findElement(by.css('#content > span:nth-child(3) > ul > li:nth-child(5) > a', 'AuthenticateUser')).click();
}).then(function () {
browser.findElement(by.css('#content > span > form > table > tbody > tr:nth-child(3) > td:nth-child(2) > input')).sendKeys(COMPANY_ID);
}).then(function () {
browser.findElement(by.css('#content > span > form > table > tbody > tr:nth-child(4) > td:nth-child(2) > input')).sendKeys('ADMIN');
}).then(function () {
browser.findElement(by.buttonText('Invoke')).click();
}).then(function () {
browser.sleep(7000);
})
});
it('Switch to the results tab', function () {
browser.getAllWindowHandles().then(function (handles) {
browser.getTitle().then(function (title) {
console.log('Title: ' + title);
});
if (handles.length === 2) {
browser.switchTo().window(handles[1]).then(function () {
browser.sleep(7000);
}).then(function () {
browser.getTitle().then(function (title) {
console.log('Title now: ' + title);
});
browser.findElement(by.css('.collapsible .expanded .text')).getText().then(function (textProduced) {
console.log('Text printed: ' + textProduced);
});
});
}
});
});
正如您在上面所看到的,我尝试使用句柄,但是在我访问句柄[1]的地方,它并没有在视觉上将标签更改为第二个。这段代码挂在我拿到句柄的地方。我看到标题打印出来,它是第一个表单的标题,但它只是在给出一个ScriptTimeoutError后超时。我甚至试图将钥匙发送到身体,这确实改变了标签,但第二个标签的元素无法找到。我正在使用Chrome和Protractor来运行我的测试。我通常使用角度页面,但这两个不是角度页面,而是做我将稍后在角度页面中检查的事情。
提前谢谢你。
编辑:我已经编辑了我的代码来浏览句柄并根据页面标题进行更改。它似乎没有改变到另一个标签。关于我可能做错什么的任何建议?注意:这是用JavaScript编写的。
it('Switch to the results tab', function () {
browser.getAllWindowHandles().then(function (handles) {
browser.getTitle().then(function (title) {
console.log('Title: ' + title);
});
if (handles.length > 1) {
handles.forEach(function (tab) {
browser.switchTo().window(tab).then(function () {
browser.sleep(7000);
}).then(function () {
browser.getTitle().then(function (title) {
console.log('Title now: ' + title);
if(title != 'WebService Web Service') {
browser.findElement(by.css('.collapsible .expanded .text')).getText().then(function (textProduced) {
console.log('Text printed: ' + textProduced);
});
}
});
});
});
}
});
});
答案 0 :(得分:0)
编辑:代码我用来转移到新打开的窗口,但它会导致" ScriptTimeoutError:超时:超时接收来自渲染器"的消息。
it('Switch to the results tab', function () {
browser.driver.getAllWindowHandles().then(function (handles) {
browser.driver.getTitle().then(function (title) {
console.log('Title: ' + title);
});
if (handles.length > 1) {
browser.driver.switchTo().window(handles[1]).then(function () {
browser.manage().timeouts().pageLoadTimeout(7000);
}).then(function () {
var outputElement = $('.collapsible .expanded .collapsible-content .text');
var isClickable = EC.elementToBeClickable(outputElement);
browser.wait(isClickable, 12000, 'Waiting for output element');
}).then(function () {
browser.driver.getTitle().then(function (title) {
console.log('Title now: ' + title);
browser.driver.findElement(by.css('.collapsible .expanded .collapsible-content .text')).getText().then(function (textProduced) {
console.log('Text printed: ' + textProduced);
});
});
});
}
});
});
以下代码有时会运行,但大部分时间都会失败。
以下是修改后的代码:
describe('Test', function () {
beforeEach(function () {
browser.ignoreSynchronization = true;
});
it('Do authentication of session', function () {
session.goToCommandPage().then(function () {
browser.sleep(12000);
}).then(function () {
browser.driver.wait(function () {
return browser.driver.findElement(by.css('#content > span:nth-child(3) > ul > li:nth-child(5) > a'))
.then(function (elem) {
elem.click();
return true;
});
}, 12000, 'Waited for the AuthenticateUser link to load');
}).then(function () {
browser.driver.wait(function () {
return browser.driver.findElement(by.css('#content > span > form > table > tbody > tr:nth-child(3) > td:nth-child(2) > input'))
.then(function (elem) {
elem.sendKeys(COMPANY_ID);
return true;
});
}, 12000, 'Waited for the Company ID field to load');
}).then(function () {
browser.driver.wait(function () {
return browser.driver.findElement(by.css('#content > span > form > table > tbody > tr:nth-child(4) > td:nth-child(2) > input'))
.then(function (elem) {
elem.sendKeys('ADMIN');
return true;
});
}, 12000, 'Waited for the User field to load');
}).then(function () {
browser.driver.wait(function () {
return browser.driver.findElement(by.css('#content > span > form > table > tbody > tr:nth-child(6) > td:nth-child(2) > input'))
.then(function (elem) {
elem.submit();
return true;
});
}, 12000, 'Waited for the Invoke button to load');
}).then(function () {
browser.sleep(7000);
}).then(function () {
browser.driver.wait(function () {
return browser.driver.getAllWindowHandles().then(function (handles) {
if (handles.length > 1) {
return true;
}
});
}, 12000, 'Waited for window count to be greater than 1');
});
});
it('Switch to the results tab', function () {
browser.driver.getAllWindowHandles().then(function (handles) {
browser.driver.getTitle().then(function (title) {
console.log('Title: ' + title);
});
if (handles.length > 1) {
handles.forEach(function (tab) {
browser.driver.switchTo().window(tab).then(function () {
browser.sleep(7000);
}).then(function () {
browser.driver.getTitle().then(function (title) {
console.log('Title now: ' + title);
if(title == 'localhost/Service/WebService.asmx/AuthenticateUser') {
browser.driver.findElement(by.css('.collapsible .expanded .collapsible-content .text')).getText().then(function (textProduced) {
console.log('Text printed: ' + textProduced);
});
}
});
});
});
}
});
});
});
我不知道为什么我不能始终如一地通过。