如何让 webdriver 在每次测试后不关闭浏览器 window?
How make webdriver not to close browser window after each test?
我是 Selenium WebDriver 和 Java 的新手。我的网站页面 /someservice.php 上有一些网络服务。我在 Selenuim 上写了一些测试,它们运行良好。代码示例(主要Class):
public class SiteClass {
static WebDriver driver;
private static boolean findElements(String xpath,int timeOut ) {
public static void open(String url){
//Here we initialize the firefox webdriver
driver=new FirefoxDriver();
driver.get(url);
}
public static void close(){
driver.close();
}
WebDriverWait wait = new WebDriverWait( driver, timeOut );
try {
if( wait.until( ExpectedConditions.visibilityOfElementLocated( By.xpath( xpath ) ) ) != null ) {
return true;
} else {
return false;
}
} catch( TimeoutException e ) {
return false;
}}
public static Boolean CheckDiameter(String search,String result){
driver.findElement(By.xpath("//input[@id='search_diam']")).sendKeys(search);
WebDriverWait wait = new WebDriverWait(driver, 5);
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@class='ac_results'][last()]/ul/li")));
WebElement searchVariant=driver.findElement(By.xpath("//div[@class='ac_results'][last()]/ul/li"));
Actions action = new Actions(driver);
action.moveToElement(searchVariant).perform();
driver.findElement(By.xpath("//li[@class='ac_over']")).click();
Boolean iselementpresent = findElements(result,5);
return iselementpresent;
}
}
代码示例(测试Class)
@RunWith(Parameterized.class)
public class DiamTest {@Parameters
public static Collection<Object[]> diams() {
return Arrays.asList(new Object[][] {
{ "111", "//div[@class='jGrowl-message']",true},
{ "222", "//div[@class='jGrowl-message']",false},
{ "333", "//div[@class='jGrowl-message']",true},
});
}
private String inputMark;
private String expectedResult;
private Boolean assertResult;
public DiamTest(String mark, String result, boolean aResult) {
inputMark=mark;
expectedResult=result;
assertResult=aResult;
}
@BeforeClass
public static void setUpClass() {
}
@AfterClass
public static void tearDownClass() {
}
/**
* Test of CheckDiameter method, of class CableRu.
*/
@Test
public void testCheckDiameter() {
SiteClass obj=new SiteClass();
obj.open("http://example.com/services.php");
assertEquals(assertResult, obj.CheckDiameter(inputMark, expectedResult));
obj.close();
}
}
现在我有 2 个这样的测试,每个测试有 3 个参数(总共 6 个变体)。正如您在每个变体中看到的那样,我创建了新的浏览器 window,当我 运行 时,所有 6 个变体都花费了太多时间(最多 80 秒)。
如何 运行 一个浏览器中的所有变体 window 来加快我的测试速度?
只需将 public static void close() 方法的内容从您的 SiteClass 移动到 DiamTest class 中的 tearDownClass() 方法。这样浏览器 window 将在 class 执行完成时关闭(因为 @AfterClass 注释)。您的代码应如下所示:
//DiamTest class
@AfterClass
public static void tearDownClass() {
driver.close();
}
将浏览器 window 初始化移动到将在每次测试之前执行的 setUpClass() 方法也是一个好习惯 class(根据 @BeforeClass 注释)
//DiamTest class
@BeforeClass
public static void setUpClass() {
//Here we initialize the firefox webdriver
driver=new FirefoxDriver();
driver.get(url);
}
您需要做的是与所有测试分享您的帮助 class,这意味着,您应该在 中创建一个 SiteClass 实例]setUpClass 方法。
此方法用 @BeforeClass 注释确保您的测试 class 将创建此方法将在所有测试执行之前执行。
您可以在 jUnit doc: or have a simple overview in this 响应中阅读有关 @BeforeClass 的更多信息。
您还需要重写一些代码以允许与另一个测试共享驱动程序,如下所示:
@RunWith(Parameterized.class)
public class DiamTest {
@Parameters
public static Collection<Object[]> diams() {
return Arrays.asList(new Object[][] {
{ "111", "//div[@class='jGrowl-message']",true},
{ "222", "//div[@class='jGrowl-message']",false},
{ "333", "//div[@class='jGrowl-message']",true},
});
}
private String inputMark;
private String expectedResult;
private Boolean assertResult;
private static SiteUtil siteUtil;
public DiamTest(String mark, String result, boolean aResult) {
inputMark=mark;
expectedResult=result;
assertResult=aResult;
}
@BeforeClass
public static void setUpClass() {
siteUtil = new SiteUtil();
}
@AfterClass
public static void tearDownClass() {
siteUtil.close();
}
@Test
public void testCheckDiameter() {
siteUtil.open("http://example.com/services.php");
assertEquals(assertResult, obj.CheckDiameter(inputMark, expectedResult));
}
}
和:
public class SiteClass {
static WebDriver driver;
public SiteClass() {
driver = new FirefoxDriver();
}
public void open(String url){
driver.get(url);
}
...
提示:
您应该阅读 TestPyramid.
既然功能测试是昂贵的,你应该关心什么是真正必要的测试。这篇文章是关于这个的。
我是 Selenium WebDriver 和 Java 的新手。我的网站页面 /someservice.php 上有一些网络服务。我在 Selenuim 上写了一些测试,它们运行良好。代码示例(主要Class):
public class SiteClass {
static WebDriver driver;
private static boolean findElements(String xpath,int timeOut ) {
public static void open(String url){
//Here we initialize the firefox webdriver
driver=new FirefoxDriver();
driver.get(url);
}
public static void close(){
driver.close();
}
WebDriverWait wait = new WebDriverWait( driver, timeOut );
try {
if( wait.until( ExpectedConditions.visibilityOfElementLocated( By.xpath( xpath ) ) ) != null ) {
return true;
} else {
return false;
}
} catch( TimeoutException e ) {
return false;
}}
public static Boolean CheckDiameter(String search,String result){
driver.findElement(By.xpath("//input[@id='search_diam']")).sendKeys(search);
WebDriverWait wait = new WebDriverWait(driver, 5);
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@class='ac_results'][last()]/ul/li")));
WebElement searchVariant=driver.findElement(By.xpath("//div[@class='ac_results'][last()]/ul/li"));
Actions action = new Actions(driver);
action.moveToElement(searchVariant).perform();
driver.findElement(By.xpath("//li[@class='ac_over']")).click();
Boolean iselementpresent = findElements(result,5);
return iselementpresent;
}
}
代码示例(测试Class)
@RunWith(Parameterized.class)
public class DiamTest {@Parameters
public static Collection<Object[]> diams() {
return Arrays.asList(new Object[][] {
{ "111", "//div[@class='jGrowl-message']",true},
{ "222", "//div[@class='jGrowl-message']",false},
{ "333", "//div[@class='jGrowl-message']",true},
});
}
private String inputMark;
private String expectedResult;
private Boolean assertResult;
public DiamTest(String mark, String result, boolean aResult) {
inputMark=mark;
expectedResult=result;
assertResult=aResult;
}
@BeforeClass
public static void setUpClass() {
}
@AfterClass
public static void tearDownClass() {
}
/**
* Test of CheckDiameter method, of class CableRu.
*/
@Test
public void testCheckDiameter() {
SiteClass obj=new SiteClass();
obj.open("http://example.com/services.php");
assertEquals(assertResult, obj.CheckDiameter(inputMark, expectedResult));
obj.close();
}
}
现在我有 2 个这样的测试,每个测试有 3 个参数(总共 6 个变体)。正如您在每个变体中看到的那样,我创建了新的浏览器 window,当我 运行 时,所有 6 个变体都花费了太多时间(最多 80 秒)。
如何 运行 一个浏览器中的所有变体 window 来加快我的测试速度?
只需将 public static void close() 方法的内容从您的 SiteClass 移动到 DiamTest class 中的 tearDownClass() 方法。这样浏览器 window 将在 class 执行完成时关闭(因为 @AfterClass 注释)。您的代码应如下所示:
//DiamTest class
@AfterClass
public static void tearDownClass() {
driver.close();
}
将浏览器 window 初始化移动到将在每次测试之前执行的 setUpClass() 方法也是一个好习惯 class(根据 @BeforeClass 注释)
//DiamTest class
@BeforeClass
public static void setUpClass() {
//Here we initialize the firefox webdriver
driver=new FirefoxDriver();
driver.get(url);
}
您需要做的是与所有测试分享您的帮助 class,这意味着,您应该在 中创建一个 SiteClass 实例]setUpClass 方法。 此方法用 @BeforeClass 注释确保您的测试 class 将创建此方法将在所有测试执行之前执行。
您可以在 jUnit doc: or have a simple overview in this 响应中阅读有关 @BeforeClass 的更多信息。
您还需要重写一些代码以允许与另一个测试共享驱动程序,如下所示:
@RunWith(Parameterized.class)
public class DiamTest {
@Parameters
public static Collection<Object[]> diams() {
return Arrays.asList(new Object[][] {
{ "111", "//div[@class='jGrowl-message']",true},
{ "222", "//div[@class='jGrowl-message']",false},
{ "333", "//div[@class='jGrowl-message']",true},
});
}
private String inputMark;
private String expectedResult;
private Boolean assertResult;
private static SiteUtil siteUtil;
public DiamTest(String mark, String result, boolean aResult) {
inputMark=mark;
expectedResult=result;
assertResult=aResult;
}
@BeforeClass
public static void setUpClass() {
siteUtil = new SiteUtil();
}
@AfterClass
public static void tearDownClass() {
siteUtil.close();
}
@Test
public void testCheckDiameter() {
siteUtil.open("http://example.com/services.php");
assertEquals(assertResult, obj.CheckDiameter(inputMark, expectedResult));
}
}
和:
public class SiteClass {
static WebDriver driver;
public SiteClass() {
driver = new FirefoxDriver();
}
public void open(String url){
driver.get(url);
}
...
提示: 您应该阅读 TestPyramid.
既然功能测试是昂贵的,你应该关心什么是真正必要的测试。这篇文章是关于这个的。