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

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

相关文章
|
10月前
|
运维 Prometheus 监控
如何在测试环境中保持操作系统、浏览器版本和服务器配置的稳定性和一致性?
如何在测试环境中保持操作系统、浏览器版本和服务器配置的稳定性和一致性?
|
12月前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
10月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
1353 1
|
11月前
|
Web App开发 Java
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
717 6
|
10月前
|
Web App开发 定位技术 iOS开发
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
800 1
|
数据采集 Web App开发 测试技术
使用Selenium与WebDriver实现跨浏览器自动化数据抓取
在网络爬虫领域,Selenium与WebDriver是实现跨浏览器自动化数据抓取的利器。本文详细介绍了如何利用Selenium和WebDriver结合代理IP技术提升数据抓取的稳定性和效率。通过设置user-agent和cookie来模拟真实用户行为,避免被网站检测和阻止。文章提供了具体的代码示例,展示了如何配置代理IP、设置user-agent和cookie,并实现了跨浏览器的数据抓取。合理的参数配置能有效减少爬虫被封禁的风险,提高数据抓取效率。
1137 6
使用Selenium与WebDriver实现跨浏览器自动化数据抓取
|
11月前
|
Web App开发 缓存 Linux
高效Selenium测试技巧:轻松控制已开启的浏览器
【10月更文挑战第13天】在进行Selenium测试时,通常会启动新浏览器实例,但有时需要控制已开启的浏览器,以节省时间并更真实地模拟用户行为。这可通过设置Chrome为可远程控制并使用`Remote WebDriver`连接实现。需在启动Chrome时添加`--remote-debugging-port`参数,并通过Python脚本中的`webdriver.Remote`连接至指定端口。此外,还可利用会话ID(Session ID)重新连接浏览器,提高测试灵活性。需要注意浏览器版本兼容性及元素定位稳定性等问题,确保测试准确性和一致性。
892 1
|
XML Java 测试技术
Selenium WebDriver自动化测试(基础篇):不得不掌握的Java基础
关于Selenium WebDriver自动化测试的Java基础篇,涵盖了Java的变量、数据类型、字符串操作、运算符、流程控制、面向对象编程、关键字用法、权限修饰符、异常处理和IO流等基础知识点,为进行自动化测试提供了必要的Java语言基础。
291 1
|
数据采集 安全 Java
Java Selenium WebDriver:代理设置与图像捕获
Java Selenium WebDriver:代理设置与图像捕获
|
测试技术 API Android开发
《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)
【7月更文挑战第15天】这是关于自动化测试框架中Selenium API二次封装的教程总结。教程中介绍了如何设计一个支持不同浏览器测试的页面基类(BasePage),该基类包含了对Selenium方法的二次封装,如元素的输入、点击、清除等常用操作,以减少重复代码。此外,页面基类还提供了获取页面标题和URL的方法。
325 2