我的方案是在Parallel中启动多个chrome浏览器(最少2个)。
我为WebDriver初始化创建了一个单独的类,我也有2个xml文件,在该文件中每个都有2个测试。
WebDriver初始化
public class Stackoverflow extends LaunchBrowser
{
@Test
public void 1test() throws InterruptedException
{
initDriver();
driver.get("https://stackoverflow.com");
Thread.sleep(3000);
System.out.println("Stack");
}
@Test
public void 2test() throws InterruptedException
{
Thread.sleep(3000);
}
}
XML文件1:测试方法1
public class StackLogin extends LaunchBrowser
{
@Test
public void 1test() throws InterruptedException
{
driver.findElement(By.xpath("//a[@href='https://stackoverflow.com/users/login?
ssrc=head&returnurl=https%3a%2f%2fstackoverflow.com%2f']")).click();
Thread.sleep(3000);
}
@Test
public void 2test() throws InterruptedException
{
Thread.sleep(3000);
}
}
XML文件1:测试方法2
public class Google extends LaunchBrowser
{
@Test
public void 1test() throws InterruptedException
{
initDriver();
driver.get("https://www.google.co.in");
Thread.sleep(3000);
System.out.println("Google");
}
@Test
public void 2test() throws InterruptedException
{
Thread.sleep(3000);
}
}
XML文件2:测试方法1
public class Gmail extends LaunchBrowser
{
@Test
public void 1test() throws InterruptedException
{
driver.findElement(By.xpath("//a[@href='https://mail.google.com/mail/?tab=wm'][text()='Gmail']")).click();
Thread.sleep(3000);
}
@Test
public void 2test() throws InterruptedException
{
Thread.sleep(3000);
}
}
XML文件2:测试方法2
<suite name="Suite1">
<test name="01Stackoverflow">
<classes>
<class name="com.ci.selenium.Stackoverflow" />
</classes>
</test>
<test name="02StackLogin">
<classes>
<class name="com.ci.selenium.StackLogin" />
</classes>
</test>
</suite>
testng1.xml
<suite name="Suite2">
<test name="1Google">
<classes>
<class name="com.ci.selenium.Google"/>
</classes>
</test>
<test name="2Gmail">
<classes>
<class name="com.ci.selenium.Gmail"/>
</classes>
</test>
</suite>
testng2.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<suiteXmlFiles>${file}</suiteXmlFiles>
<skipTests>false</skipTests>
<properties>
<property>
<name>suitethreadpoolsize</name>
<value>2</value>
</property>
</properties>
</configuration>
</plugin>
此外,我在 pom.xml 文件
中进行了以下配置mvn clean test -Dfile=MyWork/testng1.xml,MyWork/testng2.xml
最后,我使用以下maven命令触发了XML文件。
java.lang.NullPointerException
at com.ci.selenium.StackLogin.1test(StackLogin.java:12)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
... Removed 18 stack frames
结果:
一次启动了两个Chrome浏览器,但每个xml文件中只有第一个测试方法通过,两个xml文件中的第二个测试都失败了。
请帮我解决这个问题。
日志
autoreconf
答案 0 :(得分:1)
我使用以下网站在并行中推出了多个(至少2个)Chrome浏览器。
Thread Local for Parallel Test Execution
为了实现这种情况,我创建了3个类。一个用于WebDriver初始化,另一个用于Threads。
第1课
public class SetTestNG implements Runnable
{
public String xmlString;
public SetTestNG(String suitXMLUrl){
xmlString = suitXMLUrl;
}
@Override
public void run(){
List<String> testSuites = Lists.newArrayList();
testSuites.add(xmlString);
TestNG testng = new TestNG();
testng.setTestSuites(testSuites);
testng.run();
}
}
第2课:主要类
public class MultiThread
{
private static String inputFiles;
private static String[] xmlFile;
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, InterruptedException
{
inputFiles = args[0];
xmlFile = inputFiles.split(",");
for(String file : xmlFile)
{
Thread object1 = new Thread(new SetTestNG(System.getProperty("user.dir")+"/"+file));
object1.start();
Thread.sleep(5000);
}
}
}
注意:此代码的主要用例是为每个testNG Suite文件启动Chrome浏览器。
答案 1 :(得分:0)
您再次需要在类
的第二个Test方法中初始化驱动程序 public class LaunchBrowser
{
public WebDriver driver =null;
public WebDriver initDriver() {
if (driver == null) {
System.setProperty("webdriver.chrome.driver", "C:\\selenium\\drivers\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
}
return driver;
}
}
XML文件1:测试方法2
public class StackLogin extends LaunchBrowser
{
@Test
public void 1test() throws InterruptedException
{
initDriver();
driver.findElement(By.xpath("//a[@href='https://stackoverflow.com/users/login?
ssrc=head&returnurl=https%3a%2f%2fstackoverflow.com%2f']")).click();
Thread.sleep(3000);
}
@Test
public void 2test() throws InterruptedException
{
Thread.sleep(3000);
}
}
XML文件2:测试方法2
public class Gmail extends LaunchBrowser
{
@Test
public void 1test() throws InterruptedException
{
initDriver();
driver.findElement(By.xpath("//a[@href='https://mail.google.com/mail/?tab=wm'][text()='Gmail']")).click();
Thread.sleep(3000);
}
@Test
public void 2test() throws InterruptedException
{
Thread.sleep(3000);
}
}
答案 2 :(得分:0)
您希望每个<suite>
代码只创建一次webdriver实例,然后在多个@Test
代码中的<test>
注释测试方法中共享。
为实现这一目标,您需要将LaunchBrowser
课改为以下内容:
public class LaunchBrowser {
protected WebDriver driver;
@org.testng.annotations.BeforeSuite
public void initDriver() {
System.setProperty("webdriver.chrome.driver", "C:\\selenium\\drivers\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
}
}
你还需要重构所有的测试,这样他们就不会明确地调用LaunchBrowser.initDriver()
,否则会导致webdriver实例化发生两次 - 明确地通过你的调用发生,并且一次由TestNG隐式地发生使用@BeforeSuite
注释进行注释的方法。
那应该解决你的用例。但请记住,这是管理webdriver实例的最有效方法,因为您现在严格限于顺序执行。您无法并行运行测试。