有没有办法在testng套件中运行时为多个测试/类使用相同的webdriver对象?我的意思是用一个类启动WebDriver实例,但继续在套件中的后续类/测试中使用它?
我面临的问题是10个不同的类有这个陈述:
WebDriver driver = new FirefoxDriver();
并且即使我用并行模式限制TestNG设置了一个假,它也会打开10个不同的实例。它真的糟透了我的系统内存。
我找到了一个使用相同WebDriver的解决方案,并运行不同的类,而无需多个浏览器和Webdriver的麻烦。
答案 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。