Закрытие Браузера После Неудачного Теста
Я запускаю тесты с 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) должно работать !!
Дайте мне знать, если у вас возникли проблемы с вышеуказанным обходным путем.