上一篇博客中,笔者提到测试脚本的健壮性有待提高,其次,因为测试脚本是用python写的,设想一种情况就是使用者的电脑只有java环境没有python环境,当然,如果你的电脑没有python环境也是可以解决的,具体我们可以了解一下python的发布方式:
-
.py文件:直接提供源码,需要使用者自行安装Python并且安装依赖的各种库,如下图所示:
-
.pyc文件:不愿意源码被运行者看到,可以使用pyc文件发布,pyc文件是Python解释器可以识别的二进制码,故发布后也是跨平台的,需要使用者安装相应版本的Python和依赖库,如下图所示:
-
.exe可执行文件:对于非码农纯小白用户,最简单的方式就是提供一个可执行文件,这种方式虽然不会暴露源代码也不需要使用者安装相应版本的Python和依赖库,但比较麻烦的是需要针对不同平台打包不同的可执行文件(Windows,Linux,Mac),如下图所示:
通过以上三种方式可以看出,每一种方式虽然都可以根据使用者的需要传入参数(平台名称和浏览器名称)执行测试,但是,第一种方式会暴露测试源代码且需要安装python环境和依赖库,第二种方式仅仅是不暴露源代码而已,第三种方式虽然不依赖python环境和依赖库,但是不具备可移植性,若需要在不同系统上运行,就必须针对该平台进行打包,这显然违背了跨浏览器跨平台执行测试的基本原则。
综上所述,笔者决定用java来实现测试代码,话不多说,直接上码:
package com.SeleniumLib.jase;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
public class BrowserAllInOne {
// 定义字符串,用于与cmd传进来的参数作对比判断
private static String firefox = "firefox";
private static String chrome = "chrome";
private static String ie = "ie";
private static String edge = "edge";
// 定义执行远程测试的浏览器
private static DesiredCapabilities Browser;
// 定义执行远程测试的地址
private static String remoteUrl = "http://192.168.1.168:4444/wd/hub";
public static void main(String[] args) throws MalformedURLException {
// 判断cmd中传进来的参数个数是否大于0,且参数值与字符串做比较(忽略大小写),判断用户的输入字符是否与上面定义的字符串相匹配
if (args.length > 0
&& (args[0].equalsIgnoreCase(ie)
|| args[0].equalsIgnoreCase(chrome)
|| args[0].equalsIgnoreCase(firefox) || args[0]
.equalsIgnoreCase(edge))) {
// 将用户输入的字符遍历输出
for (int i = 0; i < args.length; i++) {
System.out.println("你输入的字符为:" + args[i] + ",忽略大小写后为:"
+ args[i].toLowerCase());
}
// 根据输入的字符做判断并调用对应的浏览器
if (firefox.equalsIgnoreCase(args[0])) {
Browser = DesiredCapabilities.firefox();
} else if (chrome.equalsIgnoreCase(args[0])) {
Browser = DesiredCapabilities.chrome();
} else if (ie.equalsIgnoreCase(args[0])) {
Browser = DesiredCapabilities.internetExplorer();
} else if (edge.equalsIgnoreCase(args[0])) {
Browser = DesiredCapabilities.edge();
}
}
// 用户输入参数有值,但值不匹配时,调用默认浏览器
else if (args.length > 0
&& (!args[0].equalsIgnoreCase(ie)
|| !args[0].equalsIgnoreCase(chrome)
|| !args[0].equalsIgnoreCase(firefox) || !args[0]
.equalsIgnoreCase(edge))) {
for (int i = 0; i < args.length; i++) {
System.out.println("你输入的字符为:" + args[i]
+ ",与远程测试浏览器名称(忽略大小写)不匹配,将使用默认浏览器firefox执行远程测试!");
}
Browser = DesiredCapabilities.firefox();
}
// 用户无任何输入时,也调用默认浏览器
else {
System.out.println("你未输入需要执行测试的远程浏览器名称,将使用默认浏览器firefox执行远程测试!");
Browser = DesiredCapabilities.firefox();
}
BrowserAllInOne browserAllInOne = new BrowserAllInOne();
// 传入用于执行远程测试的地址和需要调用的浏览器
WebDriver driver = browserAllInOne.getDefaultRemoteDriver(remoteUrl,
Browser);
// 传入driver,调用测试脚本
browserAllInOne.searchBaidu(driver);
}
// 调用浏览器,并将driver返回
public WebDriver getDefaultRemoteDriver(String remoteUrl,
DesiredCapabilities Browser) throws MalformedURLException {
try {
Browser.setJavascriptEnabled(true);
String getBrowserName = Browser.getBrowserName();
System.out.println("将要执行远程测试的浏览器为:" + getBrowserName);
URL url = new URL(remoteUrl);
WebDriver driver = new RemoteWebDriver(url, Browser);
return driver;
} catch (Exception e) {
System.out.println("远程测试执行异常,请检查该浏览器是否正确加入到节点!");
}
return null;
}
// 定义方法,编写自动化测试脚本
public void searchBaidu(WebDriver driver) {
// 捕获异常,防止浏览器无法正常关闭导致的下次执行测试无响应!
try {
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
System.out.println("远程测试开始执行!");
driver.get("http://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys("guaishounan的博客");
driver.findElement(By.id("su")).click();
waitTime(2000);
System.out.println("远程测试执行成功!!!");
driver.quit();
System.out.println("远程测试浏览器已关闭!");
} catch (Exception e) {
driver.quit();
System.out.println("远程测试执行异常,浏览器已关闭!");
}
}
// 封装强制等待方法,避免每次使用Thread.sleep()时都抛异常和捕获异常
public void waitTime(int time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
接下来,将java代码打包成jar包,使用者就可以运行该jar包并传参执行测试!
通过在代码逻辑中加入判断和异常处理后,程序的健壮性大大提高,代码执行情况如下图所示:
同样,linux有java环境,该jar包同样可以执行测试,无需单独针对该平台打包
笔者这里只对浏览器做了判断,读者可以尝试对测试hub进行判断,这样就可以切换不同的hub和浏览器执行测试!