繁体   English   中英

assertTrue之后Java Selenium关闭浏览器

[英]Java Selenium close browser after assertTrue

我有很多类的代码。
有一个类可以创建驱动程序-

public class DriverDelegate {

    private String baseURL = "someLink";
    private WebDriver driver;
    private WebDriverWait wait;

    DriverDelegate(String url) {
        System.setProperty("webdriver.chrome.driver", "${directory}");
        driver = new ChromeDriver();
        driver.get(baseURL + url);
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        wait = new WebDriverWait(driver, 5);
    }

    public WebDriver getDriver() {
        return driver;
    }

我为每个测试创建新的驱动程序。 而且我的大部分行都是这样包含assertTrue的行-

public class UserInterfaceTests extends BaseTest{


    @Test
    public void headerClicker() throws java.lang.Exception {

        //Startup
        DriverDelegate driverDelegate = new DriverDelegate("url");
        WebDriver driver = driverDelegate.getDriver();

        //Some random assertTrue
        assertTrue("Test(HeaderClicker) - NoSuchElementException click", TestHelper.headerClicker(schedule, driver));

        //I hope that it is not neccessary to put up all helper classes like TestHelper or BaseTest

现在,我从名为Startup的类中启动测试-

public class Startup{
    @Test
    public void HeaderClicker() throws Exception{ UserInterfaceTests UI = new UserInterfaceTests(); UI.headerClicker();}

我的问题是在assertTrue失败后如何关闭浏览器。 诸如@ AfterTest,@ AfterSuite等之类的东西不起作用,因为其他方法不能使用测试中使用的同一驱动程序。
有任何想法吗?

好的,我想在这里谈几件事。 首先,@ shutdown -h现在在他们的评论中是正确的,您不应该以编程方式创建测试类并自己运行其@Test方法。 让测试运行框架处理该问题(例如TestNG,JUnit等)。

不过,实际问题的关键在于,您想要预测试和后测试方法来处理在实际测试方法之前和/或之后发生的行为。 但是,要使这些工作正常进行,您需要让测试框架处理测试的运行。 您提到@AfterTest@AfterSuite对于您的用例@AfterSuite是不正确的,尽管并非出于您完全指定的原因。 TestNG中的@AfterTest仅在套件中指定的<test>节点内的所有类中的所有测试方法之后执行一次。 @AfterSuite在整个套件中的所有测试方法之后仅执行一次。 您正在寻找的是@AfterMethod批注。

例:

public class FooTest {

    private DriverDelegate driver;

    @BeforeMethod
    public void setup() {
        try {
            driver = new DriverDelegate("url");
        } catch (Exception ignore) { }
    }

    @AfterMethod
    public void tearDown() {
        try {
            driver.quit();
        } catch (Exception ignore) { }
        driver = null;
    }

    @Test
    public void foo() {
        // do test stuff
    }
}

在上面的代码中,当TestNG运行此测试类时,此类中用@Test注释的每个方法将具有一个对应的@BeforeMethod执行(用于初始化驱动程序)和一个@AfterMethod用于在测试失败的情况下关闭该驱动程序)。 关于使用TestNG进行这种设置的几点要点:

(1)TestNG不会创建测试类的单独实例,因此,如果您将状态保存在类对象上,则您将无法在一个类内并行运行测试方法,因为您将有多个方法尝试创建新的驱动程序并将其保存到相同的变量,破坏正在运行的其他测试的状态。 可以使用每个类的并行模式运行(例如,有5个线程,每个线程同时运行一个单独的测试类)。

(2)为什么将@BeforeMethod@AfterMethod主体包装在try-catch块中? 由于TestNG在配置方法异常方面很快会失败,并且可能导致其他尚未运行的测试被跳过,因此您需要处理可能会失败的任何代码。 通过包装Web驱动程序的创建和关闭,您可以忽略该错误并继续运行其他测试。 例如,如果驱动程序创建失败,则driver变量将为null,该@Test方法将失败,但其他方法可能会成功。 理想情况下,您可能应该对异常进行一些日志记录,以便例如调查驱动程序创建失败的原因

另外,如果需要在许多测试类中使用驱动程序,则可以创建一个基类,该基类在每个方法之后创建驱动程序并关闭该驱动程序,并让您的测试类对此进行扩展。 如果您的类的方法带有@Test注释,它将在该测试类以及所有超类上运行任何@BeforeMethod方法。 可以保证类之间方法的顺序(尽管如果同一类中有多个@BeforeMethod方法,则不能保证顺序)。

public abstract class A {
    @BeforeMethod
    public void setupA() { }
}

public class B extends A {
    @BeforeMethod
    public void setupB() { }

    @Test
    public void foo() { }
}

在上面的代码中,运行foo时,它将先运行setupA ,然后运行setupB After方法的工作方式相同,但顺序相反。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM