java - 如何使用独立/容器化服务器运行 Selenium 测试

标签 java maven selenium junit selenium-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服务器。 我的问题是 - 如何配置我的项目以便我的测试脚本使用外部/容器化/独立的 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

这将启动一个集线器,它接受您的测试并将其分发到节点。 节点是浏览器将在其中物理启动其进程的机器(可以与集线器相同)。

为了创建节点,我们将使用相同的 jar 文件。

启动节点: 启动 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 -端口 5580

上面的内容将允许您创建一个具有 3 个 chrome 实例的节点。您当然可以使用任何其他浏览器。

当您最终设置 Selenium 网格(集线器 + 节点)时,您想要向其分发测试。

如果没有 Selenium Grid,测试始终在本地计算机上运行,​​并且浏览器由 new ChromeDriver()new FirefoxDriver() 类创建。

有一个类针对提供的 URL(集线器的 url)运行测试。它是RemoteWebDriver

使用示例: WebDriver 驱动程序 = new RemoteWebDriver(new URL("http://localhost:4445/wd/hub"), DesiredCapabilities.chrome());

现在每个测试都将在您的自定义 Selenium 服务器上运行。您可以使用它对 10 个或更多实例运行测试,具体取决于您的计算机。如果在同一网络上,您甚至可以使用几台不同的计算机。

关于java - 如何使用独立/容器化服务器运行 Selenium 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48718838/

相关文章:

java - 找不到适合 show(ActionBar,String) 方法的方法 DialogFragment.show(FragmentTransaction,String) 不适用

java - 尝试从 maven 运行 java 程序时出现异常

java - 如何在 Java Selenium 中使用通配符条目进行搜索

networking - 如何使用 Selenium 访问谷歌浏览器开发人员工具上的网络面板?

java - Selenium Driver点击android键盘上的绿色勾号进行自动化测试的命令是什么?

java - WorkManager 用于长网络连接?

java - 在 Windows 上使用 evosuite

java - 不同类型的数组声明

java - 执行目标 wildfly swarm 插件时出现问题,API 不兼容,java.lang.AbstractMethodError

java - 禁用 mvn 快照不起作用