《手把手教你》系列技巧篇(六十二)-java+ selenium自动化测试-RemoteWebDriver让你的代码与测试分离(远程测试)(详细教程)

1.简介

当本机上没有浏览器,需要远程调用浏览器进行自动化测试时,需要用到RemoteWebDirver。宏哥申请服务器还没有下来,也懒得自己在本地安装虚拟机,等的时间太长了于是就网上找了一个可以免费试用2天的服务器(网址://www.varidata.com/),注册一下基本上几个小时后,就可以用了有兴趣的你也可以自己申请一个。文章中可能前后的服务器不一样,所以截图有点瑕疵,抱歉啊。

2.RemoteWebDriver简介

RemoteWebDriver包括两部分:客户端和服务端

   1)客户端就是我们要运行测试用例(脚本)

   2)服务端就是我们启动的服务

3.应用场景

想像一下最简单的一个应用场景:你和你的同事两人一起开发一段webdriver脚本,然后你们需要在一个公共的环境去运行这段脚本。为什么要在公共的环境运行?那是因为每个人的开发机器是有差异的,但是如果用同一台测试机的话,那么环境差异的因素就可以基本排除。我们应该经常听到开发说这样的话:”这个bug在我的环境上是好的啊!”。因为运行环境不同而造成的bug比比皆是,因此我们需要一个统一的运行环境来消除差异。这样就不会出现”这个bug在我的环境上是好的啊!”类似的问题了。
在这样的应用场景下,我们就需要使用remote webdriver,我们在本地开发脚本,然后调用remote webdriver,在测试机器上执行我们的测试。

4.RemoteWebDriver优缺点

(1)更方便跨平台、浏览器的测试;

(2)测试更加稳定;(在本地启动浏览器测试时,可能会由于相关操作导致测试不稳定);

(3)RemoteWebDriver使测试用例和被测的浏览器可以不用部署在同一台机子上,比如当前运行测试用例的本地没有浏览器a,你又想用a去跑,可以通过发送远程命令到远程有 a浏览器的测试机去跑,省在搭环境,但缺点是从远端服务端发送来的字符串可能存在结尾符号不兼容问题,还有就是会增加网络延时。

(4)可以使执行测试的机器和发送测试命令的机器独立开来,比如A机器,是写测试代码的机器,可以发送测试命令给服务器,可以理解为客户端;B机器是执行测试代码的机器,可以理解为服务器端,A发送命令给B,然后再B上面执行测试,并返回结果给A。

5.环境准备

1. 安装JDK(jdk1.8.0_101),这个需要在客户端和服务端都需要安装,客户端需要运行java代码,而服务端需要启动一个java的jar包服务,所以都需要安装JDK并配置环境变量;

2. 下载安装firefox,chrome浏览器 ;

3. 下载selenium-server-standalone.jar (官方下载地址);

4. 下载InternetExplorerDriver,ChromeDriver,geckodriver(selenium3.0以及之后的版本支持的firefox driver);

5.  两台机器,一台作为客户端,一台作为服务器端。

6.服务端配置

6.1安装JDK

  安装jdk,宏哥这里在服务器安装的是1.8,将环境变量配置好(可以参考宏哥这篇文章://www.cnblogs.com/du-hong/p/11670441.html其中有如何配置JDK的环境变量方法)。好像selenium-server3.0.0以上版本需要依赖java8(这个没有验证过),如果大家在启动server的过程中报错,可以尝试将jdk修改为1.8或者更高版本试一下。如下图所示:

6.2安装firefox,chrome浏览器

 这个宏哥在这里就不赘述了,直接下载安装包,傻瓜式安装即可。

6.3下载selenium-server-standalone.jar

官方下载地址://www.selenium.dev/downloads/

6.4下载浏览器驱动

下载chromedriver,geckodriver(selenium3.0以及之后的版本支持的firefox driver)

(1)chromedriver官方下载地址:

【国外】chromedriver所有版本下载地址://chromedriver.storage.googleapis.com/index.html

【国内】chromedriver所有版本下载地址://npm.taobao.org/mirrors/chromedriver

【国内】chrome所有版本下载地址://www.chromedownloads.net/chrome64win/

【国外】浏览器版本和驱动版本对应关系查看网址://chromedriver.chromium.org/downloads

(2)geckodriver官方下载地址://github.com/mozilla/geckodriver/releases

说明:由于我下载的serverselenium-server-standalone.jar是3.141.59版本的,所以这里需要下载geckodriver,如果你本机的server不是3.0.0以及之后的版本,则不用单独下载firefox driver(geckodriver),可以直接使用selenium客户端的老版本的firefoxdriver。

如果是跟随宏哥的教程学习的小伙伴或者童鞋们,其中第一步、第二步、第三步和第四步你可以直接将你本机中的JDK安装目录文件、Chrome安装目录文件、Eclipse中的selenium-server-standalone-3.141.59.jar和浏览器驱动直接拷贝到服务端即可!宏哥为了省事就直接拷贝到服务器上,这样就不用担心版本匹配的问题了,因为你已经在你本地验证过了如下图所示:

(1)本机(客户端)的JDK:

 (2)本机(客户端)的Chrome:

 (3)本机(客户端)的jar和浏览器驱动:

(1)服务器的Chrome:

(2)服务器的JDK、jar和浏览器驱动:

7.客户端和服务器的操作

 Selenium框架的远程控制主要是通过RemoteWebDriver这个类来实现的。

7.1服务器端

为了保持测试环境一致,所以我们将测试环境部署在服务器上,代码在本地也就是客户端【测试环境放在服务器上,执行代码的机器为客户机】

7.2服务器操作

1. 首先配置JDK,并配置环境变量,增加放WebDriver文件的地址(即将相应的WebDriver文件夹配置到环境变量的path中)

2. 启动独立测试jar包(注意JAR包的版本号),如果是配置了JDK的环境变量直接使用下边的命令就可以

java -jar C:\Java\selenium-server-standalone-2.46.0.jar

3.如果没有配置,则需要进入JDK安装目录下的bin文件夹中,然后在路径输入框,输入cmd回车,或者直接使用命令进入bin文件夹目录,然后再使用上边的命令。宏哥这里在服务器就没有配置(因为临时演示就懒得配置)。

4. 命令启动的端口默认是4444,如果被占用了,你可以指定端口启动,命令如下:

java -jar C:\Java\selenium-server-standalone-2.46.0.jar -port 5566

7.3客户端

客户端操作

1. 验证服务端响应是否正常。在浏览器中输入地址://服务器IP地址:端口/wd/hub/ ,显示如下页面。

8.远程测试

8.1代码设计

测试代码,通过RemoteWebDriver调用服务器

8.2参考代码

package lessons;

import java.io.File;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.apache.commons.io.FileUtils;

/**
 * @author 北京-宏哥
 * 
 * @公众号:北京宏哥
 * 
 * @《手把手教你》系列技巧篇(六十二)-java+ selenium自动化测试-RemoteWebDriver让你的代码与测试分离(远程测试)(详细教程) 
 *
 * @2022年1月21日
 */
public class Remote {
    
    
        public static void main(String[] args) throws Exception {
            // RemoteWebDriver的基本使用

            //第一个参数:表示服务器的地址。第二个参数:表示预期的执行对象,其他的浏览器都可以以此类推
            WebDriver driver = new RemoteWebDriver(new URL("//103.194.186.114:5566/wd/hub/"), DesiredCapabilities.chrome());
            driver.manage().window().maximize();
            driver.get("//www.baidu.com");
            Thread.sleep(2000);
            
            System.out.println("开始");
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); //转换时间格式
            String time = dateFormat.format(Calendar.getInstance().getTime()); //获取当前时间
            File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); //执行屏幕截取
            FileUtils.copyFile(srcFile, new File("屏幕截图", time + ".png")); //利用FileUtils工具类的copyFile()方法保存getScreenshotAs()返回的文件;"屏幕截图"即时保存截图的文件夹
            Thread.sleep(2000);
            JavascriptExecutor js = (JavascriptExecutor)driver;
            js.executeScript("alert('我现在在服务器')");
            Thread.sleep(5000);
            System.out.println("browser will be close");
            driver.quit();
       }

}

8.3运行代码

1.运行代码,右键Run AS->Java Appliance,控制台输出,如下图所示:

2.运行代码后服务端的浏览器的动作,如下小视频所示:

3. 执行脚本。执行过程中可以看到服务器的浏览器被调用,同时cmd窗口中打印出相关的运行信息,如下 

9.小结

1.今天讲解的其实也很简单,说白了就是将你本地的测试环境在服务器上部署一套,然后通过服务器的IP,本地通过RemoteWebDriver类来远程控制服务器。注意浏览器驱动的环境变量的配置,否则就会找不到驱动.如果为了省事可以直接将驱动复制到system32的文件夹下就可以。如下图所示:

2.端口被占用,启动服务报错,如下图所示:

3.宏哥复制Chrome浏览器时,直接复制到服务器的C盘的根目录,结果报如下图错误:

 解决办法:,宏哥将其复制到服务器的:C:\Program Files (x86)目录下,成功运行。

 最后一个的报错,网上有的说是服务器端的浏览器没有关闭,关闭就可以了,宏哥专门打开浏览器,运行了一下代码,正常运行,感觉和这个浏览器是否关闭没有关系。