java - 如何在 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)
解决方案
您在实例化它之前正在使用 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。
推荐阅读
- java - 在 Java 中为日志记录或异常创建消息的最佳实践
- symfony4 - 找不到“GET /inscription”的路线
- java - 安装后尝试打开 spark 报错:找不到任何与版本“1.8”匹配的 JVM
- maxmind - 给定城市时查询国家/地区的 maxmind mmdb
- python - 在 Python 中检查列表的长度并打印最长和最短列表的名称
- haskell - 无法将多个客户端与 Haskell Websocket 服务器一起使用
- ffmpeg - FFMPEG 中的“流 1 中的输入数据包损坏”错误
- matlab - 'double' 类型的输入参数的未定义函数 'equation'
- python - 取函数矩阵的逆
- swift - Swift、macOS、带有 2 个 GPU 的 mac,矩阵运算在一个 GPU 上工作,而不是在另一个 GPU 上工作