Selenium Grid是一个测试工具,它允许我们在不同的机器上针对不同的浏览器运行测试。
配置Hub
为了简单起见,我们将只使用一台机器来设置Hub,并在同一台机器上设置Node来运行测试。
1.需要安装Java 11或更高版本
2.需要安装浏览器
3.需要安装浏览器驱动程序
下载chromedriver
https://raw.githubusercontent.com/webdriverextensions/webdriverextensions-maven-plugin-repository/master/repository-3.0.json
需要已经安装并配置了PATH环境变量
4.从最新的发布版本下载Selenium Server jar文件
1.https://github.com/SeleniumHQ/selenium/releases/latest
2.https://www.selenium.dev/downloads
5.存放目录(自定义)
6.创建Hub
java -jar selenium-server-4.16.1.jar hub
注意:正如开头所说,请使用java 11或更高版本,java 11下载请自行百度或在公众号内回复java 11下载,否则会报以下错误
D:\software\selenium>java -jar selenium-server-4.16.1.jar hub
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/openqa/selenium/grid/Bootstrap has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
7.验证Hub是否启动成功
配置Node
我们在实际应用中,Hub必须和Node不在同一台机器上,我们为了测试方便,将Hub和Node部署在同一台机器上
1.如上所述先启动Hub
2.启动Node
java -jar selenium-server-4.16.1.jar node --hub http://192.168.1.1:4444
我们再去Hub网页查看Node是否注册成功
Hub和Node配置注意事项
1.hub和node在同一台机器
# hub和node在同一台机器,可以使用此命令启动node
java -jar selenium-server-4.16.1.jar node
# 同一台计算机上有多个节点
# 节点1
java -jar selenium-server-4.16.1.jar node --port 5555
# 节点2
java -jar selenium-server-4.16.1.jar node --port 6666
2.hub和node不在同一台机器
Hub和Nodes通过HTTP和事件总线(事件总线位于Hub内部)相互通信。节点通过事件总线向集线器发送消息以启动注册过程。当Hub收到消息时,通过HTTP与Node联系以确认其存在。
要成功地将Node注册到Hub,必须公开Hub机器上的事件总线端口(默认为4442和4443)。这也适用于节点端口。这样一来,Hub和Node就可以进行通了。
如果Hub使用默认端口,则可以使用–hub标志来注册节点
java -jar selenium-server-4.16.1.jar node --hub http://<hub-ip>:4444
当Hub不使用默认端口时,需要使用–publish-events和–subscribe-events标记。例如,如果Hub使用端口8886、 8887和8888则使用以下命令
java -jar selenium-server-<version>.jar hub --publish-events tcp://<hub-ip>:8886 --subscribe-events tcp://<hub-ip>:8887 --port 8888
Node需要使用这些端口才能成功注册
java -jar selenium-server-<version>.jar node --publish-events tcp://<hub-ip>:8886 --subscribe-events tcp://<hub-ip>:8887
示例代码
1.pom.xml
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-server -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>4.0.0-alpha-2</version>
</dependency>
</dependencies>
2.示例代码
package org.example;
import org.junit.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import io.github.bonigarcia.wdm.WebDriverManager;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @author 作者:测试工程师成长之路
* @version 创建时间:2024/1/21
* 类说明:Selenium Grid
*/
public class SeleniumGridTest {
public static final String browserName = "chrome";
@Test
public void test() throws InterruptedException {
try {
System.setProperty("webdriver.chrome.driver","D:\\software\\selenium\\chromedriver.exe");
DesiredCapabilities capability = new DesiredCapabilities();
capability.setBrowserName(browserName);
capability.setPlatform(Platform.WINDOWS);
WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);
driver.get("http://www.baidu.com");
driver.manage().window().maximize();
Thread.sleep(3000);
//输入mrjade查询
driver.findElement(By.id("kw")).sendKeys("mrjade" + Keys.ENTER);
Thread.sleep(3000);
// 点击mrjade-博客园,进入mrjade博客首页
driver.findElement(By.xpath("//*[@id=\"1\"]/h3/a")).click();
Thread.sleep(5000);
driver.close();
driver.quit();
} catch (
MalformedURLException e) {
e.printStackTrace();
}
}
}
3.查看Hub网页显示
官方文档
https://www.selenium.dev/zh-cn/documentation/grid/getting_started/
注意
再次需要提醒,此次demo需使用java 11及以上版本,不建议使用WebDriverManager类来自动管理驱动,否则一堆错,比如浏览器版本与驱动版本不匹配,缺少xx类,403之类的,建议使用低版本的selenium server
最后感谢每一个认真阅读我文章的人!作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,坚持几天便放弃的感受的话,在这里我给大家分享一些软件测试的学习资源,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,希望能给你前进的路上带来帮助。如果你用得到的话可以直接拿走:
软件测试资料领取:[内部资源] 想拿年薪40W+的软件测试人员,这份资料必须领取~
软件测试面试刷题工具领取:软件测试面试刷题【800道面试题+答案免费刷】
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!