使用 Selenium 将测试结果写入 Excel

Posted

技术标签:

【中文标题】使用 Selenium 将测试结果写入 Excel【英文标题】:Writing Test Results to Excel using Selenium 【发布时间】:2016-01-20 14:31:16 【问题描述】:

我已经对这个问题进行了大量研究,并尝试了许多不同的方法,但它们都没有做我想要的,或者将它们实现到我自己的代码中的解释真的很模糊。

我需要将测试结果(TestID、预期结果、通过或失败)导出到 Excel 表中。我目前正在使用 TestNG 和 Apache POI。

我知道如何在 Excel 表上写字,但我完全不知道如何写某件事是通过还是失败。我目前正在使用一些不完全有效的代码 - 有时它会编写它,有时它不会。我需要最简单、最简单的方法,并且有一个很好的解释。

我将向您展示我当前的 @BeforeClass@AfterClass 和两个 @Test 块。

@BeforeClass:

@BeforeClass(alwaysRun = true)
    public void setupBeforeSuite(ITestContext context) throws IOException 
        //create a new work book
        workbook = new HSSFWorkbook();
        //create a new work sheet
        sheet = workbook.createSheet("Test Result");
        testresultdata = new LinkedHashMap < String, Object[] > ();
        //add test result excel file column header
        //write the header in the first row
        testresultdata.put("1", new Object[] 
            "Test Step Id", "Action", "Expected Result", "Actual Result"
        );

    

@AfterClass:

@AfterClass
      public void setupAfterSuite(ITestContext context) 
        //write excel file and file name is TestResult.xls 
        Set<String> keyset = testresultdata.keySet();
        int rownum = 0;
        for (String key : keyset) 
            Row row = sheet.createRow(rownum++);
            Object [] objArr = testresultdata.get(key);
            int cellnum = 0;
            for (Object obj : objArr) 
                Cell cell = row.createCell(cellnum++);
                if(obj instanceof Date) 
                    cell.setCellValue((Date)obj);
                else if(obj instanceof Boolean)
                    cell.setCellValue((Boolean)obj);
                else if(obj instanceof String)
                    cell.setCellValue((String)obj);
                else if(obj instanceof Double)
                    cell.setCellValue((Double)obj);
            
        
        try 
            FileOutputStream out =new FileOutputStream(new File("C:/Users/PathToFile/LoginCombinations.xls"));
            workbook.write(out);
            out.close();
            System.out.println("Excel written successfully..");

         catch (FileNotFoundException e) 
            e.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
        

@Test 块:

@Test(priority=0)
    public void successfulLogin() throws InterruptedException 

        Properties prop = new Properties();
        InputStream config = null;
        InputStream signinpage;

        try 
            // First we iterate over and read the config file
            config = new FileInputStream("C:/Users/PathToFile/src/ConfigFiles/config");
            prop.load(config);
            signinpage = new FileInputStream("C:/Users/PathToFile/src/ObjectRepositories/signinpage");
            prop.load(signinpage);

            // Next we initiate the driver, and navigate to the Web Application
            driver = new FirefoxDriver();
            driver.get(prop.getProperty("url"));
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

            // Now we run the first step, "enterValidCredentials"
            // In this test, this is actually the only step.
            LoginPage.enterValidCredentials.run(driver);

            // Assert that we landed on the Product Select page.
            // assertEquals(driver.findElement(By.xpath(prop.getProperty("tempproductselect"))).getText(), "SELECT PRODUCT");
            try
                assertEquals(driver.findElement(By.xpath(prop.getProperty("tempproductselect"))).getText(), "SELECT PRODUCT");
                  //add pass entry to the excel sheet
                  testresultdata.put("2", new Object[] 1d, "User can login with a valid username and password", "Login successful","Pass");
                  

                  catch(Exception e)
                  
                    //add fail entry to the excel sheet
                    testresultdata.put("2", new Object[] 1d, "User can login with a valid username and password", "Login successful","Fail");
                  

            // Write the test result to the sheet.

            driver.close();
            Alert alert = driver.switchTo().alert();
            alert.accept();

         catch (IOException ex) 
            ex.printStackTrace();
         finally 
            if (config != null) 
                try 
                    config.close();
                 catch (IOException e) 
                    e.printStackTrace();
                

            
        

    

@Test(priority=1)
    public void invalidCredentialsOne() throws InterruptedException 

        Properties prop = new Properties();
        InputStream config = null;
        InputStream signinpage;

        try 
            // First we iterate over and read the config file
            config = new FileInputStream("C:/Users/PathToFile/src/ConfigFiles/config");
            prop.load(config);
            signinpage = new FileInputStream("C:/Users/PathToFile/src/ObjectRepositories/signinpage");
            prop.load(signinpage);

            // Next we initiate the driver, and navigate to the Web Application
            WebDriver driver;
            driver = new FirefoxDriver();
            driver.get(prop.getProperty("url"));
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

            // Now we run the first step, "invalidCredentialsOne"
            // In this test, this is actually the only step.
            LoginPage.invalidCredentialsOne.run(driver);
            Thread.sleep(5000);

            try
                assertEquals(driver.findElement(By.xpath(prop.getProperty("failedlogin"))).getText(), "LOG IN");
              //add pass entry to the excel sheet
                testresultdata.put("3", new Object[] 2d, "User should not be able to login with an invalid password", "Login failed","Pass");
              

              catch(Exception e)
              
                //add fail entry to the excel sheet
                testresultdata.put("3", new Object[] 2d, "User should not be able to login with an invalid password", "Login failed","Fail");
                         

            // Write the test result to the sheet.

            // After the test, we close the driver.
            driver.close();
            Alert alert = driver.switchTo().alert();
            alert.accept();

         catch (IOException ex) 
            ex.printStackTrace();
         finally 
            if (config != null) 
                try 
                    config.close();
                 catch (IOException e) 
                    e.printStackTrace();
                

            
        

    

第二个测试,invalidCredentialsOne,从不写入 excel,无论我让它通过还是失败。

Java 对我来说也是新手,所以请原谅我在其中遇到的任何格式/术语/任何错误。我对建议非常开放,我正在努力改进。

【问题讨论】:

是什么让你使用 .xls 扩展名?考虑将它们另存为 CSV 格式:“Test Step Id”、“Action”、“Expected Result”、“Actual Result”。当您在 Excel 中打开它时,它会自动按列分隔。对于写入文件,我使用: BufferedWriter outputWriter; outputWriter = new BufferedWriter(new FileWriter("C:/zz/zz.txt")); outputWriter.write("你的参数"); @DmitryMalinovsky 经理的偏好,真的。 CSV 肯定可以工作,我必须了解更多关于 BufferedWriter 的知识(如果您有任何关于将测试结果写入 CSV 的合法优秀教程,请以这种方式发送)。 Np,伙计,我上周也遇到了同样的问题。 alvinalexander.com/java/edu/qanda/pjqa00009.shtml这是我主持的文章 如果有人有一些完整解释的示例,说明我如何构建我的BeforeClassAfterClass 和两个Test 块来编写有效的 CSV 文件,我肯定会接受这个作为答案。对我来说最困难的部分不是理解代码,而是将代码一块一块地实现到我的框架中。 嗨@jagdpanzer 我需要你的帮助。根据您的课前,我们如何将 testresultdata 值添加到 excel 表中。我是硒的新手。请帮帮我。 【参考方案1】:

这是我看到的结构:

1) 定义了DriverFactory 的部分。

public class BrowserFactory 

public static WebDriver localDriver(Capabilities capabilities) 
String browserType = capabilities.getBrowserName();
if (browserType.equals("firefox"))
  return new FirefoxDriver(capabilities);
if (browserType.startsWith("internet explorer"))
  return new InternetExplorerDriver(capabilities);
if (browserType.equals("chrome"))
  return new ChromeDriver(capabilities);
throw new Error("Unrecognized browser type: " + browserType);

然后您可以在需要时简单地初始化它: 示例:

driver = BrowserFactory.localDriver(DesiredCapabilities.firefox());

2) 你的测试类,你使用这个工厂的地方。那么@BeforeClass 注释中就不需要了。您在这些课程中编写测试。并且在每次测试结束时,您都会做出断言(如果测试结果失败与否)。要检查测试是否通过,请使用 Assert.true(); 示例:我在登录时使用 wrokg 凭据,会出现警告:错误密码。

解决方案:您创建一个 Assert.true(errorMessagePresent)

3) 您的输出编写器类 - 使其可供您的测试访问

3) 如果测试通过 - 使用缓冲区读取器将所需的字符串添加到输出中,否则抛出异常

【讨论】:

我是您提到的 DriverFactory 设计的粉丝。感谢那。我可能可以将 outputWriter 放到我的主类中,这样它就可以应用于其余的代码,对吧?另外,我是否会像现在使用 excel 编写器一样使用 bufferedWriter(即,使用 Assertion 方法的 try/catch 块)?很有意义,而且似乎比写 xls 容易得多。感谢您的意见。 如果您有兴趣,我可以与您分享一个合适的工厂模式,这将消除所有可能的异常和故障。让工作流程更简单 你去。 drive.google.com/file/d/0B6xuH_1NbS0UaWhoZ1ZqTTlMN0k/… ,如果您有任何问题,请随时提问。干杯 非常感谢。你几乎在一夜之间提高了我的工作表现和编码标准。我很感激!您应该考虑将该驱动器文件放在社区 wiki 上 - 这将是一个很好的资源。

以上是关于使用 Selenium 将测试结果写入 Excel的主要内容,如果未能解决你的问题,请参考以下文章

怎么样将soapui的运行结果写入excel

Python&Selenium 关键字驱动测试框架之数据文件解析

python中如何将测试结果写入到原有的excel表格

python接口测试-将运行结果写入Excel表格

Python+Selenium进行UI自动化测试项目中,常用的小技巧3:写入excel表(python,xlsxwriter)

Jmeter存储测试结果&写入结果到Excel之环境准备&测试数据结构准备&写入结果到Excel之代码准备&写入结果到Excel(十九)