второй вызов browser.getAllWindowHandles, вызывающий ошибку - PullRequest
0 голосов
/ 03 июля 2018

У меня есть следующий сценарий в моем скрипте транспортира: (некоторые части отредактированы из-за конфиденциальности)

  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() вместо этого? Как бы я реализовал это в этом сценарии?

1 Ответ

0 голосов
/ 05 июля 2018

ПОЛУЧИЛ ЭТО !!!!

Я нашел этот камень фрагмента в другом месте на SO, и он добился цели.

 browser.driver.wait(function () {
            return browser.getAllWindowHandles().then(function (handles) {

                if (handles.length > 1) {
                    return true;
                }
            });
        }, 10000, 'Waited for window count to be greater than 1');

Я вставил это прямо перед 5-секундным сном, и это сработало как шарм. Кроме того, отметим, что когда я не закрывал первое окно отчета, второе окно отчета не находилось в позиции 3 массива ручек. Он вставил себя в позицию 2, толкая первый отчет в позицию 3.

...