《手把手教你》系列基础篇(九十六)-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.小结

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

相关文章
|
9月前
|
Web App开发 人工智能 JavaScript
主流自动化测试框架的技术解析与实战指南
本内容深入解析主流测试框架Playwright、Selenium与Cypress的核心架构与适用场景,对比其在SPA测试、CI/CD、跨浏览器兼容性等方面的表现。同时探讨Playwright在AI增强测试、录制回放、企业部署等领域的实战优势,以及Selenium在老旧系统和IE兼容性中的坚守场景。结合六大典型场景,提供技术选型决策指南,并展望AI赋能下的未来测试体系。
|
7月前
|
数据采集 人工智能 自然语言处理
Playwright MCP 浏览器自动化框架全面解析
Playwright MCP是微软推出的开源项目,结合Playwright与MCP协议,让AI通过结构化数据直接操作浏览器。告别传统视觉识别,实现高效、精准的网页自动化,广泛应用于测试、爬虫、办公自动化等场景,大幅提升效率与可靠性。
|
10月前
|
Web App开发 开发框架 .NET
Playwright 自动化测试系列(6)| 第三阶段:测试框架集成​指南:参数化测试 + 多浏览器并行执行
Pytest 与 Playwright 集成可提升自动化测试效率,支持参数化测试、多浏览器并行执行及统一报告生成。通过数据驱动、Fixture 管理和并行优化,显著增强测试覆盖率与执行速度,适用于复杂 Web 应用测试场景。
|
10月前
|
测试技术 API C++
Playwright 自动化测试系列(7)| 第三阶段:测试框架集成​​Page Object 模式
本课程详解Playwright测试框架中的Page Object模式,通过电商登录-下单实战演示PO架构设计与高级技巧,结合Pytest实现多用户测试。重点解析PO模式提升代码复用性、降低维护成本的核心价值,并提供常见问题解决方案,助力构建高可维护性的自动化测试体系。
|
10月前
|
Java 测试技术 API
自动化测试框架深度解析与选择指南
Apache JMeter是Apache组织基于Java开发的一款压力测试工具,旨在测试软件的性能承受能力。它支持多种协议测试及功能测试,提供灵活的断言创建能力,如同创建带断言的脚本来验证程序是否返回预期结果。
|
人工智能 运维 Prometheus
AIOpsLab:云服务自动化运维 AI,微软开源云服务 AI 框架,覆盖整个生命周期
AIOpsLab 是微软等机构推出的开源框架,支持云服务自动化运维,涵盖故障检测、根本原因分析等完整生命周期。
826 13
AIOpsLab:云服务自动化运维 AI,微软开源云服务 AI 框架,覆盖整个生命周期
|
机器学习/深度学习 设计模式 测试技术
Python 高级编程与实战:构建自动化测试框架
本文深入探讨了Python中的自动化测试框架,包括unittest、pytest和nose2,并通过实战项目帮助读者掌握这些技术。文中详细介绍了各框架的基本用法和示例代码,助力开发者快速验证代码正确性,减少手动测试工作量。学习资源推荐包括Python官方文档及Real Python等网站。
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
11月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
1517 23
|
SQL 安全 测试技术
2025接口测试全攻略:高并发、安全防护与六大工具实战指南
本文探讨高并发稳定性验证、安全防护实战及六大工具(Postman、RunnerGo、Apipost、JMeter、SoapUI、Fiddler)选型指南,助力构建未来接口测试体系。接口测试旨在验证数据传输、参数合法性、错误处理能力及性能安全性,其重要性体现在早期发现问题、保障系统稳定和支撑持续集成。常用方法包括功能、性能、安全性及兼容性测试,典型场景涵盖前后端分离开发、第三方服务集成与数据一致性检查。选择合适的工具需综合考虑需求与团队协作等因素。
2012 24