《手把手教你》系列基础篇(九十六)-java+ selenium自动化测试-框架之设计篇-跨浏览器(详解教程)

简介: 【7月更文挑战第14天】这篇教程介绍了如何使用Java和Selenium构建一个支持跨浏览器测试的自动化测试框架。设计的核心是通过读取配置文件来切换不同浏览器执行测试用例。配置文件中定义了浏览器类型(如Firefox、Chrome)和测试服务器的URL。代码包括一个`BrowserEngine`类,它初始化配置数据,根据配置启动指定的浏览器,并提供关闭浏览器的方法。测试脚本`TestLaunchBrowser`使用`BrowserEngine`来启动浏览器并执行测试。整个框架允许在不同浏览器上运行相同的测试,以确保兼容性和一致性。

1.简介

从这一篇开始介绍和分享Java+Selenium+POM的简单自动化测试框架设计。第一个设计点,就是支持跨浏览器测试。

宏哥自己认为的支持跨浏览器测试就是:同一个测试用例,支持用不同浏览器去执行。我们这里只考虑Windows平台的浏览器,而且只关注火狐和谷歌浏览器的自动化测试,我们已经知道IE执行很慢,而且容易出问题,而且现在Windows系统也在逐步取消IE浏览器。

那到底要怎么做,才能支持一个自动化用例能够在不同浏览器上运行?宏哥这里是通过读取配置文件的值,来切换不同浏览器运行测试脚本。

2.实现思路

1.写一个配置文件,例如:xml、ini或则properties文件,里面写好浏览器的类型和测试(正式)服务器的地址或者域名,方便切换。

2.编写一个浏览器引擎类,通过读取配置文件加上if语句去控制启动不同浏览器。

3.测试脚本调用浏览器引擎类实例,得到driver,开始测试自动化脚本。

4.利用TestNG编写一个测试类文件,测试切换不同浏览器是否脚本运行成功。

3.项目实战

在上一篇文章基础上继续完善测试框架,按照实现思路具体步骤如下:

3.1代码设计

1.新建一个存放配置文件的文件夹TestConfig,以后相应的配置文件都放在里边,宏哥这里按照思路新建了一个config.properties的配置文件,如下图所示:

2.在framework包下,新建一个浏览器的引擎类:BrowserEngine,如下图所示:

3.在testSuite新建一个测试类:TestLaunchBrowser,如下图所示:

3.2参考代码

(1)config.properties

# browser switcher

#browserName = Firefox

browserName = Chrome

#browserName = IE


# test server switcher

URL=https://www.jd.com

#URL=https://taobao.com

(2)BrowserEngine.java

package framework;



import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

import java.util.Set;

import java.util.concurrent.TimeUnit;

 



import org.openqa.selenium.WebDriver;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.firefox.FirefoxOptions;

import org.openqa.selenium.firefox.FirefoxProfile;

import org.openqa.selenium.ie.InternetExplorerDriver;


/**

* @author 北京-宏哥

*

* @公众号:北京宏哥

*

*  《手把手教你》系列基础篇(九十六)-java+ selenium自动化测试-框架之设计篇-跨浏览器(详解教程)

*

* 2022年4月02日

*/


public class BrowserEngine {

   

   public String browserName;

   public String serverURL;

   public WebDriver driver;

   

   public void initConfigData() throws IOException{

       

       Properties p = new Properties();

       // 加载配置文件

       InputStream ips = new FileInputStream(".\\TestConfig\\config.properties");

       p.load(ips);

       

       Logger.Output(LogType.LogTypeName.INFO, "Start to select browser name from properties file");

       browserName=p.getProperty("browserName");

       Logger.Output(LogType.LogTypeName.INFO, "Your had select test browser type is: "+ browserName);

       serverURL = p.getProperty("URL");

       Logger.Output(LogType.LogTypeName.INFO, "The test server URL is: "+ serverURL);

       ips.close();

       

   }

   

   public WebDriver getBrowser(){

       

       if(browserName.equalsIgnoreCase("Firefox")){

           

           System.setProperty("webdriver.gecko.driver", ".\\Tools\\geckodriver.exe");    

           driver = createFireFoxDriver();

           

           Logger.Output(LogType.LogTypeName.INFO, "Launching Firefox ...");

           

       }else if(browserName.equalsIgnoreCase("Chrome")){

           

           System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");

           driver= new ChromeDriver();

           Logger.Output(LogType.LogTypeName.INFO, "Launching Chrome ...");

           

       }else if(browserName.equalsIgnoreCase("IE")){

           

           System.setProperty("webdriver.ie.driver", ".\\Tools\\IEDriverServer.exe");

           driver= new InternetExplorerDriver();

           Logger.Output(LogType.LogTypeName.INFO, "Launching IE ...");

       }

       

       driver.get(serverURL);

       Logger.Output(LogType.LogTypeName.INFO, "Open URL: "+ serverURL);

       driver.manage().window().maximize();

       Logger.Output(LogType.LogTypeName.INFO, "Maximize browser...");

       callWait(5);

       return driver;

   }

   

   /*

    * 关闭浏览器并退出方法

    */

   

   public void tearDown() throws InterruptedException{

       

       Logger.Output(LogType.LogTypeName.INFO, "Closing browser...");

       Thread.sleep(3000);    

       driver.quit();


   }

   

   /*

    * 隐式时间等待方法

    */

   public void callWait(int time){

       

       driver.manage().timeouts().implicitlyWait(time, TimeUnit.SECONDS);

       Logger.Output(LogType.LogTypeName.INFO, "Wait for "+time+" seconds.");

   }

   

   

   /*

    * createFireFox Driver

    * @Param: null

    * @return: WebDriver

    */

   

   private WebDriver createFireFoxDriver() {

       

       WebDriver driver = null;

       FirefoxProfile firefoxProfile = new FirefoxProfile();

 

       firefoxProfile.setPreference("prefs.converted-to-utf8", true);

       //set download folder to default folder: TestDownload

       firefoxProfile.setPreference("browser.download.folderList", 2);

       firefoxProfile.setPreference("browser.download.dir", ".\\TestDownload");

       

       try {

           // 旧版本的写法,新版本用下边的这个会报错:The constructor FirefoxDriver(FirefoxProfile) is undefined

           //driver = new FirefoxDriver(firefoxProfile);

           FirefoxOptions firefoxOptions = new FirefoxOptions();

           firefoxOptions.setProfile(firefoxProfile);

       } catch (Exception e) {

           Logger.Output(LogType.LogTypeName.ERROR, e.getMessage());

           Logger.Output(LogType.LogTypeName.ERROR, "Failed to initilize the Firefox driver");

       }

       return driver;

   }

 

   

}

(3)TestLaunchBrowser.java

package testSuite;


import java.io.IOException;


import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

import org.testng.annotations.AfterClass;

import org.testng.annotations.BeforeClass;

import org.testng.annotations.Test;

 





import framework.BrowserEngine;


/**

* @author 北京-宏哥

*

* @公众号:北京宏哥

*

*  《手把手教你》系列基础篇(九十六)-java+ selenium自动化测试-框架之设计篇-跨浏览器(详解教程)

*

* 2022年4月02日

*/


public class TestLaunchBrowser {

   

   public WebDriver driver;

   

   @BeforeClass

   public void setUp() throws IOException{

       

       BrowserEngine browserEngine = new BrowserEngine();

       browserEngine.initConfigData();

       driver=browserEngine.getBrowser();

       

   }

   

   

   @Test

   public void searchPhone(){

       

       driver.findElement(By.id("key")).sendKeys("iPhone");

       driver.findElement(By.xpath("//*[@id='search']/div/div[2]/button")).click();

       

   }

   

   @AfterClass

   public void tearDown() throws InterruptedException{

       

       Thread.sleep(5000);

       driver.quit();

//        BrowserEngine browserEngine = new BrowserEngine();

//        browserEngine.tearDown();

       

   }

}

3.3运行代码

1.运行代码,右键Run AS->Java Appliance,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

 

4.小结

好了,今天时间不早了,今天宏哥就分享和讲解到这里,感谢您耐心地阅读!

相关文章
|
25天前
|
Web App开发 IDE JavaScript
Selenium IDE:Web自动化测试的得力助手
Selenium IDE:Web自动化测试的利器。作为开源工具,Selenium IDE支持录制与回放用户操作,适用于Chrome、Firefox等多浏览器,简化了测试流程,提升了效率,降低了自动化测试的门槛。它还支持导出多种编程语言的脚本,便于测试集成与复用。
76 19
Selenium IDE:Web自动化测试的得力助手
|
12天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
27天前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
149 17
Selenium:强大的 Web 自动化测试工具
|
26天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
119 26
|
1月前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
51 0
|
18天前
|
监控 JavaScript 测试技术
postman接口测试工具详解
Postman是一个功能强大且易于使用的API测试工具。通过详细的介绍和实际示例,本文展示了Postman在API测试中的各种应用。无论是简单的请求发送,还是复杂的自动化测试和持续集成,Postman都提供了丰富的功能来满足用户的需求。希望本文能帮助您更好地理解和使用Postman,提高API测试的效率和质量。
70 11
|
2月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
70 3
|
3月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
84 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
4月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
280 7
Jmeter实现WebSocket协议的接口测试方法
|
4月前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
290 3
快速上手|HTTP 接口功能自动化测试