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

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

ini 复制代码
# browser switcher
#browserName = Firefox
browserName = Chrome
#browserName = IE

# test server switcher
URL=https://www.jd.com
#URL=https://taobao.com

(2)BrowserEngine.java

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自动化测试-框架之设计篇-跨浏览器(详解教程)
 *
 * 2025年3月12日
 */

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

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自动化测试-框架之设计篇-跨浏览器(详解教程)
 *
 * 2025年3月12日
 */

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.小结

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

相关推荐
nice_lcj5201 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
码农小河661 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
IT_陈寒2 小时前
Redis大key删除为什么会导致服务卡顿?我的线上事故复盘
前端·人工智能·后端
用户2705077725242 小时前
MCP 最小 Server 实测:3 个 JSON-RPC 报错与修法
前端
SL_staff2 小时前
从配置失效到逻辑复用:JVS-Logic 如何构建可治理的业务编排中枢
java·spring·产品
用户499335025072 小时前
一人VIP账号多人共用:Web 代理里的会话共享怎么实现
前端
特立独行的猫A2 小时前
一份 Markdown 发十个平台:cspub 一稿多投
java·后端·python
用户老李2 小时前
无线电自学教程 05:第一台收音机——从矿石机到 SDR
前端
IPIPD2 小时前
Node.js请求遇到503怎么重试?先解析Retry-After,再做有上限退避
前端
葡萄城技术团队3 小时前
dsh-spreadjs-editor 的集成链路:把 SpreadJS Designer 嵌进 Agent 工作台
前端