2013-08-29 32 views
0

有人可以推薦使用testng在@AfterClass中'tearDown'的最佳方法嗎?我偶爾會看到掛起的窗口或彈出窗口,無法返回主頁以優雅地註銷下一課,以啓動並避免模態對話框錯誤。用Selenium和Java重置TestNG中瀏覽器狀態的最佳方法

我試着在主頁上得到一個窗口句柄,然後在彈出窗口中,然後把switchTo放在我的@AfterClass中,但它不起作用。我也試過driver.close()。但是接下來的課程將被跳過,導致無法訪問的瀏覽器錯誤。

我真的需要一個好的tearDown @AfterClass方法,它可以擺脫頁面上的任何錯誤和彈出窗口,並且只需在登錄頁面上留下一個乾淨的瀏覽器窗口,以便運行下一個測試類。

編輯:添加代碼:

package TestPackage; 

import org.openqa.selenium.JavascriptExecutor; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.testng.Assert; 
import org.testng.annotations.*; 
import org.testng.annotations.Test;  

//@Test (priority = 1) 
public class test1 { 
    public static WebDriver driver = new FirefoxDriver(); 
    Environment environment = Environment.QA03(); 
    User testUser = User.ns_system(); 
    AxUtilities axUtilities; 

    @BeforeClass 
    @Parameters("environment") 
    @Test 
    public void login(String environment1){ 

//  environment = new Environment(environment1); 
     axUtilities = new DAxUtilities(environment1, driver); 
//  DAxUtilities dAxUtilities = new DAxUtilities(environment); 
     Login login = new Login(); 
     login.getLogin(testUser, axUtilities, driver); 
     axUtilities.sleep(5000); 
    } 

    @Test 
    public void testNothing(){ 
     String s = "public void testNothing() reached..."; 
     System.out.println(s); 
    } 


    @AfterClass 
    public void verifyOKAndLogout() { 

     driver.quit(); 
//  DAxUtilities dAxUtilities; 

    } 

} 

測試類1和2是除了類名相同......

而且測試是從XML文件中運行。我已經試過的XML文件的許多變種,即使將每個測試在其自己的XML文件:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 

<suite name="TestSuite1" verbose="1"> 
    <parameter name="environment" value="QA03"/> 

<test name="Test1"> 
    <classes> 
     <class name="TestPackage.test1"/> 
     <!--<class name="TestPackage.test2"/>--> 
    </classes> 
</test> 
<test name="Test2"> 
    <classes> 
     <class name="TestPackage.test2"/> 
    </classes> 
</test> 

</suite> 

但總有兩個捲筒紙驅動器生成,一個接一個的權利,在測試的開始在執行任何其他代碼之前運行。斷點顯示代碼在運行第1類測試之前肯定從第1類的開始跳到第2類的開始...

回答

2

從你寫的東西看來,你似乎是在整個測試套件之前創建瀏覽器(實例化WebDriver),然後使用相同的瀏覽器實例執行所有測試。雖然它的執行時間更快,但它也引入了像現在這樣的問題。

我會建議在執行每個測試類(甚至測試方法)之前創建瀏覽器的新實例。在這種情況下,您可以在您的@AfterClass方法中安全地使用driver.quit()。每次測試重新啓動瀏覽器將使您的測試更加穩定。在你新添加的代碼

  • 你webdriver的實例的方式

    編輯評論是不正確的。如果你有幾個 測試類,你將最終執行任何測試

  • 你註釋一個方法既@Test和@BeforeClass之前打開多個瀏覽器窗口 - 這將導致連續
  • 執行兩次的方法

應該(或多或少)看起來就像是

public class MyTest { 
    protected WebDriver driver; 

    @BeforeClass //I would even suggest to use @BeforeMethod but that's up to you 
    public void setUp() { 
     driver = new FirefoxDriver(); 
     //other instantiations and assignments if necessary 
    } 

    @Test 
    public void login() { 
     driver.get("http://watever.com"); 
     //do whatever 
    } 

    @Test 
    public void someOtherTest() { 
     //do something else 
    } 

    @AfterClass //or @AfterMethod 
    public void tearDown() { 
     driver.quit(); 
    } 
} 
+1

我全心全意同意,測試間共享瀏覽器會導致不可靠,不穩定和不可用測試 –

+0

其實我試圖按照你描述的方式運行我的測試,但它不起作用。 TestNG正在從一個類跳到另一個類並摧毀我的驅動程序初始化。請參閱我的其他帖子在這裏:http://stackoverflow.com/questions/18516227/testng-is-running-classes-out-of-order-skipping-between-classes-of-tests –

+0

我應該澄清,當我跑driver.quit()在一個類中,在@AfterClass中,那麼我的下一個類將不會運行。即使一個新的webdriver被初始化在最上面。它將被跳過。它會拋出無法訪問的瀏覽器錯誤。 Testng初始化class1的webdriver,然後立即跳到class2並初始化class2的webdriver(yes,really!),然後跳回到class 1並開始運行測試。我無法在class1的末尾執行driver.close(),因爲class2的驅動程序初始化已經運行得太快,並且在實際需要時不會再運行。我希望這是明確的... –

0

我相信調用driver.close()driver.quit(),然後創建一個新的WebDriver併爲其分配它給你的司機應該做的伎倆。您可能想要調用相同的函數在課程的開始和結束時創建驅動程序。

0

使用

@tearDown{ 
driver.quit(); 

} 
方式

它將關閉所有由測試類打開的窗口。

並在接下來的類中創建的webdriver()的新實例如下圖所示

Webdriver driver = new FireFoxDriver(); //或其它驅動程序

相關問題