2012-10-03 98 views
3

運行Selenium WebDriver測試用例時,我想要一致的輸出。如何在運行Selenium Webdriver(Java)測試用例時獲得一致的結果?

我在一個java類中有超過30個測試用例。當我運行它時,我收到了不同方法中的錯誤。例如。有時它會在第12次測試中失敗,第8次中某些時候,第2次中某些時候會失敗,有時候所有的都沒有任何錯誤地運行。我確定所有的測試案例都是正確的。

它測試非常快。我認爲這將是問題。所以我添加

new FireFoxDriver().manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 

即使它並不一致

誰能幫助我儘快?

+1

好的,第一件事情:自動化UI集成測試很麻煩,而且不可靠,但重點是幫助完成手動測試。接受*現在*,UI測試非常非常不可靠。關鍵是讓它們儘可能可靠*。接下來的事情:這可能是出於任何原因。試過ChromeDriver?你有沒有嘗試過放入Thread.Sleep? (或者相當於Java?)。頁面有時需要一段時間才能加載?你使用的是什麼樣的選擇器?它通常落在XPath選擇器上嗎?什麼?他們複雜嗎?你有沒有嘗試用簡單的選擇器進行測試? – Arran

+0

如果您提供有關您收到的錯誤的信息,可能會幫助我們回答問題。如果錯誤每次都不一樣,請舉例說明。這聽起來像你認爲這個問題可能是由於時機。如果是這樣,還包括來自測試用例失敗的代碼。 –

回答

11

我會強烈反對Arran的聲明,即UI測試非常不可靠。它絕對不一定是。學習兩個主要問題的可靠方法通常可以解決很多問題。

間歇性故障最常見的原因是動態內容或定位器的同步問題,這些問題不夠靈活,無法處理變化的條件。

例如,您從網格/表格中提取一行,並且您的定位器是基於位置的。 (第3行,第5單元格)排序順序在一次運行中不同,因此測試中斷。某些服務器端技術(如ASP.NET)會生成可能會有所不同的動態ID,所以這是另一個問題。

我鼓勵你仔細評估你的定位器/選擇器,看看它們是否健壯。避免使用硬連線的xpath,儘可能使用ID,但要確保它們不是動態ID,並且如果它們恰當地處理它們。

你提到你已經嘗試過使用隱式等待。確保你瞭解隱式和顯式等待之間的區別。 (閱讀更多內容here in Selenium docs。)您可能需要明確地等待腳本中後續步驟的確切條件。不要,重複不要在測試中使用Thread.Sleep或類似的手動延遲,除非特殊情況。 WebDriver的Wait是一個更好的方法。

+1

謝謝,阿蘭!我不是說自動化很容易 - 相反。但是在困難的環境中,我獲得了很好的運氣,可以獲得穩定的高價值自動化工作。 –

+0

對於XPath評論爲+1。生成的XPath是最糟糕的選擇器 –

1

我最好的答案是添加「可靠性和恢復代碼」。例如,也許你的測試試圖點擊一些東西,但隨機的webelement不管出於什麼原因都是陳舊的。因此添加捕獲StaleElementExceptions的代碼並在失敗之​​前重試最多5次。

或者,也許有時候,頁面加載速度有點太慢,並且在Selenium認爲完成之前內容還沒有更新(AJAX功能)。這會導致檢查失敗,但在查看屏幕截圖時,頁面實際上是正確的,因爲這一切發生時間不到0.2秒。因此,在使用斷言調用之前添加一個等待內容更新的硒等待。

這實際上給你更可靠的結果,因爲你的測試代碼現在知道如何處理常見的情況與硒框架。

希望這會有所幫助!

1

我發現Selenium測試經常失敗,因爲頁面元素沒有正確加載,即使您已經設置了隱式等待,也可以使用。如果一次測試在同一時間點失敗,這對我來說很有用。試試這個(我的代碼是C#,但你可以在其他語言中做到這一點):

在測試初始化​​設置等待:

globalWait =新WebDriverWait(驅動程序,TimeSpan.FromSeconds(20));

然後在加載一個麻煩的頁面時調用wait: globalWait.Until(ExpectedConditions.ElementIsVisible(By.Id(「myPageElement」)));

這強制等待,直到元素可見。它爲我解決了很多問題。通常我將id設置爲頁腳元素,或者如果它是AJAX頁面,則返回AJAX檢索的元素之一。這確保頁面已正確加載。

另一種方法是編寫登錄和註銷一個共同的套路,如果你正在做大量的複雜的測試,登錄,做一些測試,註銷,然後登錄並做一些更多的測試。這似乎導致Selenium中虛假錯誤更少。

我的C#登錄程序:

private void Login() 
{ 
    driver.Navigate().GoToUrl(base_url + "/login"); 
    globalWait.Until(ExpectedConditions.ElementIsVisible(By.Id("username"))); 
    driver.FindElement(By.Id("username")).SendKeys(username); 
    // clear IE password autocomplete 
    driver.FindElement(By.Id("password")).Clear(); 
    driver.FindElement(By.Id("password")).SendKeys(password); 
    driver.FindElement(By.Id("btn_login")).Click(); 
} 

我的註銷程序:

private void LogOut() 
{ 
    driver.FindElement(By.Id("lnkMenuLogout")).Click(); 
} 

測試使用它們:

[TestMethod] 
public void EditAccount() 
{ 
    Login(); 

    // navigate to account page 
    driver.FindElement(By.Id("ulMenu")).FindElement(By.Id("lnkMenuAccount")).Click(); 
    Assert.IsTrue(driver.FindElement(By.Id("headName")).Displayed, "Player name not displayed"); 

    string playerChangeName = "Test" + DateTime.Now.ToString("yyyyMMddHHmmss"); 

    driver.FindElement(By.Id("butEditName")).Click(); 
    driver.FindElement(By.Id("surname")).Clear(); 
    driver.FindElement(By.Id("surname")).SendKeys(playerChangeName); 
    driver.FindElement(By.Id("butSaveName")).Click(); 
    driver.Navigate().Refresh(); 

    // check that edit worked 
    Assert.IsTrue(driver.FindElement(By.Id("headName")).Displayed, "Player name not displayed after change"); 
    IWebElement element = driver.FindElement(By.Id("headName")); 
    string playerName = element.Text; 
    StringAssert.Contains(playerName,playerChangeName,"Player name has not been changed"); 

    LogOut(); 
} 

我最後的結論是,雖然目前,硒仍然是有點'flakey'。我目前正在試驗PhantomJS,但似乎沒有更好的。硒是我們擁有的最好的。

相關問題