Закрытие Браузера После Неудачного Теста

Я запускаю тесты с WebDriver, когда тест терпит неудачу, браузер не закрывается. На машине с Windows это огромная проблема, потому что у меня есть несколько экземпляров IEDriver, все еще работающих в фоновом режиме.

я попробовал оператор try/catch, который, похоже, тоже не работает. Если тест не удался, браузер остается открытым. Любая помощь будет очень признательна.

оператор try catch выглядит примерно так это:

try
{
   Assert.something(something something dark side);
   driver.quit();
}
catch(Exception e)
{
   System.out.println(e)
   driver.quit();
}

мой полный код ниже:

public class ClickAddMedication 
{
Browser browser = new Browser();

public void addMedication(String driverName)
{
    //Open Browser and navigate to page
    WebDriver driver = browser.getDriver(driverName);
    driver.manage().window().maximize();
    driver.get("http://someIP:8080/hmp_patient/index.html");

    //Click Add Medication button
    WebElement addBtn = driver.findElement(By.id("add-btn"));
    addBtn.click();

    //Verify Add Medication page has loaded successfully
    WebElement rxBtn = driver.findElement(By.className("icon-rx"));
    WebElement otcBtn = driver.findElement(By.className("icon-otc"));
    WebElement herbBtn = driver.findElement(By.className("icon-herb"));

    Assert.assertEquals(true, rxBtn.isDisplayed());
    Assert.assertEquals(true, otcBtn.isDisplayed());
    Assert.assertEquals(true, herbBtn.isDisplayed());

    driver.quit();

}

@Test(groups = {"functionalTests.FF"})
public void test_AddMedication_FF()
{
    addMedication("firefox"); 
}
@Test(groups = {"functionalTests.iOS"})
public void test_AddMedication_iOS()
{
    addMedication("iOS");
}
}

Я запускаю тесты с помощью testng.xml-файл и хотел бы закрыть браузер независимо от того, проходит ли тест или нет.

ниже Browser класс:

public class Browser 
{
public WebDriver getDriver(String driverName)
{
    WebDriver driver = null;
    if(driverName == "firefox")
    {
        driver = new FirefoxDriver();
    }
    else if(driverName == "chrome")
    {
        File chromeFile = new File ("C:/webdrivers/chromedriver.exe");
        System.setProperty("webdriver.chrome.driver", chromeFile.getAbsolutePath());
        driver = new ChromeDriver();
    }
    else if(driverName == "ie")
    {
        File ieFile = new File("C:/webdrivers/IEDriverServer.exe");
        System.setProperty("webdriver.ie.driver", ieFile.getAbsolutePath());
        driver = new InternetExplorerDriver();
    }
    else if(driverName == "iOS")
    {
        try 
        {
            driver = new RemoteWebDriver(new URL("http://localhost:3001/wd/hub"), DesiredCapabilities.ipad());
        } catch (MalformedURLException e) 
        {

            e.printStackTrace();
        }
    }


    return driver;

}
}

4 ответов


вы не упомянули, какую структуру вы используете для выполнения своих тестов, но один из способов справиться с этим-использовать эквивалент аннотации "после теста" для выполнения этого. JUnit называет эту аннотацию @After в то время как TestNG называет его @AfterMethod. Метод, аннотированный аннотацией after test, будет выполняться после каждого метода, аннотированного @Test, независимо от состояния pass/fail теста. Если вы ожидаете использовать один и тот же экземпляр драйвера для методов тестирования, большинство тестов бегуны имеют @AfterClass аннотации или аналогичные, которые будут работать в конце всех @Test методы в классе.

в качестве примера, вы хотите сделать что-то вроде следующего (обратите внимание на продвижение driver переменная для переменной-члена в классе):

public class ClickAddMedication 
{
    // N.B. For this approach to work, you *must* have the "driver"
    // variable here. Having it as a member variable of the class is
    // what allows the addMedication() method to access it for manipulating
    // the browser, and the tearDown() method to access it for closing
    // the *same* *browser* *instance*.
    WebDriver driver;
    Browser browser = new Browser();

    public void addMedication(String driverName)
    {
        //Open Browser and navigate to page
        driver = browser.getDriver(driverName);
        driver.manage().window().maximize();
        driver.get("http://someIP:8080/hmp_patient/index.html");

        //Click Add Medication button
        WebElement addBtn = driver.findElement(By.id("add-btn"));
        addBtn.click();

        //Verify Add Medication page has loaded successfully
        WebElement rxBtn = driver.findElement(By.className("icon-rx"));
        WebElement otcBtn = driver.findElement(By.className("icon-otc"));
        WebElement herbBtn = driver.findElement(By.className("icon-herb"));

        Assert.assertEquals(true, rxBtn.isDisplayed());
        Assert.assertEquals(true, otcBtn.isDisplayed());
        Assert.assertEquals(true, herbBtn.isDisplayed());
    }

    @AfterMethod
    public void tearDown()
    {
        driver.quit();
    }

    @Test(groups = {"functionalTests.FF"})
    public void test_AddMedication_FF()
    {
        addMedication("firefox"); 
    }

    @Test(groups = {"functionalTests.iOS"})
    public void test_AddMedication_iOS()
    {
        addMedication("iOS");
    }
}

Если вы используете Ruby и Test Unit, у вас может быть что-то вроде этого -

Если вы используете сеанс браузера wedriver для нескольких тестов и вам нужно закрыть браузер только в конце

def self.shutdown
    @driver.quit
    assert_equal [], @verification_errors
end

или если вы хотите закрыть браузер после каждого отдельного теста

def teardown
    @driver.quit
    assert_equal [], @verification_errors
end

это может быть не подходящее решение, но я сделал это как обходной путь для проблемы.

вместо Try{}catch... использовать throws: throws java.lang.AssertionError и выйти из браузера в блоке catch, e.g:

public void testMethod() throws java.lang.AssertionError{

Assert.assertTrue(condition,Message);
}

catch(java.lang.AssertionError e){

e.printstactrace();

browser.quit();

Assert.fail();

}

драйвер.close() должен сделать трюк для вас. Или установка логического флага, и когда тест завершается неудачно, логический флаг имеет значение true.

а затем с помощью драйвера.закрыть() или System.выход(1) должно работать !!

Дайте мне знать, если у вас возникли проблемы с вышеуказанным обходным путем.