我正在编写一个简单的 selenium 测试,我需要截取网页的屏幕截图并将其另存为 PDF。我正在使用带有 Selenium 的 TestNG 和 PDFbox 库
下面是我的测试方法:
package com.helper;
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.testng.annotations.Test;
public class ScreenshotPDF {
@Test
public void screenshotPDF(){
WebDriver driver= DriverManager.getWebdriver("chrome");
driver.get("https://www.google.co.in");
try {
File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
PDImageXObject pdi = PDImageXObject.createFromFileByContent(screenshot ,document);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
contentStream.drawImage(pdi,100,100);
document.save("C:/Users/123456/Documents/sample.pdf");
contentStream.close();
document.close();
} catch (WebDriverException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这里,当我使用 TestNG 运行此测试时,我在控制台中收到以下错误:
FAILED: screenshotPDF
java.lang.IllegalStateException: Cannot read while there is an open stream writer
at org.apache.pdfbox.cos.COSStream.createRawInputStream(COSStream.java:129)
at org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream(COSWriter.java:1177)
at org.apache.pdfbox.cos.COSStream.accept(COSStream.java:372)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObject(COSWriter.java:561)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObjects(COSWriter.java:490)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteBody(COSWriter.java:474)
at org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1073)
at org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:419)
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1331)
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1229)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1095)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1067)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1055)
at com.helper.ScreenshotPDF.screenshotPDF(ScreenshotPDF.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:639)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:816)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1124)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
at org.testng.TestRunner.privateRun(TestRunner.java:774)
at org.testng.TestRunner.run(TestRunner.java:624)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:359)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:354)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:312)
at org.testng.SuiteRunner.run(SuiteRunner.java:261)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1215)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
at org.testng.TestNG.run(TestNG.java:1048)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:126)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:152)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:57)
===============================================
Default test
Tests run: 1, Failures: 1, Skips: 0
我做了很多谷歌搜索,但没有找到解决方案。请帮我解决这个错误。至少这个错误的原因是什么。提前谢谢你。
最佳答案
您需要在保存前关闭内容流:
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
PDImageXObject pdi = PDImageXObject.createFromFileByContent(screenshot ,document);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
contentStream.drawImage(pdi,100,100);
contentStream.close(); // do this before saving!
document.save("C:/Users/123456/Documents/sample.pdf");
document.close();
关于java.lang.IllegalStateException : Cannot read while there is an open stream writer 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39347301/