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

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

相关文章
|
Web App开发 人工智能 自然语言处理
Playwright MCP浏览器自动化指南
本文教你如何通过Playwright MCP让AI直接操作浏览器,自动运行和调试代码,无需手动切换界面。只需简单配置,即可用自然语言指挥AI完成页面操作、问题排查与自主修复,真正实现自动化高效开发。
|
Web App开发 数据采集 存储
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
本文探讨了如何利用Chrome DevTools Protocol (CDP) 与 Selenium WebDriver 提升浏览器自动化效率,结合代理IP技术高效采集微博数据。通过CDP,开发者可直接操作浏览器底层功能,如网络拦截、性能分析等,增强控制精度。示例代码展示了如何设置代理IP、cookie及user-agent来模拟真实用户行为,提高数据抓取成功率与稳定性。适用于需要频繁抓取互联网数据的应用场景。
2006 3
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
|
数据采集 人工智能 自然语言处理
Playwright MCP 浏览器自动化框架全面解析
Playwright MCP是微软推出的开源项目,结合Playwright与MCP协议,让AI通过结构化数据直接操作浏览器。告别传统视觉识别,实现高效、精准的网页自动化,广泛应用于测试、爬虫、办公自动化等场景,大幅提升效率与可靠性。
|
人工智能 自然语言处理 监控
Playwright MCP浏览器自动化全攻略
Playwright MCP让AI通过自然语言操控浏览器,无需编程即可实现网页自动化。支持智能元素识别、多浏览器操作与动态交互,广泛应用于搜索、数据抓取、自动发布等场景,大幅提升效率,降低技术门槛,是浏览器自动化的新范式。
|
数据采集 前端开发 JavaScript
深挖navigator.webdriver浏览器自动化检测的底层分析
本文详细讲解了如何通过技术手段破解浏览器 `navigator.webdriver` 检测,结合爬虫代理、多线程等策略,在豆瓣图书页面批量采集数据。具体包括:隐藏 Selenium 特征、配置代理突破 IP 限制、设置伪装用户、利用多线程提升效率。文章面向初学者,提供分步教程与示例代码,同时设有「陷阱警告」帮助规避常见问题。目标是从底层实现反检测,高效采集图书评分、简介、作者等信息,适合具备 Python 和 Selenium 基础的读者实践学习。
820 12
深挖navigator.webdriver浏览器自动化检测的底层分析
|
Web App开发 开发框架 .NET
Playwright 自动化测试系列(6)| 第三阶段:测试框架集成​指南:参数化测试 + 多浏览器并行执行
Pytest 与 Playwright 集成可提升自动化测试效率,支持参数化测试、多浏览器并行执行及统一报告生成。通过数据驱动、Fixture 管理和并行优化,显著增强测试覆盖率与执行速度,适用于复杂 Web 应用测试场景。
|
编解码 JavaScript 前端开发
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
516 23
|
Web App开发 人工智能 JSON
AutoMouser:AI Chrome扩展程序,实时跟踪用户的浏览器操作,自动生成自动化操作脚本
AutoMouser是一款Chrome扩展程序,能够实时跟踪用户交互行为,并基于OpenAI的GPT模型自动生成Selenium测试代码,简化自动化测试流程。
1604 17
AutoMouser:AI Chrome扩展程序,实时跟踪用户的浏览器操作,自动生成自动化操作脚本
|
数据采集 JavaScript 前端开发
浏览器自动化检测对抗:修改navigator.webdriver属性的底层实现
本文介绍了如何构建一个反检测爬虫以爬取Amazon商品信息。通过使用`undetected-chromedriver`规避自动化检测,修改`navigator.webdriver`属性隐藏痕迹,并结合代理、Cookie和User-Agent技术,实现稳定的数据采集。代码包含浏览器配置、无痕设置、关键词搜索及数据提取等功能,同时提供常见问题解决方法,助你高效应对反爬策略。
1647 1
|
Web App开发 数据采集 JavaScript
Chrome浏览器实例的TypeScript自动化脚本
Chrome浏览器实例的TypeScript自动化脚本