Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SeleniumWebDriver:如何在同一窗口中一个接一个地运行多个测试?_Java_Selenium_Webdriver_Testng - Fatal编程技术网

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

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

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

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”标志,那么您在该测试集中定义的所有测试类都将按顺序执行。这只会按顺序运行测试方法。如果定义了两个类,它将运行浏览器的两个实例。每班一个,为什么?请给出一个理由