У меня есть следующий сценарий в моем скрипте транспортира: (некоторые части отредактированы из-за конфиденциальности)
it('user story, screen captures', function() {
// Make sure page loads before screenshot happens
browser.waitForAngular();
// Mouseover the status element to get mouse away from toastr popup so the logout link will appear
browser.actions().mouseMove(createPage.menuDocview).perform();
// Sleep the browser to get rid of toastr popup
browser.sleep(5000);
// Take screenshot of page
browser.takeScreenshot().then(function (jpg) {
writeScreenShot(jpg, 'XXX.jpg');
});
// Click on the menu item
createPage.menuDocview.click();
// Fill in a last name
createPage.lastName_input.sendKeys('smith');
// Click the Submit button
createPage.submitButton.click();
// Make sure page loads before screenshot happens
browser.waitForAngular();
// Mouseover the selected dataRow element
browser.actions().mouseMove(createPage.dataRow.get(3)).perform();
// Take screenshot of page
browser.takeScreenshot().then(function (jpg) {
writeScreenShot(jpg, 'XXX.jpg');
});
// Find the element we want (XXX) and click it
createPage.dataRow.get(3).click();
// Make sure page loads before screenshot happens
browser.waitForAngular();
// Take screenshot of page
browser.takeScreenshot().then(function (jpg) {
writeScreenShot(jpg, 'XXX.jpg');
});
// Mouseover the selected dataRow element
browser.actions().mouseMove(createPage.statusDiv.get(0)).perform();
// Sleep the browser to give popup a chance to show
browser.sleep(2000);
// Take screenshot of page
browser.takeScreenshot().then(function (jpg) {
writeScreenShot(jpg, 'XXX.jpg');
});
// Mouseover the button element
browser.actions().mouseMove(createPage.printPrescriber).perform();
// Take screenshot of page
browser.takeScreenshot().then(function (jpg) {
writeScreenShot(jpg, 'XXX.jpg');
});
// Click the button to get the report
createPage.printPrescriber.click();
// Switch to report window and screenshot it
// Sleep the browser for a few seconds to give it time to openup new window/tab
browser.sleep(5000);
// We'll need to switch to new window, so first grab the window handles...
browser.getAllWindowHandles().then(function (handles) {
// then grab our new window's handle...
var mainWindowHandle = handles[0]; // this is your main window
var newWindowHandle = handles[1]; // this is your new window
// then switch to it.
browser.switchTo().window(newWindowHandle).then(function () {
// this next line is necessary since the generated page isn't Angular, and, as such, Protractor will timeout waiting for it to validate as an Angular page
browser.ignoreSynchronization = true;
// Take screenshot of page
browser.takeScreenshot().then(function (jpg) {
writeScreenShot(jpg, 'XXX.jpg');
});
// browser.close(); //close the current browser
browser.switchTo().window(mainWindowHandle) //Switch to main window
.then(function(){
// Mouseover the Print History button element
browser.actions().mouseMove(createPage.printHistory).perform();
// Take screenshot of page
browser.takeScreenshot().then(function (jpg) {
writeScreenShot(jpg, 'XXX.jpg');
});
// Click the button to get the report
createPage.printHistory.click();
// Switch to report window and screenshot it
// Sleep the browser for a few seconds to give it time to openup new window/tab
browser.sleep(12000);
// We'll need to switch to new window, so first grab the window handles...
browser.getAllWindowHandles().then(function (handles) {//THIS IS THE PROBLEM LINE WHERE IT DIES
// then grab our new window's handle...
var newWindowHandle2 = handles[2]; // this is your new window
// then switch to it.
browser.switchTo().window(newWindowHandle2).then(function () {
// this next line is necessary since the generated page isn't Angular, and, as such, Protractor will timeout waiting for it to validate as an Angular page
browser.ignoreSynchronization = true;
// Take screenshot of page
browser.takeScreenshot().then(function (jpg) {
writeScreenShot(jpg, 'XXX.jpg');
});
// Just send true back since there's nothing we really want to commit to checking on the pdf. If there's a problem, we'll have it before this point.
expect(true);
});
});
});
});
});
});
Я построил это понемногу, в основном добавляя каждый фрагмент перед каждым снимком экрана, чтобы убедиться, что он работает, прежде чем перейти к следующему фрагменту. Последний фрагмент, начиная со второго вызова browser.getAllWindowHandles()
, вылетает из сценария и выдает ошибку:
Failed: java.net.SocketException: Software caused connection abort: recv failed
Я увеличил время ожидания до смешного (как вы можете видеть). Я прокомментировал browser.close()
на тот случай, если это будет сделано. Все еще понимаю.
Когда я смотрю тестовый прогон, он все делает нормально и даже нажимает последнюю кнопку, генерируя последний отчет. Это просто каркает, когда я спрашиваю это, чтобы получить оконные ручки во второй раз. Я даже получаю скриншот прямо перед ним.
Я много гуглил и даже искал эту ошибку на SO, и все еще не понимаю, почему он это делает.
Спасибо!
РЕДАКТИРОВАТЬ: Итак, я только что попробовал это только с нажатием второго отчета. Та же ошибка. Может быть, второй доклад слишком длинный? Очевидно, что-то не так со вторым отчетом (сгенерированный PDF из динамических данных). Какие вещи могут вызвать эту ошибку в сгенерированном PDF?
РЕДАКТИРОВАТЬ 2: я увеличил browser.wait
до 20 секунд и все еще получаю его. Я не думаю, что это проблема времени.
РЕДАКТИРОВАТЬ 3 (7/5): Таким образом, кажется, что это может иметь какое-то отношение к времени. Новое окно отчета займет немного времени. Если я сплю 5 секунд, я получаю сообщение об ошибке, что он не может найти дескриптор, так как он не существует. Я перемещаюсь до 6 секунд, и я получаю socketException. Будет ли это кандидатом для перехода на использование browser.wait()
вместо этого? Как бы я реализовал это в этом сценарии?