我们将在同一台工作电脑上,分别启动主控(Hub)和节点(Node)2个Selenium Grid服务,IP地址均使用环回地址127.0.0.1,端口分别为4444和5555。开始以下操作前,请确认你的机器上已经安装、配置好Java的开发环境。
- 从这里下载最新版的Selenium Grid。
执行以下命令,启动主控(Hub)服务。注意这里使用了与后续命令不同的hub选项;
java -jar /Users/aaron/driver/selenium-server-4.0.0.jar hub --host 127.0.0.1 --port 4444
执行以下命令,启动节点(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"}'
- 打开(主控)Hub的地址http://127.0.0.1:4444,可以看到Node已经注册成功。
注:实验发现,官网4.0手册中所述的、紧跟--driver-configuration选项的webdriver-path参数未起作用。故此处重复使用了-D参数来指定驱动的文件路径,这会造成上图中出现2个Chrome能力的图标,但不影响使用。
执行以下命令,从Gitee代码仓库获取演示项目的源代码;
git clone https://gitee.com/ngtesting/ci_test_selenium_simple
- 在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();
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。