如何 运行 使用独立/容器化服务器进行 Selenium 测试
How to run Selenium tests with a standalone / containerized server
这个问题是关于如何启动独立的 Selenium 服务器的——目前看来我的 junit 测试会为我启动 Selenium 服务器,我希望单独进行。
// 使用 junit 的 selenium 测试脚本:
package suman;
import java.util.concurrent.TimeUnit;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.interactions.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
public class SeleniumTest {
private static FirefoxDriver driver;
private WebElement element;
@BeforeClass
public static void openBrowser(){
System.setProperty("webdriver.gecko.driver", "/home/oleg/Desktop/geckodriver");
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@Test
public void valid_UserCredential(){
System.out.println("Starting test " + new Object(){}.getClass().getEnclosingMethod().getName());
driver.get("http://www.store.demoqa.com");
driver.findElement(By.xpath(".//*[@id='account']/a")).click();
driver.findElement(By.id("log")).sendKeys("testuser_3");
driver.findElement(By.id("pwd")).sendKeys("Test@123");
driver.findElement(By.id("login")).click();
try{
element = driver.findElement (By.xpath(".//*[@id='account_logout']/a"));
}catch (Exception e){
}
Assert.assertNotNull(element);
System.out.println("Ending test " + new Object(){}.getClass().getEnclosingMethod().getName());
}
@Test
public void inValid_UserCredential()
{
System.out.println("Starting test " + new Object(){}.getClass().getEnclosingMethod().getName());
driver.get("http://www.store.demoqa.com");
driver.findElement(By.xpath(".//*[@id='account']/a")).click();
driver.findElement(By.id("log")).sendKeys("testuser");
driver.findElement(By.id("pwd")).sendKeys("Test@123");
driver.findElement(By.id("login")).click();
try{
element = driver.findElement (By.xpath(".//*[@id='account_logout']/a"));
}catch (Exception e){
}
Assert.assertNotNull(element);
System.out.println("Ending test " + new Object(){}.getClass().getEnclosingMethod().getName());
}
@AfterClass
public static void closeBrowser(){
driver.quit();
}
}
// pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>suman</groupId>
<artifactId>suman</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>suman</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>3.9.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-firefox-driver</artifactId>
<version>3.9.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>3.9.1</version>
</dependency>
</dependencies>
</project>
当我 运行:
mvn clean test
它将在后台启动一个selenium 服务器,测试将使用该selenium 服务器。 我的问题是 - 如何配置我的项目以便我的测试脚本使用 external/containerize/standalone Selenium 服务器?我不希望我的测试进程启动 Selenium 服务器 - 我想单独启动它。
从 Selenium 官方网站下载 selenium-server-standalone.jar
。
然后,运行这个带参数的jar
start java -jar "C:\my\path\to\file\selenium-server-standalone-3.7.1.jar" -role hub -port 4445
这将启动一个 HUB,它接受您的测试并将其分发到节点。
节点是机器(可以与集线器相同),浏览器将在其中物理启动其进程。
要创建节点,我们将使用完全相同的 jar 文件。
要启动一个节点:
start java -Dwebdriver.chrome.driver="C:\path\to\chromedriver\chromedriver.exe" -jar "C:\path\to\selenium\jar\selenium-server-standalone-3.7.1.jar" -role webdriver -browser "browserName=chrome,version=64.0,maxInstances=3" -hub http://localhost:4445/grid/register -port 5580
以上将允许您创建一个具有 3 个 chrome 实例的节点。您当然可以使用任何其他浏览器。
当您最终设置您的 Selenium 网格(集线器 + 节点)时,您想要向其分发测试。
如果没有 Selenium Grid,测试 运行 始终在您的本地计算机上进行,浏览器由 new ChromeDriver()
或 new FirefoxDriver()
classes 创建。
有一个 class 运行 测试提供 URL(集线器的 url)。这是 RemoteWebDriver
.
使用示例:
WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4445/wd/hub"), DesiredCapabilities.chrome());
现在每个测试都将在您的自定义 Selenium 服务器上 运行。您可以使用它来 运行 测试 10 个或更多实例,具体取决于您的机器。如果在同一网络上,您甚至可以使用几台不同的计算机。
这个问题是关于如何启动独立的 Selenium 服务器的——目前看来我的 junit 测试会为我启动 Selenium 服务器,我希望单独进行。
// 使用 junit 的 selenium 测试脚本:
package suman;
import java.util.concurrent.TimeUnit;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.interactions.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
public class SeleniumTest {
private static FirefoxDriver driver;
private WebElement element;
@BeforeClass
public static void openBrowser(){
System.setProperty("webdriver.gecko.driver", "/home/oleg/Desktop/geckodriver");
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@Test
public void valid_UserCredential(){
System.out.println("Starting test " + new Object(){}.getClass().getEnclosingMethod().getName());
driver.get("http://www.store.demoqa.com");
driver.findElement(By.xpath(".//*[@id='account']/a")).click();
driver.findElement(By.id("log")).sendKeys("testuser_3");
driver.findElement(By.id("pwd")).sendKeys("Test@123");
driver.findElement(By.id("login")).click();
try{
element = driver.findElement (By.xpath(".//*[@id='account_logout']/a"));
}catch (Exception e){
}
Assert.assertNotNull(element);
System.out.println("Ending test " + new Object(){}.getClass().getEnclosingMethod().getName());
}
@Test
public void inValid_UserCredential()
{
System.out.println("Starting test " + new Object(){}.getClass().getEnclosingMethod().getName());
driver.get("http://www.store.demoqa.com");
driver.findElement(By.xpath(".//*[@id='account']/a")).click();
driver.findElement(By.id("log")).sendKeys("testuser");
driver.findElement(By.id("pwd")).sendKeys("Test@123");
driver.findElement(By.id("login")).click();
try{
element = driver.findElement (By.xpath(".//*[@id='account_logout']/a"));
}catch (Exception e){
}
Assert.assertNotNull(element);
System.out.println("Ending test " + new Object(){}.getClass().getEnclosingMethod().getName());
}
@AfterClass
public static void closeBrowser(){
driver.quit();
}
}
// pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>suman</groupId>
<artifactId>suman</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>suman</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>3.9.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-firefox-driver</artifactId>
<version>3.9.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>3.9.1</version>
</dependency>
</dependencies>
</project>
当我 运行:
mvn clean test
它将在后台启动一个selenium 服务器,测试将使用该selenium 服务器。 我的问题是 - 如何配置我的项目以便我的测试脚本使用 external/containerize/standalone Selenium 服务器?我不希望我的测试进程启动 Selenium 服务器 - 我想单独启动它。
从 Selenium 官方网站下载 selenium-server-standalone.jar
。
然后,运行这个带参数的jar
start java -jar "C:\my\path\to\file\selenium-server-standalone-3.7.1.jar" -role hub -port 4445
这将启动一个 HUB,它接受您的测试并将其分发到节点。 节点是机器(可以与集线器相同),浏览器将在其中物理启动其进程。
要创建节点,我们将使用完全相同的 jar 文件。
要启动一个节点:
start java -Dwebdriver.chrome.driver="C:\path\to\chromedriver\chromedriver.exe" -jar "C:\path\to\selenium\jar\selenium-server-standalone-3.7.1.jar" -role webdriver -browser "browserName=chrome,version=64.0,maxInstances=3" -hub http://localhost:4445/grid/register -port 5580
以上将允许您创建一个具有 3 个 chrome 实例的节点。您当然可以使用任何其他浏览器。
当您最终设置您的 Selenium 网格(集线器 + 节点)时,您想要向其分发测试。
如果没有 Selenium Grid,测试 运行 始终在您的本地计算机上进行,浏览器由 new ChromeDriver()
或 new FirefoxDriver()
classes 创建。
有一个 class 运行 测试提供 URL(集线器的 url)。这是 RemoteWebDriver
.
使用示例:
WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4445/wd/hub"), DesiredCapabilities.chrome());
现在每个测试都将在您的自定义 Selenium 服务器上 运行。您可以使用它来 运行 测试 10 个或更多实例,具体取决于您的机器。如果在同一网络上,您甚至可以使用几台不同的计算机。