2014-03-27 36 views
0

我在Selenium Grid中運行代碼。 我有一個名爲TestBase的類,如下所示,我想退出所有線程,當我點擊一個按鈕,但是當我點擊按鈕時拋出一個NullpointerException。如何殺死Selenium Grid節點中的線程

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

非常感謝Alexei表現出的興趣,但我明白我的錯誤n解決了它... 但真的很感謝噸..! :) – LeonarD

+0

我只需要在創建線程後包含框架代碼..這樣我就可以跟蹤每個線程seperatly ..:P – LeonarD

回答

0

就個人而言,我不會使用ThreadLocal。我只是使用受保護的成員變量,保護WebDriver是TestBase類的成員。然後,一旦您的會話在網格上啓動,請讓您的測試記住會話ID,然後如果出現錯誤,您可以通過發送命令以退出驅動程序以及該線程的會話ID來終止網格線程。我基本上是一個JSON請求。 JSON線協議有一個刪除命令,看起來像這樣:

DELETE /session/:sessionId 

通過使用ThreadLocal的,在我看來,你正在使用的東西,是爲了處理本地線程和嘗試這一概念應用到具有遠程服務公司已經擁有自己的線程處理。我想我從來不使用ThreadLocal,因爲我的testrunner爲我做了一個線程分支:TestNG。

+0

Thankyou djangofan ..我會嘗試,因爲作爲m使用線程我的腳本不是穩定的webdriver代碼,我到目前爲止使用.. 這將是真正的一種你,如果你可以給我一個演示代碼..簡單易懂.. 因爲我是新的網格..它的漂亮讓我困惑! – LeonarD

+0

好的,看看我寫的這個項目中的TestBase.doPrep()方法,希望它能夠啓發你。該項目可以調整使用本地網格,而不是SauceLabs:https://github.com/djangofan/simple-selenium-builder-framework – djangofan

+0

謝謝噸.. djangofan :) – LeonarD