当前位置: 首页 > 知识库问答 >
问题:

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

姚雅珺
2023-03-14

我的目标是让一系列测试一个接一个地运行。我希望有一个“登录”脚本让用户登录,然后在同一窗口/驱动程序中继续执行以下脚本。我使用的是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;
}
 }
}  

共有3个答案

田佐
2023-03-14

Selenium人编写测试的通常方式是每个测试类打开一个单独的浏览器,这有点像“Selenium网格”的操作设计。我通常每个测试类放一个测试方法。如果您希望每个类有多个测试方法,并且您的测试应用程序不关心您运行这些方法的顺序,那么理论上您可以在单个浏览器上运行这些多个测试方法。我以前这样做过,但是根据我的经验,用这种模式设计Selenium测试不是一个好主意,所以你可以这样做,但是我建议不要这样做。

例如,对于每个测试类一个测试方法,在@BeforeMethod中可以实例化WebDriver浏览器实例,然后在@AfterMethod中可以杀死它。由于每个类有多个测试,您必须使用@BeforeTest和@AfterTest,这是可以完成的,但您的结果可能会因您的谨慎程度而异。

邓夕
2023-03-14

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

钦景胜
2023-03-14

如果您的测试是依赖的,您可以将它们放在同一个类中,并在方法2上定义依赖方法={method 1},以便对顺序进行gauranteed。如果它在不同的类之间,您可以考虑从LoginScript类扩展您的addNormalEE类。

要在同一浏览器中运行测试,驱动程序实例需要在类之间共享,或者在所有@tests中都必须相同。要么使它静态,要么考虑有线程本地驱动程序变量,以防您计划在某一天并行运行。在上述情况下,如果需要避免静态,还可以在loginScript中使用getDriver()方法将驱动程序对象返回给AddNormalEE类。

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

 类似资料:
  • 问题内容: 我想做的是从Java应用程序多次运行文件。因此,我设置了一个运行以下代码的时间: 问题是,现在每次运行命令时,都会弹出一个新的cmd窗口。但是,我想要的只是开始时弹出的 一个 窗口,该窗口用于显示以下命令调用中的所有数据。 我怎样才能做到这一点? 问题答案: 使用 & &,您可以执行多个命令,一个接一个地执行: 使用多个命令和条件处理符号 您可以使用条件处理符号从单个命令行或脚本运行多

  • 问题内容: 我正在开发一个Java应用程序,该应用程序偶尔会在Windows计算机上运行。在某个时候,我需要运行Cygwin提示符并在其中执行一些命令。 我找到了一个使用Runtime类的主题:http : //www.javaquery.com/2011/03/how-to-execute- multiple-command-in.html 但是,它不会启动真正的 cmd.exe 窗口,它仅在后

  • 我正在运行一个单节点集群并处理timeseries数据。我有一组MapReduce作业从客户端应用程序定期运行(使用Quartz crontrigger)。例如, 一切都很好。但是有时,可以同时触发多个作业,例如在凌晨00:00触发job1、job2、job3。即使设置了作业优先级,由于可用的映射槽,这些作业被发现是并行执行的。因此,对于低优先级作业,一些输入数据被遗漏了。

  • 我需要在一次测试中执行所有3个类,并满足以下要求: > 仅从Class1执行test1和test3。 仅从Class2执行test2。 执行Class3中的所有测试。 2类 3类 为此,我使用了以下testNg xml,但无论我是否包含该组,都将执行Class 1和Class 3中的所有测试。 如果我希望执行上述类文件,请建议TestNg xml文件的正确语法。

  • 问题内容: 我的Web应用程序的用户可能打开了多个浏览器窗口并指向同一页面。我希望页面中某些内容的状态(通过ajax加载)在回发中得以保留。我既可以存储在Cookie中,也可以存储在服务器上。无论哪种方式,我都无法想到如何区分每个窗口。 例如,假设用户Bob在ListOfSomething页面上打开了两个浏览器窗口。每个列表都有一个 LoadedPageNumber 属性,我需要保留该属性。否则,