如何在Selenium Grid节点中杀死线程

时间:2014-03-27 11:58:22

标签: java multithreading selenium-grid

我在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();
    }
}

我想它无法找到它必须退出的线程。请帮助.. :)

1 个答案:

答案 0 :(得分:0)

就个人而言,我不会使用ThreadLocal。我只会使用受保护的成员变量,将受保护的WebDriver作为TestBase类的成员。然后,一旦您的会话在网格上启动,让您的测试记住会话ID,然后如果有错误,您可以通过发送命令退出驱动程序以及该线程的会话ID来终止Grid线程。我基本上是一个JSON请求。 JSON有线协议有一个删除命令,如下所示:

DELETE /session/:sessionId

通过使用ThreadLocal,在我看来,你正在使用一些用于处理本地线程的东西,并试图将该概念应用于已经有自己的线程处理的远程服务。我想我从不使用ThreadLocal,因为我的测试人员为我做了线程:TestNG。