Selenium Webdriver:如何在同一个窗口中一个接一个地运行多个测试?

时间:2014-12-09 21:13:27

标签: java selenium webdriver testng

我的目标是让一系列测试一个接一个地运行。我想要一个"登录"脚本将用户登录,然后在同一窗口/驱动程序中继续执行以下脚本。我使用的是TestNG,所以如果有帮助,我的测试套件会在testng.xml文件中设置。

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;
}
 }
}  

4 个答案:

答案 0 :(得分:1)

如果您的测试是依赖的,您可以将它们放在同一个类中,并在method2上定义dependsOnMethod = {method1},以便修改订单。如果它位于不同的类之间,您可以考虑从LoginScript类扩展AddNormalEE类。

要在同一浏览器中运行测试,您的驱动程序实例需要在您的类之间共享,或者在所有@Tests中必须相同。要么让它静态,要么考虑有一个threadlocal webdriver变量,以防你计划有一天平行运行。 在上面的例子中,您还可以在loginScript中使用getDriver()方法,如果需要避免静态,则将驱动程序对象返回给AddNormalEE类。

作为一般惯例,最好进行独立测试。您可以使用并行运行来克服独立测试的时间问题。将登录作为方法而不是测试,因为我们没有按照上面的代码断言任何行为。如果我正在测试登录,我会有单独的测试来测试登录功能。

答案 1 :(得分:0)

Selenium人员编写测试的常用方法是为每个测试类打开一个单独的浏览器,这类似于" Selenium Grid"旨在运作。我通常为每个测试类放一个测试方法。如果您希望每个类有多个测试方法,并且您的测试不关心运行这些方法的顺序,那么理论上您可以在单个浏览器上运行这些多个测试方法。我之前已经做过了,但根据我的经验,用这种模式设计Selenium测试不是一个好主意,所以你可以做到,但我建议不要这样做。

例如,每个测试类有一个测试方法,在@BeforeMethod中,您可以实例化WebDriver浏览器实例,然后在@AfterMethod中可以杀死它。对于每个级别的多次测试,您必须使用@BeforeTest和@AfterTest,这可以完成,但您的结果可能会有所不同,具体取决于您的谨慎程度。

答案 2 :(得分:0)

我对你的问题不太清楚。如果要跨测试使用相同的驱动程序对象,则创建一个静态驱动程序对象并将其传递给测试方法,并且不要将其删除。或者我错过了什么。

答案 3 :(得分:0)

测试类中的每个测试都应该使用新的浏览器会话执行测试。这可以通过将浏览器调用和kill进程放在基础测试类中并在每个测试类中扩展此类来轻松完成。