[英]How to use a single catch block for both TestNG assertion errors and RunTime exceptions
我將嘗試提供盡可能多的信息。 我在Java中使用TestNG框架。+ Selenium下面是我編寫的2個自定義方法。
// Checks if a WebElement is present on the screen
public boolean isElementPresent(WebElement element) {
try {
element.isDisplayed();
return true;
} catch (RuntimeException e) {
return false;`
}
}
// Used to click on the desired element
public void clickWebElement(WebElement element) {
isElementPresent(element);
element.click();
}
protected void enterDataintoField(WebElement element,String fieldData) {
isElementPresent(element);
element.click();
element.clear();
element.sendKeys(fieldData);
}
現在,假設有一個鏈接說“登錄”。 單擊登錄將打開一個包含兩個字段用戶名和密碼的頁面。以下代碼用於登錄。(登錄名,用戶名,密碼和注銷Btn是webElements)
public void login(String username, String password)
{
try{
clickWebElement(Login);
//pause few seconds for page load
enterDataintoField(username, "Adam");
enterDataintoField(password, "mypassword");
//pause few seconds to login
Assert.assertTrue(isElementPresent(logoutBtn));
}catch({**ErrorType**} e){
//Some code here
}
}
現在是我的問題。 如果在上面的catch塊中將ErrorType設置為RuntimeException ,則萬一出現任何問題,例如未顯示用戶名字段或缺少登錄按鈕,則此catch塊將能夠捕獲該問題。 但是此catch塊將無法捕獲上面的Assert語句,該語句可驗證登錄是否成功。
同樣,如果我在上面使用AssertionError ,則catch塊將能夠捕獲斷言失敗但無法捕獲任何其他問題的方案。 因此,我需要一些關於在這里可以做什么的建議。 我有數千行代碼,因此我不想在任何地方都使用RuntimeException和AssertionError catch塊 (如2個catch塊。我想要一個catch塊)
任何其他建議或最佳做法將不勝感激。
您的catch塊僅捕獲擴展了java.lang.Exception
Throwable對象,而AssertionError
是一個錯誤(因為它擴展了java.lang.Error),但是,如果您確實想在catch塊中捕獲AssertionError
您需要使用以下catch塊語法:
catch (AssertionError e) { ... }
因此,這意味着您無法在同一個catch塊中同時處理異常和錯誤。 但是您可以做的是嘗試並使用兩個單獨的catch塊,一個用於處理異常,另一個用於處理錯誤,如下所示:
try{
}catch(Exception e){
...
}
catch(AssertionError e){
...
}
這是您的問題的答案:
您需要在這里解決很多事情,如下所示:
isElementPresent(WebElement element)
以返回boolean
但是在調用isElementPresent(element);
您根本沒有使用返回boolean
狀態。 因此,我的目的是檢查for
循環內的boolean
狀態,然后繼續執行element.click();
Assert.assertTrue
的實現不正確,如Assert.assertTrue(isElementPresent(logoutBtn));
。 TestNG
Assertions
旨在驗證@Test
結果。 這些結果是您和您的組織可能需要跟蹤的信息。 切勿在try
塊中編寫Assertions
,僅是在Catch
塊中Catch
失敗斷言並將其強制轉換為狀態Pass
。 try/catch
和Assertions
之間的關系,您可以考慮查看此討論 。 Assert
存在Logout
按鈕Assert.assertTrue(isElementPresent(logoutBtn));
。 那不應該是斷言。 相反,您可以誘使ImplicitlyWait
或ExplicitWait
使Logout
按鈕可單擊。 Where and How do you implement Assertions?
肯定地, Assertions
將被寫在try
塊之外。 斷言可以應用於Page Title
, Page Source
或頁面上存在的任何Element
。 根據最佳實踐,有兩種方法可以實現斷言。 首先,斷言可以成為您的Test
課程的一部分。 第二個,按照POM中的PageFactory,斷言應在單獨的包/類中處理。 您需要調用包含斷言的類的方法。 Page Title
后再添加一個斷言。 讓我知道這是否回答了您的問題。
所有這些斷言/驗證和等待相關的實現都應該由底層自動化框架提供。 您可以使用可用的高效自動化框架之一,例如QAF 。 您的實現可能如下所示:
// Checks if a WebElement is present on the screen
element.isPresent()
// verify WebElement is present on the screen
element.verifyPresent()
// assert WebElement is present on the screen
element.assertPresent()
//actions and other element methods no need to wait
element.click();
它還具有您可以使用的預定義步驟庫 。 在這種情況下,您的登錄名可能如下所示:
public void login(String username, String pwd){
//loc provided in locator file
sendKeys(username, "username.txt.loc");
sendKeys(text, "password.txt.loc");
click("login.btn.loc");
}
如果您想使用BDD
When send keys 'my text' to 'username.loc'
And send keys 'my text' to 'password.loc'
And click on 'login.loc'
They verify 'welcome.msg.loc' is present
您可以參考Qaf逐步指南
弄清楚我需要做什么。 我寫了一個自定義的assert方法:
public void myAssertTrue(Boolean condition){
try {
Assert.assertTrue(condition);
} catch (AssertionError e) {
e.printStackTrace();
throw new RuntimeException();
}
}
修改了isElementPresent方法:
// Checks if a WebElement is present on the screen
public void isElementPresent(WebElement element) {
try {
element.isDisplayed();
} catch (RuntimeException e) {
throw e;
}
}
通過這兩個更改,我可以使用RuntimeException catch塊來捕獲運行時和assetionErrors
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.