【发布时间】:2019-12-30 11:25:53
【问题描述】:
我正在构建一个项目,并偶然发现了 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();
}
}
stacktrace sn-p:
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)
【问题讨论】:
标签: java multithreading selenium singleton selenium-grid