我在Selenium Grid中运行代码。 我有一个名为TestBase的类,如下所示,我想在单击按钮时退出所有线程,但是当我单击按钮时会抛出NullpointerException。
public class TestBase {
protected ThreadLocal<RemoteWebDriver> threadDriver = null;
Button b;
Frame f;
static boolean flag = true;
@BeforeMethod
public void setUp() throws MalformedURLException {
if(flag)
{
JFrame calcFrame = new JFrame();
flag = false;
calcFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JButton button1 = new JButton("1");
button1.addActionListener(new ActionListener()
{public void actionPerformed(ActionEvent ae) {closure();}
});
calcFrame.add(button1);
calcFrame.setVisible(true);
}
threadDriver = new ThreadLocal<RemoteWebDriver>();
DesiredCapabilities dc = new DesiredCapabilities();
FirefoxProfile fp = new FirefoxProfile();
dc.setCapability(FirefoxDriver.PROFILE, fp);
dc.setBrowserName(DesiredCapabilities.firefox().getBrowserName());
threadDriver.set(new RemoteWebDriver(new URL("http://192.168.3.7:4444/wd/hub"), dc));
}
public WebDriver getDriver() {
return threadDriver.get();
}
public void closure()
{
getDriver().quit();
}
@AfterMethod
public void closeBrowser() {
// log.info("In closeBrowser...");
getDriver().quit();
}
}
我想它无法找到它必须退出的线程。请帮助.. :)
答案 0 :(得分:0)
就个人而言,我不会使用ThreadLocal。我只会使用受保护的成员变量,将受保护的WebDriver作为TestBase类的成员。然后,一旦您的会话在网格上启动,让您的测试记住会话ID,然后如果有错误,您可以通过发送命令退出驱动程序以及该线程的会话ID来终止Grid线程。我基本上是一个JSON请求。 JSON有线协议有一个删除命令,如下所示:
DELETE /session/:sessionId
通过使用ThreadLocal,在我看来,你正在使用一些用于处理本地线程的东西,并试图将该概念应用于已经有自己的线程处理的远程服务。我想我从不使用ThreadLocal,因为我的测试人员为我做了线程:TestNG。