簡體   English   中英

如何對TestNG斷言錯誤和運行時異常使用單個catch塊

[英]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){
      ...   
    }

這是您的問題的答案:

您需要在這里解決很多事情,如下所示:

  1. 您已定義isElementPresent(WebElement element)以返回boolean但是在調用isElementPresent(element); 您根本沒有使用返回boolean狀態。 因此,我的目的是檢查for循環內的boolean狀態,然后繼續執行element.click();
  2. 這里的Assert.assertTrue的實現不正確,如Assert.assertTrue(isElementPresent(logoutBtn)); TestNG Assertions旨在驗證@Test結果。 這些結果是您和您的組織可能需要跟蹤的信息。 切勿在try塊中編寫Assertions ,僅是在Catch塊中Catch失敗斷言並將其強制轉換為狀態Pass
  3. 要了解try/catchAssertions之間的關系,您可以考慮查看此討論
  4. 在你的代碼試圖Assert存在Logout按鈕Assert.assertTrue(isElementPresent(logoutBtn)); 那不應該是斷言。 相反,您可以誘使ImplicitlyWaitExplicitWait使Logout按鈕可單擊。
  5. 現在,您要尋找的答案是Where and How do you implement Assertions? 肯定地, Assertions將被寫在try塊之外。 斷言可以應用於Page TitlePage Source或頁面上存在的任何Element 根據最佳實踐,有兩種方法可以實現斷言。 首先,斷言可以成為您的Test課程的一部分。 第二個,按照POM中的PageFactory,斷言應在單獨的包/類中處理。 您需要調用包含斷言的類的方法。
  6. 如果要添加任何斷言,可以在代碼中首先在打開預期的URL時添加,然后在登錄到Web應用程序中驗證“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM