【问题标题】:Selenium: How to stop execuing subsequest steps in @Test method after catching an exception using TestNG Listener?Selenium:如何在使用 TestNG 侦听器捕获异常后停止在 @Test 方法中执行后续步骤?
【发布时间】:2018-11-11 12:41:42
【问题描述】:

我正在研究页面对象模型中的 PageFactory 和自动化的 TestNG 框架。我在WebDriverEventListener 中使用beforeFindBy 方法来监听元素的存在。当一个元素不存在时,NoSuchElementException 被抛出,我使用try-catch 块捕获异常。如何停止执行 @Test 方法中的剩余步骤。我不想在我的@Test 方法中使用try-catch。任何关于我的设计更改的建议都非常感谢。下面是我的设计。

登录页面

    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));
        }
}

听众

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");
    }
}

【问题讨论】:

    标签: selenium testng webdrivereventlistener


    【解决方案1】:

    登录PageObject 理想情况下不应包含断言代码。该代码应该在您的测试类中。此外,Extent 功能也应该在测试类中,而不是 PageObject

    不需要testng listenerwebdrivereventlistener。在 PageObject 中,如果将 verifyLoginPageLogo() 方法重构到下面 -

    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,则自动跳过剩余的步骤。

    还考虑创建一个BasePageObject,它具有用于检查存在、显示、查找元素等的实用方法。只需扩展它即可。

    【讨论】:

    • 谢谢。 1)我的问题通过将Assertion 移动到测试类得到解决。我不知道为什么我需要移动 ExtentTest 来测试课程。它如何产生影响。你能提供任何例子吗? 2) 我使用Listeners 的原因是在执行findElement 语句之前不断检查元素是否存在,以避免NoSuchElementException。如果这不是必需的?为什么?
    • ExtentTest 不属于 pageobject,它给类一个不相关的双重目的。由于两个独立的区域,可以更改现在类的设计反模式。 ExtentTest 报告的创建对于一个测试用例来说是唯一的,但是一个页面对象可能被不同的测试用例使用。 ExtentTest 属于 Test 类,因为使用设置和拆卸的配置方法可以更有效地对其进行管理。
    • 为避免 NoSuchElementException 使用带有 WebDriverWait 的 ExpectedCondition。使用您当前的方法,您会通过两次查找每个元素来减慢测试速度。如果网站需要不断检查每个元素,您应该使用隐式等待。同样,在您当前的侦听器实现中,您将该类用作 testng 侦听器和 webdrivereventlistener,将出现与上述相同的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    相关资源
    最近更新 更多