10I 高级 WebDriver – 使用属性文件

原文: https://javabeginnerstutorial.com/selenium/10i-advanced-webdriver-property-files/

嗨呀冠军! 欢迎回到另一篇有趣的文章,它告诉您为什么属性文件首先存在! 这个特定的概念不仅限于 Selenium WebDriver 项目。 它基本上可以用于任何涉及硬编码内容的 Java 项目中。

假设您有数百个自动化测试用例,并且在每个测试用例中,您都对要测试的应用的 URL 进行了硬编码。 到目前为止,一切都很好。 但是,如果弹出另一个版本,将应用 URL 更改为另一个版本,并且要再次执行相同的测试用例(回归测试),该怎么办? 您可能会想,“那很简单! 我只需要再运行一次构建文件。 只需单击一下,我就可以玩超级马里奥了!”。 您是否错过了 URL 部分? 手动转到每个测试用例并编辑硬编码的 URL 以使其正常工作又会带来多大的痛苦呢? 不好了!!!

别担心! 我们有一个解决方案。 财产文件将为我们提供帮助! 为了使您的测试用例更加动态,请确保不要在其中放入任何硬编码的值。 将这些值抽象到属性文件中,以便每当它们更改时,您都可以在一个位置进行编辑,并且测试用例可以再次完美地工作。

事不宜迟,让我们仅通过三个小步骤就可以了解如何在我们的项目中实现此目标,

步骤 1:

右键单击项目->新建->包。 确保“源文件夹”显示您的项目名称,并将包名称设为“资源”。

现在,右键单击“资源包->新建->文件”。 让文件名是“config.properties”。

Folder Structure

步骤 2:

现在是时候从测试用例中提取所有这些硬编码的值了。

在“config.properties”文件中,将所有必需的属性作为键值对。 这将帮助我们在测试用例中引用每个属性及其键,该属性将在一分钟内演示。 可以在这个特定文件中对值进行任何更改,并且这些更改将神奇地反映在进行引用的所有测试用例中。

property file

步骤 3:

为了在测试案例中使用这些属性,

Properties props = new Properties();

声明“属性”类型的“属性”变量。 这将创建一个没有默认值的空属性列表。

这需要从java.util包导入import java.util.Properties;

FileInputStream fis = new FileInputStream("resources//config.properties");

创建一个连接以从“resources”包下的“config.properties”文件中读取所有属性。

这也需要从java.io包中导入import java.io.FileInputStream;

props.load(fis); - 使用打开的连接“fis”从输入字节流中读取所有属性。

props.getProperty("baseURL"); – 要获取特定属性的值,请使用“getProperty”方法。 将在双引号中提及相应的键作为 getProperty()方法的参数。 它使用属性列表中的指定键搜索属性。 如果找不到键,则返回null

概览

让我们看一个测试案例,实现到目前为止所涵盖的概念,

场景

  1. 打开 Firefox 浏览器。
  2. 从属性文件中读取 firefox 驱动程序路径和基本 URL。
  3. 导航到演示站点
  4. 按名称找到“三轮车”复选框,然后将相应的消息打印到控制台
  5. 检查“三轮车”复选框是否已启用,并将相应消息打印到控制台
  6. 根据“货车”和“SUV”复选框的当前选择状态,选中或取消选中并打印执行click()动作前后的状态
  7. 使用 XPath 找到“轿车”复选框
  8. 使用两次迭代在选择状态和取消选择状态之间切换
  9. 使用cssSelector找到“杂志”单选按钮
  10. 检查是否默认选中
  11. 如果是,则将相应消息打印到控制台,如果否,请选择单选按钮

验证 Eclipse IDE 控制台输出屏幕和 JUnit 窗格是否成功

此方案的 JUnit 代码

Config.properties

  1. #Properties as key-value pairs
  2. baseUrl=https://chandanachaitanya.github.io/selenium-practice-site/
  3. logoPath=E:\\Selenium\\Logo.png
  4. gmail=tester01@gmail.com
  5. pdfReportPath=E:\\Selenium\\junit.pdf
  6. firefoxPath=E:\\Softwares\\Selenium\\geckodriver-v0.10.0-win64\\geckodriver.exe
  7. chromePath=browser-drivers\\chromedriver.exe
  8. IEPath=browser-drivers\\IEDriverServer.exe

RadioBtns_Checkboxes.java

  1. package com.blog.junitTests;
  2. import java.io.FileInputStream;
  3. import java.util.List;
  4. import java.util.Properties;
  5. import java.util.concurrent.TimeUnit;
  6. import org.junit.After;
  7. import org.junit.Before;
  8. import org.junit.Test;
  9. import org.openqa.selenium.By;
  10. import org.openqa.selenium.WebDriver;
  11. import org.openqa.selenium.WebElement;
  12. import org.openqa.selenium.firefox.FirefoxDriver;
  13. public class RadioBtns_Checkboxes {
  14. // Declaring variables
  15. private WebDriver driver;
  16. private String baseUrl;
  17. Properties props;
  18. @Before
  19. public void setUp() throws Exception {
  20. // Creates an empty property list
  21. props = new Properties();
  22. // A connection is created to config.properties file
  23. FileInputStream fis = new FileInputStream("resources//config.properties");
  24. // Reads the properties from the input byte stream
  25. props.load(fis);
  26. // Get the firefox driver path from property file
  27. String firefoxPath = props.getProperty("firefoxPath");
  28. // Assign the URL to be invoked to a String variable
  29. baseUrl = props.getProperty("baseUrl");
  30. // Mention the property where required
  31. System.setProperty("webdriver.gecko.driver", firefoxPath);
  32. // Create a new instance for the class FirefoxDriver
  33. // that implements WebDriver interface
  34. driver = new FirefoxDriver();
  35. // Implicit wait for 5 seconds
  36. driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
  37. }
  38. @Test
  39. public void testPageTitle() throws Exception {
  40. // Open baseUrl in Firefox browser window
  41. driver.get(baseUrl);
  42. // Locate 'Tricycle' checkbox using name
  43. WebElement tricycleCheckbox = driver.findElement(By.name("vehicle2"));
  44. // Check if tricyle is displayed
  45. System.out.println("Is tricycle displayed? "+ tricycleCheckbox.isDisplayed());
  46. // Check if tricyle is enabled to select
  47. if (tricycleCheckbox.isEnabled()) {
  48. // Click if enabled
  49. tricycleCheckbox.click();
  50. } else {
  51. // Print message to console if disabled
  52. System.out.println("Unable to select 'Tricycle' checkbox as it is disabled.");
  53. }
  54. //Get all checkbox elements in a list
  55. List<WebElement> list = driver.findElements(By
  56. .cssSelector("input[type='checkbox']"));
  57. // Loops through all checkboxe elements
  58. for (int i = 0; i < list.size(); i++) {
  59. // Checking if the checkbox is a 'Van' or 'SUV'
  60. if ((list.get(i).getAttribute("value").trim()
  61. .equalsIgnoreCase("van"))
  62. || (list.get(i).getAttribute("value").trim()
  63. .equalsIgnoreCase("suv"))) {
  64. // Print selection status to console
  65. System.out.println("BEFORE: Is "
  66. + list.get(i).getAttribute("value") + " selected? "
  67. + list.get(i).isSelected());
  68. // Check if the checkbox is selected
  69. if (!(list.get(i).isSelected())) {
  70. // Click the checkbox
  71. list.get(i).click();
  72. System.out.println("AFTER: Is "
  73. + list.get(i).getAttribute("value") + " selected? "
  74. + list.get(i).isSelected());
  75. } else {
  76. // Uncheck the checkbox
  77. list.get(i).click();
  78. System.out.println("AFTER: Is "
  79. + list.get(i).getAttribute("value") + " selected? "
  80. + list.get(i).isSelected());
  81. }
  82. System.out.println("Next...");
  83. }
  84. }
  85. // Locate 'Sedan' checkbox using xPath
  86. WebElement sedanCheckbox = driver.findElement(By
  87. .xpath("//input[@name='vehicle5']"));
  88. System.out.println("Trying to select and de-select Sedan checkbox...");
  89. for (int i = 0; i < 2; i++) {
  90. // Click the checkbox
  91. sedanCheckbox.click();
  92. // Print current status to console
  93. System.out.println("Selection status of 'Sedan' checkbox: "
  94. + sedanCheckbox.isSelected());
  95. }
  96. // Locate 'Magazines' radio button using cssSelector
  97. WebElement magazinesRadioBtn = driver.findElement(By
  98. .cssSelector("input[value='Magazines']"));
  99. // Check if radio button is selected by default
  100. if (magazinesRadioBtn.isSelected()) {
  101. // Print message to console
  102. System.out.println("Magazines radio button is selected by default");
  103. } else {
  104. // Click the radio button
  105. magazinesRadioBtn.click();
  106. }
  107. } //End of @Test
  108. @After
  109. public void tearDown() throws Exception {
  110. // Close the Firefox browser
  111. driver.close();
  112. }
  113. }

输出

每行代码都提供了清晰的注释,使其易于说明。 执行测试用例后,eclipse IDE 控制台窗口的输出如下,

property file eclipse output

属性文件使自动化测试人员的生活成真,梦想成真。 由此证明! 现在该尝试使用今天的概念了。 请务必戴好安全帽,以免碰到异常! 还有一件事,我可以在 GitHub 仓库中找到所有代码文件。 去看一下!

再见! 祝你有美好的一天!