[英]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.