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

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

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

  1. 《手把手教你》系列基础篇(八十三)-java+ selenium自动化测试-框架设计基础-TestNG测试报告-下篇(详解教程)

    1.简介 其实前边好像简单的提到过测试报告,宏哥觉得这部分比较重要,就着重讲解和介绍一下.报告是任何测试执行中最重要的部分,因为它可以帮助用户了解测试执行的结果.失败点和失败原因.另一方面,日志记录对 ...

  2. 《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)

    1.简介 页面对象模型(Page Object Model)在Selenium Webdriver自动化测试中使用非常流行和受欢迎,作为自动化测试工程师应该至少听说过POM这个概念.本篇介绍POM的简 ...

  3. 《手把手教你》系列基础篇(八十四)-java+ selenium自动化测试-框架设计基础-TestNG日志-上篇(详解教程)

    1.简介 TestNG还为我们提供了测试的记录功能-日志.例如,在运行测试用例期间,用户希望在控制台中记录一些信息.信息可以是任何细节取决于目的.牢记我们正在使用Selenium进行测试,我们需要有助 ...

  4. 《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)

    1.简介 本文主要介绍两个在测试过程中可能会用到的功能:Actions类中的拖拽操作和Actions类中的划取字段操作.例如:需要在一堆log字符中随机划取一段文字,然后右键选择摘取功能. 2.拖拽操 ...

  5. 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)

    1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...

  6. 《手把手教你》系列技巧篇(二十七)-java+ selenium自动化测试- quit和close的区别(详解教程)

    1.简介 尽管有的小伙伴或者童鞋们觉得很简单,不就是关闭退出浏览器,但是宏哥还是把两个方法的区别说一下,不然遇到坑后根本不会想到是这里的问题. 2.源码 本文介绍webdriver中关于浏览器退出操作 ...

  7. 《手把手教你》系列技巧篇(二十九)-java+ selenium自动化测试- Actions的相关操作上篇(详解教程)

    1.简介 有些测试场景或者事件,Selenium根本就没有直接提供方法去操作,而且也不可能把各种测试场景都全面覆盖提供方法去操作.比如:就像鼠标悬停,一般测试场景鼠标悬停分两种常见,一种是鼠标悬停在某 ...

  8. 《手把手教你》系列技巧篇(四十)-java+ selenium自动化测试-JavaScript的调用执行-下篇(详解教程)

    1.简介 在实际工作中,我们需要对处理的元素进行高亮显示,或者有时候为了看清楚做跟踪鼠标点击了哪些元素需要标记出来.今天宏哥就在这里把这种测试场景讲解和分享一下. 2.用法 创建一个执行 JS 的对象 ...

  9. 《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)

    1.简介 前面宏哥一连几篇介绍如何通过开源jar包Log4j.jar.log4j2.jar和logback实现日志文件输出,Log4j和logback确实很强大,能生成三种日志文件,一种是保存到磁盘的 ...

随机推荐

  1. CHAR 和 VARCHAR 的区别?

    1.CHAR 和 VARCHAR 类型在存储和检索方面有所不同 2.CHAR 列长度固定为创建表时声明的长度,长度值范围是 1 到 255 当 CHAR 值被存储时,它们被用空格填充到特定长度,检索  ...

  2. 说说do...while和while的区别

    一.do-while语句 do-while语句的语法: do{ statement }while(expression); 看下面示例: var i=10: do{ i+=2: }while(i< ...

  3. Spring通知有哪些类型?

    (1)前置通知(Before advice):在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常). (2)返回后通知(After returnin ...

  4. 什么是 Spring IOC 容器?

    Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期.

  5. (stm32f103学习总结)—stm32 PMW输出实验

    一.PWM简介 PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调 制,简称脉宽调制.它是利用微处理器的数字输出来对模拟电路进行控 制的一种非常有效的技术,其控制简 ...

  6. 记离线缓存(manifest)一大坑,断定其只适用于静态网站或离线应用

    今天看了离线缓存(manifest)方面的资料,兴冲冲地就想给自己的网站用上.待我把代码都写好部署上服务器,并测试过OK的时候,在SegmentFault刷了一把manifest方面的问答,才发现这个 ...

  7. 用CSS实现Tab页切换效果

    用CSS实现Tab切换效果 最近切一个页面的时候涉及到了一个tab切换的部分,因为不想用js想着能不能用纯CSS的选择器来实现切换效果.搜了一下大致有下面三种写法. 利用:hover选择器 缺点:只有 ...

  8. 如何基于 ZEGO SDK 实现 Flutter 一对一音视频聊天应用?

    之前的文章发布了ZEGO SDK实现Android端音视频通话应用的开发教程,不少开发者反馈很实用,能不能也出一版Flutter的教程. 有求必应,这不小编来了- 我们封装了ZEGO Flutter ...

  9. 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客?

    前言 OK,我也来造轮子了 博客系统从一开始用WordPress,再到后来用hexo.hugo之类的静态博客生成放github托管,一直在折腾 折腾是为了更好解决问题,最终还是打算自己花时间搞一个好了 ...

  10. linux部署项目访问mysql问题

    springboot以war包形式传到webapps下面,mysql创建库和表,war包里配置数据源是localhost,然后运行tomcat是没有问题的,可以访问通mysql正常请求服务. ssm以 ...