Selenium:如何在使用TestNG Listener捕获异常后停止在@Test方法中执行子请求步骤?

时间:2018-06-01 11:20:46

标签: selenium testng webdrivereventlistener

我在Page Object Model和TestNG框架中使用PageFactory进行自动化。我在beforeFindBy中使用WebDriverEventListener方法来侦听元素的存在。当元素不存在时,抛出NoSuchElementException并使用try-catch块捕获异常。如何停止执行@Test方法中的剩余步骤。我不想在@Test方法中使用try-catch。我们非常感谢任何关于我的设计变化的建议。以下是我的设计。

LoginPage

    public class LoginPage {

        @FindBy(xpath = "//img[@src='/webres_5786257bd7c8a5.72130757/themes/default/images/login/logo.png']")
        WebElement loginLogo;

        public LoginPage(WebDriver driver, ExtentTest test) {
            this.driver = driver;
            PageFactory.initElements(driver, this);
            this.test = test;
        }

        public void verifyLoginPageLogo() throws IOException {
            Assert.assertTrue(loginLogo.isDisplayed());
            test.log(LogStatus.PASS, "Logo is displayed", takeScreenshot(driver, test));
        }
}

Listenter

public class CustomListeners extends TestListenerAdapter implements WebDriverEventListener {

    //All Implemented Methods

    public void beforeFindBy(By by, WebElement element, WebDriver driver) {
        try {
            driver.findElement(by);
        } catch (NoSuchElementException e) {
            System.out.println("Element " + by + "not found");
        }
    }
}

测试类

@Listeners(CustomListeners.class)
public class Test1 extends BaseTestSuite {

    LoginPage lp;
    TabMenu tm;

    @Test(priority = 0, testName = "Verify Login")
    public void login() throws Exception {
        lp = new LoginPage(driver, test);
        tm = new TabMenu(driver, test);
        driver.get(Constants.url);
        lp.verifyLoginPageLogo();  //Element not present here
        lp.setUserName("dmin");
        lp.setPassword("admin");
        lp.clickLoginBtn();
        tm.verifyTabMenu();
        tm.isCurrentTab("Dashboard");
    }
}

1 个答案:

答案 0 :(得分:1)

登录<label for="input">Value</label><br> <input type="number" id="input"><br> <button id="btnSubmit" onclick="submit()">Submit</button> <p id="p1">0</p> <p id="p2">0</p> <p id="p3">0</p>理想情况下不应包含断言代码。该代码应该在您的测试类中。此外,PageObject功能也应该在测试类中,而不是Extent

不需要PageObjecttestng listener。在PageObject中,如果将verifyLoginPageLogo()方法重构为下面的 -

webdrivereventlistener

在测试课中这样做 -

public boolean isLoginPageLogoDisplayed() throws IOException {
            //Write logic to check if element is displayed.    
            //Return false in case of exception etc
        }

如果抛出Assert.assertTrue(lp.isLoginPageLogoDisplayed()); ,则会自动跳过剩余的步骤。

还要看一下创建一个ArrertionError,它有实用的方法来检查存在,显示,查找元素等等。只需扩展它。