簡體   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