Java SeleniumWebDriver:如何在同一窗口中一个接一个地运行多个测试?
我的目标是让一系列测试一个接一个地运行。我希望有一个“登录”脚本让用户登录,然后在同一窗口/驱动程序中继续执行以下脚本。我使用的是TestNG,所以我的测试套件设置在TestNG.xml文件中(如果有帮助的话)Java SeleniumWebDriver:如何在同一窗口中一个接一个地运行多个测试?,java,selenium,webdriver,testng,Java,Selenium,Webdriver,Testng,我的目标是让一系列测试一个接一个地运行。我希望有一个“登录”脚本让用户登录,然后在同一窗口/驱动程序中继续执行以下脚本。我使用的是TestNG,所以我的测试套件设置在TestNG.xml文件中(如果有帮助的话) public class LoginScript { String username, password, siteid; private WebDriver driver; private boolean acceptNextAlert = true; private StringBu
public class LoginScript {
String username, password, siteid;
private WebDriver driver;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
static Logger log = Logger.getLogger(LoginScript.class);
@BeforeSuite (alwaysRun=true)
@Parameters({ "url","username","password","site" })
public void setUp(String env, String user, String pwd, String ste) throws Exception {
username=user;
password=pwd;
siteid=ste;
driver = new FirefoxDriver();
driver.get(env);
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@Test
public void testLoginScript() throws Exception {
//Maximize window
driver.manage().window().maximize();
//Login
driver.findElement(By.id("TBSiteID")).clear();
driver.findElement(By.id("TBSiteID")).sendKeys(siteid);
driver.findElement(By.id("TBUserName")).clear();
driver.findElement(By.id("TBUserName")).sendKeys(username);
driver.findElement(By.name("TBPassword")).clear();
driver.findElement(By.name("TBPassword")).sendKeys(password);
driver.findElement(By.name("Login")).click();
Thread.sleep(2000);
log.info("Found requested site");
}
@AfterSuite
public void tearDown() throws Exception {
//driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
private boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
private String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
}
我要运行的下一个脚本:
public class AddNormalEE {
String username, password, siteid;
private WebDriver driver;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
static Logger log = Logger.getLogger(AddNormalEE.class);
@BeforeSuite (alwaysRun=true)
@Parameters({ "url","username","password","site" })
public void setUp(String env, String user, String pwd, String ste) throws Exception {
username=user;
password=pwd;
siteid=ste;
//driver = new FirefoxDriver();
//driver.get(env);
//driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@Test
public void testAddNormalEE() throws Exception {
//Maximize window
//driver.manage().window().maximize();
@AfterSuite
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
private boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
private String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
}
Selenium人编写测试的通常方式是为每个测试类打开一个单独的浏览器,这就是“Selenium网格”的设计工作方式。我通常在每个测试班上放一个测试方法。如果您希望每个类有多个测试方法,并且您测试的应用程序不关心您运行这些方法的顺序,那么理论上您可以在单个浏览器上运行这些多个测试方法。我以前做过,但根据我的经验,用这种模式设计Selenium测试不是一个好主意,所以你可以这样做,但我建议不要这样做
例如,对于每个测试类一个测试方法,在@BeforeMethod中可以实例化WebDriver浏览器实例,然后在@AfterMethod中可以杀死它。对于每个类有多个测试,您必须使用@BeforeTest和@AfterTest,这是可以做到的,但您的结果可能会因您的谨慎程度而异。如果您的测试是依赖的,您可以将它们放在同一个类中,并在method2上定义DependesOnMethod={method1},这样顺序就不一样了。如果是在不同的类之间,可以考虑从LogiScript类扩展AdQualEube类。 要在同一浏览器中运行测试,驱动程序实例需要在类之间共享,或者在所有@tests中都必须相同。要么使它静态,要么考虑有线程本地驱动程序变量,以防您计划在某一天并行运行。 在上述情况下,如果需要避免静态,还可以在loginScript中使用getDriver()方法将驱动程序对象返回给AddNormalEE类
一般来说,最好进行独立测试。您可以利用并行运行来克服独立测试的时间问题。使登录成为一种方法,而不是一种测试,因为我们不会根据上面的代码断言任何行为。如果我正在测试登录,我将有单独的测试,只测试登录功能。我不太清楚您的问题。如果您想在测试中使用相同的驱动程序对象,那么创建一个静态驱动程序对象,并将其传递给测试方法,而不是杀死它。或者我遗漏了什么。测试类中的每个测试都应该使用新的浏览器会话执行测试,这可以通过将浏览器调用和kill进程放在基本测试类中并在每个测试类中扩展该类来轻松完成。我不确定是否应该使用一个java文件,其中包含所有测试,每个都用@Test表示,并按顺序运行它们,或者如果我应该有一堆java文件,则每个测试专用一个。每个测试都有一个文件的问题是,据我所知,testng无法按顺序启动java文件,而不是同时启动。testng能够强制执行顺序。如果您有一个定义测试的testng.xml文件,如果您在该测试集中设置了“preserve order”标志,那么您在该测试集中定义的所有测试类都将按顺序执行。这只会按顺序运行测试方法。如果定义了两个类,它将运行浏览器的两个实例。每班一个,为什么?请给出一个理由