【软件测试】Selenium Grid2之跨浏览器远程测试(二)

上一篇博客中,笔者提到测试脚本的健壮性有待提高,其次,因为测试脚本是用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和浏览器执行测试!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪兽男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值