我们将在同一台工作电脑上,分别启动主控(Hub)和节点(Node)2个Selenium Grid服务,IP地址均使用环回地址127.0.0.1,端口分别为4444和5555。开始以下操作前,请确认你的机器上已经安装、配置好Java的开发环境。

  1. 这里下载最新版的Selenium Grid。
  2. 执行以下命令,启动主控(Hub)服务。注意这里使用了与后续命令不同的hub选项;

    java -jar /Users/aaron/driver/selenium-server-4.0.0.jar hub --host 127.0.0.1 --port 4444
  3. 执行以下命令,启动节点(Node)服务。此处通过-D参数设置了Chrome驱动的文件路径作为系统属性;使用--hub参数,注册到了上一步中启动的(主控)Hub中;通过--driver-configuration参数,提供了Chrome相关的测试能力。

    java -Dwebdriver.chrome.driver=/Users/aaron/driver/chromedriver \
      -jar /Users/aaron/driver/selenium-server-4.0.0.jar \
      node \
      --host 127.0.0.1 --port 5555 \
      --hub http://127.0.0.1:4444/grid/register \
      --driver-configuration display-name="Chrome" webdriver-path="/Users/aaron/driver/chromedriver" stereotype='{"browserName": "chrome", "browserVersion": "95"}'
  4. 打开(主控)Hub的地址http://127.0.0.1:4444,可以看到Node已经注册成功。
    image.png

注:实验发现,官网4.0手册中所述的、紧跟--driver-configuration选项的webdriver-path参数未起作用。故此处重复使用了-D参数来指定驱动的文件路径,这会造成上图中出现2个Chrome能力的图标,但不影响使用。

  1. 执行以下命令,从Gitee代码仓库获取演示项目的源代码;

    git clone https://gitee.com/ngtesting/ci_test_selenium_simple
  2. 在Idea中打开项目,右击SeleniumTestRemote.java测试类文件,选择Debug的菜单项,执行JUnit单元测试。

这里给出完整的Java代码文件,请留意它是如何连接远程主控(Hub)执行测试的。其他语言的例子,请参照Selenium官方示例

package com.deeptest.sample.selenium;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

public class SeleniumTestRemote {

    // 类级别的变量
    private WebDriver driver;
    private Map<String, Object> vars;
    JavascriptExecutor js;

    // 使用JUnit的@Before注解,定义在测试执行前,需执行的初始化行为。
    @Before
    public void setUp() {
        // 在请求中,指定需要chrome 95的测试能力
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.setCapability("browserVersion", "95");

        // 初始化RemoteWebDriver对象,连接到主控(Hub)服务;
        // 实际测试执行将发生在,已成功注册到Hub上的Node节点中。
        WebDriver driver = null;
        try {
            driver = new RemoteWebDriver(new URL("http://127.0.0.1:4444/wd/hub"), chromeOptions);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 初始化JS执行器对象,用于在浏览器中执行Javascript代码。
        js = (JavascriptExecutor) driver;
    }

    // 使用JUnit的@After注解,定义在测试完成后,需执行的清理代码。
    @After
    public void tearDown() {
        // 退出并清理WebDriver对象
        if (driver != null) {
            driver.quit();
        }
    }

    // 使用JUnit的@After注解,标注此方法为一个测试方法。
    @Test
    public void test1() {
        // 打开百度网站首页
        driver.get("https://www.baidu.com/");

        // 设置浏览器窗口大小为1440x875
        driver.manage().window().setSize(new Dimension(1440, 875));

        // 找到id为kw的(文本框)控件,在里面输入“禅道”文字。
        driver.findElement(By.id("kw")).sendKeys("禅道");

        // 找到id为su的(按钮)控件,并点击。
        driver.findElement(By.id("su")).click();

        // 找到指定内容的链接,并点击。
        driver.findElement(By.partialLinkText("开源项目管理软件")).click();
    }

}

专题目录


陈哥聊测试
158 声望3.3k 粉丝

资深敏捷测试顾问,国内知名项目管理软件禅道团队成员。