10G 高级 WebDriver – 将屏幕截图保存到 Word 文档

原文: https://javabeginnerstutorial.com/selenium/10g-advanced-webdriver-saving-screenshots-to-word-document/

嗨冠军! 希望您度过愉快的时光截屏并将其保存在本地。 今天,让我们看看如何创建 Word 文档,并将在测试用例中捕获的所有图像插入其中。 每个测试用例都有一个单独的文档,不仅可以帮助我们保持工作空间井井有条,而且搜索特定的屏幕快照也很容易。 最好的部分是,我们将编写代码,以便所有这些事情自动发生而无需任何人工干预。

请允许我直截了当。

步骤 1:

下载几个 JAR,使我们的工作更加轻松。

java2word-3.3.jar - 帮助我们创建 Word 文档并以所需方式对其进行操作。

xstream-1.3.1.jar – 处理图片

让我们继续从 https://code.google.com/archive/p/java2word/downloads (在撰写本文时的下载位置)下载这两个 JAR 文件。 我还将这些 JAR 以及本文中处理的所有其他代码文件一起放在我们的 GitHub 仓库中。

步骤 2:

将这些 JAR 添加到我们的项目构建路径中。

之前,我们已经多次看到此过程,因此,我不再重复(有关详细说明,请参阅文章的步骤 3)。

步骤 3:

创建一个类“SaveDocument.java”。

将以下代码添加到类文件中,

  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.io.PrintWriter;
  4. import word.api.interfaces.IDocument;
  5. import word.w2004.Document2004;
  6. import word.w2004.Document2004.Encoding;
  7. import word.w2004.elements.BreakLine;
  8. import word.w2004.elements.Heading1;
  9. import word.w2004.elements.Heading3;
  10. import word.w2004.elements.Image;
  11. import word.w2004.elements.Paragraph;
  12. import word.w2004.style.HeadingStyle.Align;
  13. public class SaveDocument {
  14. public static void createDoc(String testCaseName, String[] imgFileNames) {
  15. // Create a document object
  16. IDocument myDoc = new Document2004();
  17. myDoc.encoding(Encoding.UTF_8);
  18. // Inserts one breakline
  19. myDoc.addEle(BreakLine.times(1).create());
  20. // Add client logo to document header
  21. myDoc.getHeader().addEle(Image.from_FULL_LOCAL_PATHL("/Selenium/Logo.png")
  22. .setHeight("30")
  23. .setWidth("20")
  24. .getContent());
  25. // Add Project name to document header
  26. myDoc.getHeader().addEle(Heading3.with(" ProjectName").withStyle().align(Align.RIGHT).create());
  27. // Specify Test case name as document heading
  28. myDoc.addEle(Heading1.with(testCaseName + " Test Case").withStyle().align(Align.CENTER).create());
  29. myDoc.addEle(BreakLine.times(1).create());
  30. // Add a description paragraph
  31. myDoc.addEle(Paragraph
  32. .with("Following are the related screenshots")
  33. .create());
  34. myDoc.addEle(BreakLine.times(1).create());
  35. // Add company name to document footer
  36. myDoc.getFooter().addEle(
  37. Paragraph.with("@CompanyName").create());
  38. // Loop through all the image files
  39. for(String file:imgFileNames){
  40. // Insert each image file to the document
  41. myDoc.addEle(Image.from_FULL_LOCAL_PATHL(
  42. "/Selenium/screenshots/" + file + ".png")
  43. .setHeight("350")
  44. .setWidth("500")
  45. .getContent());
  46. // Insert 2 linebreaks at the end of each inserted image
  47. myDoc.addEle(BreakLine.times(2).create());
  48. }
  49. // Insert an image from web
  50. myDoc.addEle(Image
  51. .from_WEB_URL("http://www.google.com/images/logos/ps_logo2.png"));
  52. // Create the word document specifying a location
  53. File fileObj = new File("\\Selenium\\" + testCaseName + ".doc");
  54. PrintWriter writer = null;
  55. try {
  56. writer = new PrintWriter(fileObj);
  57. } catch (FileNotFoundException e) {
  58. e.printStackTrace();
  59. }
  60. String myWord = myDoc.getContent();
  61. writer.println(myWord);
  62. writer.close();
  63. // Print a confirmation image to console
  64. System.out.println("Word document created successfully!");
  65. }
  66. }

每行都提供了注释,以使代码易于说明。

public static void createDoc(String testCaseName, String[] imgFileNames) -此方法有两个参数。 第一个是一个字符串,它指定测试用例的名称。 这将是将要创建的单词文档的名称。 第二个参数是作为该测试用例的一部分捕获的所有屏幕快照名称的数组。

在这种方法中,我们将创建一个文档对象并执行诸如

  • 添加标题,段落
  • 在标题中添加客户徽标和公司名称
  • 在页脚中添加公司名称
  • 插入作为特定测试用例一部分捕获的所有屏幕截图
  • 从网上插入图片(只是为了证明这种情况也是可行的)
  • 将单词文档和测试用例的名称保存在特定位置

步骤 4:

对“SaveScreenshot.java”文件进行了一些修改。

对我们在先前文章中创建的“SaveScreenshot.java”类进行了一些更改。

  1. 删除生成时间戳的函数,并
  2. 文件扩展名从“.jpg”更改为“.png

现在的代码看起来像这样,

  1. import java.io.File;
  2. import java.io.IOException;
  3. import org.apache.commons.io.FileUtils;
  4. import org.openqa.selenium.OutputType;
  5. import org.openqa.selenium.TakesScreenshot;
  6. import org.openqa.selenium.WebDriver;
  7. public class SaveScreenshot {
  8. public static void capture(String screenshotName, WebDriver driver) {
  9. // Cast driver object to TakesScreenshot
  10. TakesScreenshot screenshot = (TakesScreenshot) driver;
  11. // Get the screenshot as an image File
  12. File src = screenshot.getScreenshotAs(OutputType.FILE);
  13. try {
  14. // Specify the destination where the image will be saved
  15. File dest = new File("\\Selenium\\screenshots\\" + screenshotName + ".png");
  16. // Copy the screenshot to destination
  17. FileUtils.copyFile(src, dest);
  18. } catch (IOException ex) {
  19. System.out.println(ex.getMessage());
  20. }
  21. }
  22. }

示例场景

  1. 打开 Firefox 浏览器。
  2. 导航到 Google 帐户创建页面
  3. 通过 ID 找到名字文本框
  4. 输入“fname01”作为名字
  5. 截取屏幕截图,并将其命名为“testCaseName+1
  6. 按名称找到姓氏文本框
  7. 输入“lname01”作为姓氏
  8. 截取屏幕截图并将其命名为“testCaseName+2
  9. 在指定位置创建一个 word 文档,并将这两个屏幕截图都插入其中。

JUnit 代码:

WordDocWithScreenshotTest.java

  1. import java.util.concurrent.TimeUnit;
  2. import org.junit.After;
  3. import org.junit.Before;
  4. import org.junit.Test;
  5. import org.openqa.selenium.By;
  6. import org.openqa.selenium.WebDriver;
  7. import org.openqa.selenium.WebElement;
  8. import org.openqa.selenium.firefox.FirefoxDriver;
  9. import com.blog.utilities.SaveDocument;
  10. import com.blog.utilities.SaveScreenshot;
  11. public class WordDocWithScreenshotTest {
  12. //Declaring variables
  13. private WebDriver driver;
  14. private String baseUrl;
  15. private String testCaseName = "WordDocWithScreenshot";
  16. @Before
  17. public void setUp() throws Exception{
  18. // Selenium version 3 beta releases require system property set up
  19. System.setProperty("webdriver.gecko.driver", "E:\\Softwares\\"
  20. + "Selenium\\geckodriver-v0.10.0-win64\\geckodriver.exe");
  21. // Create a new instance for the class FirefoxDriver
  22. // that implements WebDriver interface
  23. driver = new FirefoxDriver();
  24. // Implicit wait for 5 seconds
  25. driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
  26. // Assign the URL to be invoked to a String variable
  27. baseUrl = "https://accounts.google.com/SignUp";
  28. }
  29. @Test
  30. public void testPageTitle() throws Exception{
  31. // Open baseUrl in Firefox browser window
  32. driver.get(baseUrl);
  33. // Locate First Name text box by id and
  34. // assign it to a variable of type WebElement
  35. WebElement firstName = driver.findElement(By.id("firstName"));
  36. // Clear the default placeholder or any value present
  37. firstName.clear();
  38. // Enter/type the value to the text box
  39. firstName.sendKeys("fname01");
  40. //Take a screenshot
  41. SaveScreenshot.capture(testCaseName + "1", driver);
  42. // Locate last name text box by name
  43. WebElement lastName = driver.findElement(By.name("lastName"));
  44. // Clear and enter a value
  45. lastName.clear();
  46. lastName.sendKeys("lname01");
  47. // Take a screenshot
  48. SaveScreenshot.capture(testCaseName + "2", driver);
  49. // Create a word document and include all screenshots
  50. SaveDocument.createDoc(testCaseName, new String[]{testCaseName + "1",testCaseName + "2"});
  51. }
  52. @After
  53. public void tearDown() throws Exception{
  54. // Close the Firefox browser
  55. driver.close();
  56. }
  57. }

如果遵循注释,该代码是不言自明的。 Eclipse 的输出如下,

Document Eclipse output

在 Eclipse IDE 中,“JUnit”窗格清楚地显示了测试用例“WordDocWithScreenshotTest.java”已通过,并且控制台没有错误。 按预期打印“Word 文档创建成功”。

按照代码中的指定,屏幕快照将以上述格式的名称保存到“E:/Selenium/screenshots”路径中。

Saved screenshots

还将创建单词文档并将其保存在指定的位置“ E:/Selenium/”中。 该文件如下所示,

Created Word Document

创建的 Word 文档,所有代码文件和 JAR 文件都放置在 GitHub 仓库中,以便于访问。 您可以为仓库加注星标和分支以方便使用。 请仔细阅读“README.md”文件以获取明确说明。

编码愉快! 祝你今天愉快!