2012-12-21 205 views
4

我正在WebDriver運行測試,當測試失敗時,瀏覽器不關閉。在Windows機器上,這是一個巨大的問題,因爲我有幾個IEDriver實例仍在後臺運行。失敗測試後關閉瀏覽器

我試過try/catch語句,它似乎不工作。如果測試失敗,瀏覽器仍然保持打開狀態。任何幫助將不勝感激。

在try catch語句看起來是這樣的:

try 
{ 
    Assert.something(something something dark side); 
    driver.quit(); 
} 
catch(Exception e) 
{ 
    System.out.println(e) 
    driver.quit(); 
} 

我的完整代碼如下:

public class ClickAddMedication 
{ 
Browser browser = new Browser(); 

public void addMedication(String driverName) 
{ 
    //Open Browser and navigate to page 
    WebDriver driver = browser.getDriver(driverName); 
    driver.manage().window().maximize(); 
    driver.get("http://someIP:8080/hmp_patient/index.html"); 

    //Click Add Medication button 
    WebElement addBtn = driver.findElement(By.id("add-btn")); 
    addBtn.click(); 

    //Verify Add Medication page has loaded successfully 
    WebElement rxBtn = driver.findElement(By.className("icon-rx")); 
    WebElement otcBtn = driver.findElement(By.className("icon-otc")); 
    WebElement herbBtn = driver.findElement(By.className("icon-herb")); 

    Assert.assertEquals(true, rxBtn.isDisplayed()); 
    Assert.assertEquals(true, otcBtn.isDisplayed()); 
    Assert.assertEquals(true, herbBtn.isDisplayed()); 

    driver.quit(); 

} 

@Test(groups = {"functionalTests.FF"}) 
public void test_AddMedication_FF() 
{ 
    addMedication("firefox"); 
} 
@Test(groups = {"functionalTests.iOS"}) 
public void test_AddMedication_iOS() 
{ 
    addMedication("iOS"); 
} 
} 

我跑了的testng.xml文件中的測試,並希望有瀏覽器不管測試是否通過,都關閉。

下面是我的Browser類:

public class Browser 
{ 
public WebDriver getDriver(String driverName) 
{ 
    WebDriver driver = null; 
    if(driverName == "firefox") 
    { 
     driver = new FirefoxDriver(); 
    } 
    else if(driverName == "chrome") 
    { 
     File chromeFile = new File ("C:/webdrivers/chromedriver.exe"); 
     System.setProperty("webdriver.chrome.driver", chromeFile.getAbsolutePath()); 
     driver = new ChromeDriver(); 
    } 
    else if(driverName == "ie") 
    { 
     File ieFile = new File("C:/webdrivers/IEDriverServer.exe"); 
     System.setProperty("webdriver.ie.driver", ieFile.getAbsolutePath()); 
     driver = new InternetExplorerDriver(); 
    } 
    else if(driverName == "iOS") 
    { 
     try 
     { 
      driver = new RemoteWebDriver(new URL("http://localhost:3001/wd/hub"), DesiredCapabilities.ipad()); 
     } catch (MalformedURLException e) 
     { 

      e.printStackTrace(); 
     } 
    } 


    return driver; 

} 
} 
+0

你把你的測試的編輯,你把JimEvans答案,所以編輯被拒絕。請在此處將其編輯爲您的問題。 –

+0

補給它,我以爲我有。 – DarthOpto

回答

5

你用什麼框架執行你的測試你沒有提到,但處理這將是使用「經過測試相當於一個方式「註釋來實現這一點。 JUnit將此註釋稱爲@After,而TestNG將其稱爲@AfterMethod。不管測試的通過/失敗狀態如何,使用後測試註釋標註的方法將在每個使用@Test註釋的方法之後運行。如果您希望使用整個的測試方法相同的驅動程序例如,大多數測試運行有@AfterClass註解或類似的,這將在類中的所有@Test方法結束時運行。

舉個例子,你會想要做類似如下(注意班上推廣driver變量的成員變量):

public class ClickAddMedication 
{ 
    // N.B. For this approach to work, you *must* have the "driver" 
    // variable here. Having it as a member variable of the class is 
    // what allows the addMedication() method to access it for manipulating 
    // the browser, and the tearDown() method to access it for closing 
    // the *same* *browser* *instance*. 
    WebDriver driver; 
    Browser browser = new Browser(); 

    public void addMedication(String driverName) 
    { 
     //Open Browser and navigate to page 
     driver = browser.getDriver(driverName); 
     driver.manage().window().maximize(); 
     driver.get("http://someIP:8080/hmp_patient/index.html"); 

     //Click Add Medication button 
     WebElement addBtn = driver.findElement(By.id("add-btn")); 
     addBtn.click(); 

     //Verify Add Medication page has loaded successfully 
     WebElement rxBtn = driver.findElement(By.className("icon-rx")); 
     WebElement otcBtn = driver.findElement(By.className("icon-otc")); 
     WebElement herbBtn = driver.findElement(By.className("icon-herb")); 

     Assert.assertEquals(true, rxBtn.isDisplayed()); 
     Assert.assertEquals(true, otcBtn.isDisplayed()); 
     Assert.assertEquals(true, herbBtn.isDisplayed()); 
    } 

    @AfterMethod 
    public void tearDown() 
    { 
     driver.quit(); 
    } 

    @Test(groups = {"functionalTests.FF"}) 
    public void test_AddMedication_FF() 
    { 
     addMedication("firefox"); 
    } 

    @Test(groups = {"functionalTests.iOS"}) 
    public void test_AddMedication_iOS() 
    { 
     addMedication("iOS"); 
    } 
} 
+0

謝謝我會給這個鏡頭。 – DarthOpto

+0

我在我的'@ Test'方法之後放置以下內容,並且瀏覽器仍然沒有關閉。這是Java與TestNG。 '@AfterTest \t公共無效closeDriver(字符串的DriverName) \t \t { \t \t webdriver的驅動= browser.getDriver(DRIVERNAME); \t \t driver.quit(); \t}' – DarthOpto

+0

根據上述,即使測試通過了'driver.quit()'不工作。 – DarthOpto

0

如果您使用Ruby和測試單元,你可能有這樣的事情 -

如果你是共享的多個測試的wedriver瀏覽器會話,只需要在最後

def self.shutdown 
    @driver.quit 
    assert_equal [], @verification_errors 
end 
關閉瀏覽器

或者如果你想每個測試

def teardown 
    @driver.quit 
    assert_equal [], @verification_errors 
end 
0

這之後關閉瀏覽器可能不容易解決,但我這樣做是解決方法的問題。

代替Try{}catch ...使用throwsthrows java.lang.AssertionError和catch塊退出瀏覽器,e.g:

public void testMethod() throws java.lang.AssertionError{ 

Assert.assertTrue(condition,Message); 
} 

catch(java.lang.AssertionError e){ 

e.printstactrace(); 

browser.quit(); 

Assert.fail(); 

} 
0

driver.close()應該爲你做的伎倆。或者設置一個布爾標誌,當測試失敗時,布爾標誌被設置爲true。

然後使用driver.close()或System.exit(1)應該可以工作!

如果您在上述解決方法中遇到問題,請告訴我。