2017-04-23 92 views
0

我正在使用Java中的WebDriver編寫測試套件。重要的是,測試是功能測試,而不是單元測試。通常,相同的測試用例將按不同的數據依次運行幾次 - 例如,爲每個應用程序使用不同名稱和組件的「創建應用程序」。Java,WebDriver,斷言/異常和UI狀態

測試用例executon路徑包含幾個對話框。在每個對話框中,都會發生錯誤(例如,「未找到組件」)。目前,我的代碼處理錯誤旁邊他們碰巧在那裏 - 例如:(這是一個簡化的例子不是一塊的生產代碼,它並沒有進行測試,所以請原諒微不足道的失誤)

WebElement component; 
try { 
    component = componentsDialog.findElement(By.xpath("@class='component' and @componentId = '" + componentId + "']")); 
} catch (NoSuchElementException nse) { 
    log.error("Component not found"); 
    driver.switchTo().activeElement().sendKeys(Keys.ESCAPE); 
    stoppedOnError = true; 
    return; 
} 
component.click(); 
WebElement buttonAdd = 
componentsDialog.findElement(By.className("addbutton")); 
buttonAdd.click(); 

這是對於錯誤處理來說不是很像Java。如果我將來選擇使用TestNG,可能很難融入TestNG。

但我不能就這麼離開這個測試用例一般NoSuchElementException異常處理程序。大多數時候,NoSuchElementException意味着UI已經改變(或者我在測試代碼中犯了一個錯誤)。在這種情況下,這意味着這個測試用例的特定配置是錯誤的。並且該配置由用戶設置。這是一個不同的錯誤,應該以不同的方式報告。

所以我可以只捕獲異常,並再多問,用正確的信息......但要注意的地方Escape鍵被按下的部分。我關閉組件選擇對話框,以便UI的狀態與組件選擇成功相同。在這個測試案例的其餘部分中,這個特定的對話框並沒有打開。那麼,異常處理程序(在測試用例方法或調用程序結束時)如何知道UI當前處於什麼狀態以及需要做什麼來恢復?

(自動檢測是可能的,但片狀,因爲這將依賴於檢測一些元件獨特爲每個可能的對話框的存在下)。

所以,我該怎麼辦在這裏,爲了使錯誤處理的立即執行流之外?在某處保留一些狀態跟蹤變量?這似乎很容易出錯。

我當然可以嘗試切換到頁面對象模型。這個模型讓我感覺非常重量級,要求增加一行代碼量,並且只有在許多不同的測試用例使用相同的控件時才能獲得回報。 (通常,在我的情況下,迄今爲止,不同的用例使用不同的UI元素,所以我不明白這個模型會如何回報)。

也許這個印象是錯誤的。但即使我使用模型,每個頁面都是不相關的對象 - 我怎麼知道當時哪個頁面實際上處於活動狀態?在另一個頁面處於活動狀態時調用頁面的方法只會導致無意義的異常(在沒有複雜的檢測邏輯的情況下)。

回答

0

如果我要寫這段代碼,我會這樣寫。

List<WebElement> component = componentsDialog.findElements(By.xpath("@class='component' and @componentId = '" + componentId + "']")); 
if (component.isEmpty()) 
{ 
    log.error("Component not found"); 
    driver.switchTo().activeElement().sendKeys(Keys.ESCAPE); 
    componentsDialog.findElement(By.className("addbutton")).click(); 
} 
else 
{ 
    component.get(0).click(); 
} 

您不需要(和IMO不應該)在這裏拋出任何異常。如果你看一下the docs它指出

findElement不應該被用來尋找不存在的元素,使用findElements(通過),並斷言零長度響應代替。

哦......和你有關頁面對象評論。它不應該需要額外的代碼......如果做得對,絕對不會有更多的數量級。它的功能是更好地組織,更好地重用代碼,減輕維護負擔等等。將所有的頁面或對話框代碼放到一個類中,當事情發生變化或需要修正錯誤時,更容易更新腳本。這將大大減少您的維護工作量。

+0

將findElement方法更改爲findElements – Grasshopper

+0

爲了讓您的示例與我的示例工作相同,我們需要將最後一行移到else塊中。請注意我的示例中的return語句。 –

+0

而在現實生活中,單擊添加按鈕不會結束測試用例。在測試用例中有幾個這樣的檢查,所以我最終會將它的最後一部分縮小很多。我使用return語句來避免這種情況。 –