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.小结
好了,今天时间不早了,今天宏哥就分享和讲解到这里,感谢您耐心地阅读!