Selenium Grid обычно используется для удаленного выполнения, чтобы на вашем локальном компьютере не требовалось устанавливать браузеры (верно в случае сборочных машин, которые обычно представляют собой Linux-боксы без головок) или чтобы вы могли использовать свой локальный компьютер для чего-либоelse (верно для вашего локального ноутбука / настольного компьютера, когда вы запускаете тесты в режиме разработки).
Связывание Selenium Grid в вашем проекте (так, чтобы каждый раз, когда вы строите и запускаете тесты в своем проекте, селенсетка отключена) не очень хорошая идея.
Если вы все еще ищете запуск Selenium Grid локально (запуск Selenium Grid удаленно не только хакерский, но и требует много обходных путей и подверженмного сбоев) сначала, а затем, когда ваши тесты пользовательского интерфейса указывают на него, а затем выполняются, вы можете сделать это следующими способами:
- Путем выделения Selenium Grid через плагин maven.
Для этого вам необходимо использовать maven-antrun-plugin
.Ниже приведена типичная конфигурация того, как будет выглядеть плагин antrun (он вращается от концентратора с двумя подключенными к нему узлами). Источник этой информации был this thread
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<phase>process-test-classes</phase>
<configuration>
<target>
<java classname="org.openqa.grid.selenium.GridLauncherV3"
classpathref="maven.test.classpath"
failonerror="true"
fork="false">
<arg line="-role hub"/>
</java>
<java classname="org.openqa.grid.selenium.GridLauncherV3"
classpathref="maven.test.classpath"
failonerror="true"
fork="false">
<arg line="-role node"/>
</java>
<java classname="org.openqa.grid.selenium.GridLauncherV3"
classpathref="maven.test.classpath"
failonerror="true"
fork="false">
<arg line="-role node -port 6666"/>
</java>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
.Приведенная выше конфигурация плагина предполагает, что selenium-server
добавляется как test
зависимость, то есть что-то вроде ниже
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>3.12.0</version>
<scope>test</scope>
</dependency>
Если у вас compile
зависимость от времени selenium-server
, пожалуйста, измените
classpathref="maven.test.classpath"
К
classpathref="maven.compile.classpath"
Более подробную информацию о classpathref
см. В официальной документации .
Предупреждение:
Поскольку теперь Selenium Grid в основном регистрирует bean-компоненты для JMX, вы можете получить ошибку, такую как приведенная ниже
08:28:09.529 INFO [GridLauncherV3$3.launch] - Launching a Selenium Grid node on port 6666
java.security.AccessControlException: access denied ("javax.management.MBeanTrustPermission" "register")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
В случае возникновения такой ошибки, пожалуйста, убедитесь, что вы открываетефайл с именем java.policy
находится в %JAVA_HOME%\jre\lib\security\
и в разделе grant {
добавьте permission javax.management.MBeanTrustPermission "register";
(источником этой информации был этот поток)
Теперь вы можете очень хорошо запустить свойTestNG тесты, запустив mvn clean test
(И когда вы это сделаете, вы заметите селенсетка запускается локально)
- Путем выделения Selenium Grid с помощью метода прослушивания / конфигурации TestNG.
Здесь вы в основном вращаетесьотключите концентратор и узел селена с помощью прослушивателя TestNG или с помощью метода конфигурации, а затем пусть ваши тесты просто указывают на локально развернутую сетку и запускаются против нее.
В приведенном ниже примере показан тест, который выполняется налокально раскручивать сетку (через метод конфигурации)
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import org.openqa.grid.selenium.GridLauncherV3;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
public class AnotherSample {
private RemoteWebDriver driver;
@BeforeSuite
public void beforeSuite() throws InterruptedException {
new Thread(
() -> {
String[] args = {"-role", "hub"};
GridLauncherV3.main(args);
})
.start();
new Thread(
() -> {
String[] args = {"-role", "node"};
GridLauncherV3.main(args);
})
.start();
// Lets wait for 10 seconds for the Hub and the node to be up and running
TimeUnit.SECONDS.sleep(10);
}
@BeforeClass
public void setup() throws MalformedURLException {
driver =
new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), new ChromeOptions());
}
@Test
public void testMethod() {
driver.get("http://www.google.com");
System.err.println("Title = " + driver.getTitle());
}
@AfterClass
public void cleanup() {
if (driver != null) {
driver.quit();
}
}
}