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

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

相关文章
|
1月前
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
115 8
|
1月前
|
人工智能 JavaScript 前端开发
自动化测试框架的演进与实践###
本文深入探讨了自动化测试框架从诞生至今的发展历程,重点分析了当前主流框架的优势与局限性,并结合实际案例,阐述了如何根据项目需求选择合适的自动化测试策略。文章还展望了未来自动化测试领域的技术趋势,为读者提供了宝贵的实践经验和前瞻性思考。 ###
|
2月前
|
设计模式 前端开发 JavaScript
自动化测试框架设计原则与最佳实践####
本文深入探讨了构建高效、可维护的自动化测试框架的核心原则与策略,旨在为软件测试工程师提供一套系统性的方法指南。通过分析常见误区,结合行业案例,阐述了如何根据项目特性定制自动化策略,优化测试流程,提升测试覆盖率与执行效率。 ####
78 6
|
2月前
|
监控 jenkins 测试技术
自动化测试框架的构建与实践
【10月更文挑战第40天】在软件开发周期中,测试环节扮演着至关重要的角色。本文将引导你了解如何构建一个高效的自动化测试框架,并深入探讨其设计原则、实现方法及维护策略。通过实际代码示例和清晰的步骤说明,我们将一起探索如何确保软件质量,同时提升开发效率。
62 1
|
2月前
|
机器学习/深度学习 前端开发 测试技术
探索软件测试中的自动化测试框架选择与优化策略####
本文深入探讨了在当前软件开发生命周期中,自动化测试框架的选择对于提升测试效率、保障产品质量的重要性。通过分析市场上主流的自动化测试工具,如Selenium、Appium、Jest等,结合具体项目需求,提出了一套系统化的选型与优化策略。文章首先概述了自动化测试的基本原理及其在现代软件开发中的角色变迁,随后详细对比了各主流框架的功能特点、适用场景及优缺点,最后基于实际案例,阐述了如何根据项目特性量身定制自动化测试解决方案,并给出了持续集成/持续部署(CI/CD)环境下的最佳实践建议。 --- ####
|
15天前
|
存储 测试技术 API
pytest接口自动化测试框架搭建
通过上述步骤,我们成功搭建了一个基于 `pytest`的接口自动化测试框架。这个框架具备良好的扩展性和可维护性,能够高效地管理和执行API测试。通过封装HTTP请求逻辑、使用 `conftest.py`定义共享资源和前置条件,并利用 `pytest.ini`进行配置管理,可以大幅提高测试的自动化程度和执行效率。希望本文能为您的测试工作提供实用的指导和帮助。
75 15
|
1月前
|
Java 测试技术 API
探索软件测试中的自动化测试框架
本文深入探讨了自动化测试在软件开发中的重要性,并详细介绍了几种流行的自动化测试框架。通过比较它们的优缺点和适用场景,旨在为读者提供选择合适自动化测试工具的参考依据。
|
1月前
|
jenkins 测试技术 持续交付
自动化测试框架的搭建与实践
在软件开发领域,自动化测试是提升开发效率、确保软件质量的关键手段。本文将引导读者理解自动化测试的重要性,并介绍如何搭建一个基本的自动化测试框架。通过具体示例和步骤,我们将探索如何有效实施自动化测试策略,以实现软件开发流程的优化。
88 7
|
1月前
|
数据管理 jenkins 测试技术
自动化测试框架的设计与实现
在软件开发周期中,测试是确保产品质量的关键步骤。本文通过介绍自动化测试框架的设计原则、组件构成以及实现方法,旨在指导读者构建高效、可靠的自动化测试系统。文章不仅探讨了自动化测试的必要性和优势,还详细描述了框架搭建的具体步骤,包括工具选择、脚本开发、执行策略及结果分析等。此外,文章还强调了持续集成环境下自动化测试的重要性,并提供了实际案例分析,以帮助读者更好地理解和应用自动化测试框架。
|
1月前
|
监控 测试技术 定位技术
探索软件测试中的自动化测试框架选择与实施###
本文不概述传统意义上的摘要内容,而是直接以一段对话形式引入,旨在激发读者兴趣。想象一下,你是一名勇敢的探险家,面前摆满了各式各样的自动化测试工具地图,每张地图都指向未知的宝藏——高效、精准的软件测试领域。我们将一起踏上这段旅程,探讨如何根据项目特性选择合适的自动化测试框架,并分享实施过程中的关键步骤与避坑指南。 ###
53 4