У меня есть очень специфическая проблема, которую я не могу понять. Пожалуйста, поймите, что я не могу поделиться всем своим кодом из-за политики работы. Вот что происходит:
Steps
- Откройте PDF-файл, который появится в новом окне.
- Получите дескриптор окна для текущего окна, а затем переключитесь в окно PDF.
- Запустите JavaScript, чтобы убедиться, что окно готово к взаимодействию (что проходит).
return !window.testing || window.testing.isApplicationReady()
- В блоке
try
:
- Открыть
InputStream
через URL-адрес окна PDF (getInputFromURLWithCookies
, как показано ниже в « Фрагменты кода »).
PDDocument document = org.apache.pdfbox.pdmodel.PDDocument.load(theInputStream)
new org.apache.pdfbox.text.PDFTextStripper().getText(document)
(который отлично возвращает текст)
- В сопровождающем блоке
finally
мы запускаем еще один блок try
и ...
document.close();
driver.close();
driver.switchTo().window(parentWindow);
- Сценарий умирает где-то в блоке
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