首页 > 解决方案 > 如何在 Selenium Grid 上对两个单例浏览器进行多线程处理?

问题描述

我正在构建一个项目并偶然发现了 Selenium Grid 的多线程。我有两个浏览器设置扩展了我需要运行的 selenium 包装器页面(Chrome 驱动程序和 Firefox 驱动程序)。

我已经分别阅读了很多关于多线程和单例模式的文章,但不知道如何让它们一起工作。

测试:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="selenium" verbose="1" thread-count="2"  parallel="tests">
    <test name="ChromeTest">
        <parameter name="browserName" value="chrome"/>
        <classes>
            <class name="Run.CucumberRunner"/>
        </classes>
    </test>
    <test name="FirefoxTest">
        <parameter name="browserName" value="firefox"/>
        <classes>
            <class name="Run.CucumberRunner"/>
        </classes>
    </test>
</suite>

黄瓜跑者:

@CucumberOptions(
        features = "src/test/resources/features",
        glue = "Run",
        plugin = "io.qameta.allure.cucumber4jvm.AllureCucumber4Jvm"
)
public class CucumberRunner extends AbstractTestNGCucumberTests {

    private static final Logger LOG = LogManager.getLogger(CucumberRunner.class);

    @Parameters({"browserName"})
    @BeforeTest()
    public void setUp(String browserName) {

        if (browserName.equals("chrome")){
            CustomChromeDriver chromeDriver = CustomChromeDriver.getInstance();
        } else if (browserName.equals("firefox")){
            CustomFirefoxDriver firefoxDriver = CustomFirefoxDriver.getInstance();
        }
    }
}

浏览器实例之一:

class CustomChromeDriver extends BasicDriver {

    private String HUB = "http://192.168.2.105:4444/wd/hub";

    private WebDriverWait wait;

    private static CustomChromeDriver chrome;

    public static CustomChromeDriver getInstance() {
        if (chrome == null) {
            chrome = new CustomChromeDriver();
        }
        return chrome;
    }

    private CustomChromeDriver() {

        wait = new WebDriverWait(remoteWebDriver, 10);
        System.setProperty("webdriver.chrome.driver", "bin/chromedriver.exe");

        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setBrowserName("chrome");

        try {
            remoteWebDriver = new RemoteWebDriver(new URL(HUB), capabilities);
        } catch (MalformedURLException e) {

        }
    }

}

步骤定义:


public class StepDefinitions {

    private MainPage mainPage = new MainPage();

    private static final Logger LOG = LogManager.getLogger(StepDefinitions.class);

    private String testHost = "https://www.google.com/gmail/";


    @Step ("Opening test host")
    @Given("test host open")
    public void openHost() {
        mainPage.navigate(this.testHost);
        LOG.debug("Test host opened");
    }

页面对象的父页面

public abstract class BasicPage {


    public BasicDriver basicDriver;


    public void navigate(String url) {
        basicDriver.get(url);
    }


    public void shutDown(){
        basicDriver.close();
    }

}

堆栈跟踪片段:

java.lang.NullPointerException
    at java.base/java.util.Objects.requireNonNull(Objects.java:221)
    at org.openqa.selenium.support.ui.FluentWait.<init>(FluentWait.java:106)
    at org.openqa.selenium.support.ui.WebDriverWait.<init>(WebDriverWait.java:85)
    at org.openqa.selenium.support.ui.WebDriverWait.<init>(WebDriverWait.java:45)
    at Run.CustomChromeDriver.<init>(CustomChromeDriver.java:49)
    at Run.CustomChromeDriver.getInstance(CustomChromeDriver.java:37)

标签: javamultithreadingseleniumsingletonselenium-grid

解决方案


您在实例化它之前正在使用 remoteWebDriver

下面的块

try {
        remoteWebDriver = new RemoteWebDriver(new URL(HUB), capabilities);
    } catch (MalformedURLException e) {

    }

应该在这条线之前

 wait = new WebDriverWait(remoteWebDriver, 10);
 System.setProperty("webdriver.chrome.driver", "bin/chromedriver.exe");

由于 remoteWebDriver 没有被实例化,你会得到 NullPointerException。


推荐阅读