Почему Selenium завершает мой сеанс в течение 0 мс времени после чтения содержимого PDF в параллельном прогоне Jenkins? - PullRequest
0 голосов
/ 10 января 2019

У меня есть очень специфическая проблема, которую я не могу понять. Пожалуйста, поймите, что я не могу поделиться всем своим кодом из-за политики работы. Вот что происходит:

Steps

  1. Откройте PDF-файл, который появится в новом окне.
  2. Получите дескриптор окна для текущего окна, а затем переключитесь в окно PDF.
  3. Запустите JavaScript, чтобы убедиться, что окно готово к взаимодействию (что проходит).
    • return !window.testing || window.testing.isApplicationReady()
  4. В блоке try:
    1. Открыть InputStream через URL-адрес окна PDF (getInputFromURLWithCookies, как показано ниже в « Фрагменты кода »).
    2. PDDocument document = org.apache.pdfbox.pdmodel.PDDocument.load(theInputStream)
    3. new org.apache.pdfbox.text.PDFTextStripper().getText(document) (который отлично возвращает текст)
  5. В сопровождающем блоке finally мы запускаем еще один блок try и ...
    1. document.close();
    2. driver.close();
    3. driver.switchTo().window(parentWindow);
  6. Сценарий умирает где-то в блоке finally, который вызывает наш метод ITestListener onTestFailure, который, в свою очередь, вызывает наш метод takeSnapShot (оба ниже в " Фрагментах кода ").
    • Однако мы не можем получить снимок экрана, так как к моменту попытки сеанс уже мертв.

Фрагменты кода:

public static InputStream getInputFromURLWithCookies(String url) {
    try {
        URLConnection connection = new URL(url).openConnection();
        Driver.instance().getDriver().manage().getCookies().forEach(
                cookie -> connection.addRequestProperty("Cookie", cookie.getName() + "=" + cookie.getValue()));
        return connection.getInputStream();
    } catch (IOException ex) {
        LOGGER.error("Could not establish input stream from URL '{}'", ex);
        return null;
    }
}

@Override
public void onTestFailure(ITestResult result) {
    String methodName = result.getMethod().getMethodName();
    String currentDir = Paths.get("").toAbsolutePath().toString();
    String userSetDir = System.getProperties().getProperty("screenShot.dir");
    String dir = userSetDir != null? userSetDir: currentDir;
    PageUtils.takeSnapShot(driver(), dir, methodName + ".png");
}   

public static void takeSnapShot(WebDriver webdriver, String dir, String fileName) {
    File directory = new File(dir);
    File destFile = new File(dir + File.separator + fileName);
    File srcFile;
    if (!directory.exists()) {
        directory.mkdir();
    }
    try {
        TakesScreenshot screenShot = ((TakesScreenshot) webdriver);
        srcFile = screenShot.getScreenshotAs(OutputType.FILE);
        FileCopyUtils.copy(srcFile, destFile);
    } catch (WebDriverException | IOException e) {
        if (e.getMessage().contains("was terminated due to TIMEOUT")) {
            LOGGER.error("{}. {}", UNABLE_TO_TAKE_SCREENSHOT, e.getMessage());
        } else {
            LOGGER.error(UNABLE_TO_TAKE_SCREENSHOT, e);
        }
    }
}

Сбой ситуации

  • Эта ошибка не возникает при локальном тестировании, только при тестировании Jenkins.
    • Как я понимаю, установка Selenium Grid / Jenkins не была изменена по сравнению со стандартной.
    • Мы запускаем наши тесты без поддержки на узле Linux.
    • Задание Jenkins запускает пакет сценариев одновременно.
    • Задание должно выполняться одновременно с другими заданиями в сетке. То есть, если мы запускаем задание самостоятельно, оно проходит.
  • Код не выполняется в разных местах в блоке finally.
    • Иногда до закрытия PDDocument, иногда после.
    • Иногда проверка доступных оконных дескрипторов вызывает сбой, иногда нет.
    • Все сценарии в пакете завершаются с ошибкой в ​​этом блоке.

Данные об ошибках

Отчет об отказе Jenkins:

[ERROR] testMethod(test.TheTest)  Time elapsed: 205.063 s  <<< FAILURE!
org.openqa.selenium.WebDriverException: 
Session [b8bcc90b65928a057f3cc84020e08f81] was terminated due to TIMEOUT
Command duration or timeout: 0 milliseconds
    at test.testMethod(TheTest.java:73)
Caused by: org.openqa.selenium.WebDriverException: 
Session [b8bcc90b65928a057f3cc84020e08f81] was terminated due to TIMEOUT
Build info: version: '3.11.0', revision: 'e59cfb3', time: '2018-03-11T20:26:55.152Z'
System info: host: 'jenkins-slave-7904e12701dd49', ip: '172.17.45.11', os.name: 'Linux', os.arch: 'amd64', os.version: '3.10.0-693.11.1.el7.x86_64', java.version: '1.8.0_152'
Driver info: driver.version: unknown

Вывод на консоль, приводящий к сбою:

Jan 09, 2019 8:56:07 PM org.apache.pdfbox.pdmodel.font.FileSystemFontProvider loadDiskCache
WARNING: New fonts found, font cache will be re-built
Jan 09, 2019 8:56:07 PM org.apache.pdfbox.pdmodel.font.FileSystemFontProvider <init>
WARNING: Building on-disk font cache, this may take a while
Jan 09, 2019 8:56:07 PM org.apache.pdfbox.pdmodel.font.FileSystemFontProvider <init>
WARNING: Finished building on-disk font cache, found 22 fonts
Jan 09, 2019 8:56:07 PM org.apache.pdfbox.pdmodel.font.PDType1Font <init>
WARNING: Using fallback font LiberationSans for base font Symbol
Jan 09, 2019 8:56:07 PM org.apache.pdfbox.pdmodel.font.PDType1Font <init>
WARNING: Using fallback font LiberationSans for base font ZapfDingbats
20:56:08.326 [TestNG-test=wsc tests-2] ERROR c.r.a.util.PageUtils - Unable to take screen shot. Session [1cfd68713bb915fedeb4ace4741ea1ea] was terminated due to TIMEOUT
Command duration or timeout: 0 milliseconds
...