有没有办法在testng套件中运行时为多个java类使用相同的webdriver对象?

时间:2011-10-26 20:08:26

标签: firefox selenium webdriver testng

有没有办法在testng套件中运行时为多个测试/类使用相同的webdriver对象?我的意思是用一个类启动WebDriver实例,但继续在套件中的后续类/测试中使用它?

我面临的问题是10个不同的类有这个陈述:

WebDriver driver = new FirefoxDriver();

并且即使我用并行模式限制TestNG设置了一个假,它也会打开10个不同的实例。它真的糟透了我的系统内存。

我找到了一个使用相同WebDriver的解决方案,并运行不同的类,而无需多个浏览器和Webdriver的麻烦。

7 个答案:

答案 0 :(得分:3)

将所有类放在<test>标记中,并使用存储在基类中的@BeforeTest方法初始化驱动程序,以便所有测试方法都可以访问它。

答案 1 :(得分:0)

我不确定它在java中是什么,但在c#中你只是将webdriver实例化为一个字段

private WebDriver driver = new FirefoxDriver();

然后只需从该点开始引用驱动程序

driver.findElements(By.TagName('h1'));

答案 2 :(得分:0)

ISFW提供了处理它的好方法。如果需要,它将创建新实例,否则使用相同的实例。但是,您不需要编写用于设置和拆卸的代码。您需要在属性文件中设置浏览器字符串,它将为给定的浏览器字符串管理RC或webdriver。

答案 3 :(得分:0)

我已经实现了以下目标:

1:创建了一个启动类

public class Start {
    public static WebDriver wd;

    @BeforeSuite
    public void Setup() {
    System.setProperty "webdriver.chrome.driver","D:\\chromedriver.exe");
    wd = new ChromeDriver();
    wd.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
    wd.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
    wd.manage().window().maximize();
    wd.get("URL");}
    }

2:通过类限定符

引用其他类中的静态驱动程序实例
public void VerifyTitle() {
    Assert.assertEquals(Start.wd.getTitle(), "Title", "Incorrect Title");}

3:将tests.xml文件中的类和setup方法添加为

<suite name="QA">
   <test name="1Class">
      <classes>
         <class name="just.Start">
            <methods>
               <include name="Setup"></include>
            </methods>
         </class>
         <class name="just.LoginPage">
            <methods>
               <include name="VerifyTitle"></include>
            </methods>
         </class>
         <class name="just.HomePage">
            <methods>
               <include name="VerifyUserLogin"></include>           
            </methods>
         </class>

      </classes>
    </test> 
  </suite>    

我用Java实现了这个。

答案 4 :(得分:-1)

如果要并行运行测试用例,则需要在每个测试中都有一个单独的webdriver实例。您无法在多线程环境中跨测试共享实例。

至于抽象webdriver实例的初始化,有几种方法可供选择。您也许可以编写一个基础TestCase类来构建webdriver实例。然后,每个测试用例将沿着这些行扩展TestCase类。

在TestNG中,您可以通过在testng.xml中指定参数-threadcount来控制线程数。查看文档here。如果以编程方式启动TestNG,则可以使用setThreadCount方法。检查Java文档here

答案 5 :(得分:-1)

在一个包裹下:

Test1.java - &gt;让@BeforeTest和@AfterTest分别启动浏览器并关闭浏览器。

例如:

public class Test1 {

    public static WebDriver driver;

    @BeforeTest
    public void open_browser()
    {
        driver = new FirefoxDriver();
    }

    @AfterTest
    public void close_browser()
    {
        driver.close();
    }
}

Login.java

public class Login {

@Test
public static void logintest{

    Webelement ele1 = Test1.driver.findElement(...);
}

}

在您的XML文件中:

<test name = "MyTest">
    <classes>
        <class name = "Test1"></class>
        <class name = "Login"></class>
    </classes>
</test>

这将使用在Test1文件中创建的驱动程序实例。

希望它有所帮助!! :)

答案 6 :(得分:-1)

处理此问题的最佳方法是:

只需一个BaseClass即可启动浏览器。

public class BaseClass
{
  public static Webdriver driver;
@BeforeSuite
  public void Launch_Browser()
  {
  webDriver Driver= new FirefoxDriver();
  }
}

然后使用extend

将BaseClass扩展到所有其他类
public class Class1 extends BaseClass
 {
   @Test
    public void TC1()
      {
          //PASS
        }   

 }

等等。重要的是你应该在BaseClass中将webdriver驱动程序声明为public static。