测试并行运行时,Webdriver对象会被覆盖

时间:2015-10-28 07:26:03

标签: java selenium-webdriver testng selenium-chromedriver selenium-firefoxdriver

我正在编写基于Java的selenium-web-driver测试,以使用testng运行并行跨浏览器测试。 我已将测试设置为在我的xml文件上并行运行。文件如下所示:

 <suite name="TestSuite" thread-count="2" parallel="tests" >    
 <test name="ChromeTest">
  <parameter name="browser" value="Chrome" />               
   <classes>
      <class name="test.login"/>
      <class name="test.main"/>
      <class name="test.logout"/> 
   </classes>  
 </test>

<test name="FirefoxTest">
 <parameter name="browser" value="Firefox" />              
   <classes>
      <class name="test.login"/>
      <class name="test.main"/>
      <class name="test.logout"/> 
   </classes>  
 </test>

但是当我运行测试时,两个浏览器实例都会被打开(Chrome首先打开并开始执行,并且在Firefox打开延迟之后)。 在这种情况下,驱动程序对象被Firefox驱动程序覆盖并且chrome停止执行。测试继续在Firefox上执行 成功完成。

项目结构如下:

  • 创建 driverbase.class 以加载与我的 @Beforesuite 的浏览器对应的驱动程序。
  • 为页面设置了各个类。(例如: login.class,main.class等),它只有 @Test 方法并且具有扩展的驱动程序类以获取驱动程序。

当我在xml文件

上设置为none时,测试是超级运行的
<suite name="TestSuite" thread-count="2" parallel="none" >

我如何克服这个问题?如何在没有这个问题的情况下并行运行测试?

driverbase类是这样的:

public class driverbase {
	
	  private String baseUrl;
	  private String nodeUrl;
	  private boolean acceptNextAlert = true;
	  private StringBuffer verificationErrors = new StringBuffer();
	  
	public static WebDriver driver = null;
		     		  
	  	/**
		 
	   * This function will execute before each Test tag in testng.xml

	   * @param browser

	   * @throws Exception

	   */
	      	  
	@BeforeSuite

	@Parameters("browser")

	  public WebDriver setup(String browser) throws Exception{
		
	      //Check if parameter passed from TestNG is 'firefox'
			
	      if(browser.equalsIgnoreCase("firefox")){
	    	  
	    	  System.out.println("Browser  : "+browser);
	    	      	
	    	  FirefoxProfile profile = new FirefoxProfile();
	 		  profile.setAcceptUntrustedCertificates(true);
	 		
	 		  //create firefox instance
	 		  driver = new FirefoxDriver(profile);
	 			  
	      }
	      
	      //Check if parameter passed as 'chrome'

	      else if(browser.equalsIgnoreCase("chrome")){

	    	  System.out.println("Browser  : "+browser);
	    	      	  
	    //set path to chromedriver.exe You may need to download it from http://code.google.com/p/selenium/wiki/ChromeDriver

	          System.setProperty("webdriver.chrome.driver","C:\\chromedriver.exe");

	          ChromeOptions options = new ChromeOptions();
	          options.addArguments("--test-type");
	        
	 			//create chrome instance
		          
	        	  driver = new ChromeDriver(options);
	        	
	      }
	    
	       else{

	          //If no browser passed throw exception
	    	   
	    	   System.out.println("Browser  is incorrect");

	          throw new Exception("Browser is not correct");

	       }
	  
	      driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
	      driver.manage().window().maximize();
		  return driver;
	  
	}

感谢您的帮助:)

2 个答案:

答案 0 :(得分:1)

  1. @BeforeSuite方法不应该返回一些东西。 =&GT;替换为void
  2. 您的testng有2个不同的测试,但@BeforeSuite将始终按套件运行一次您的评论显示您并不期望它。 =&GT;替换为@BeforeTest
  3. 当您在//中运行时,2个线程设置驱动程序值(一个使用firefox,一个使用chrome),这可以解释您的问题。
  4. 您可以尝试以下内容:

    public class driverbase {
    
      private String baseUrl;
      private String nodeUrl;
      private boolean acceptNextAlert = true;
      private StringBuffer verificationErrors = new StringBuffer();   
      public WebDriver driver;
    
      @BeforeTest
      @Parameters("browser")
      public void setup(String browser) throws Exception {
          if(browser.equalsIgnoreCase("firefox")) {
              FirefoxProfile profile = new FirefoxProfile();
              profile.setAcceptUntrustedCertificates(true);
              driver = new FirefoxDriver(profile);
          } else if(browser.equalsIgnoreCase("chrome")) {
              System.setProperty("webdriver.chrome.driver","C:\\chromedriver.exe");
              ChromeOptions options = new ChromeOptions();
              options.addArguments("--test-type");
              driver = new ChromeDriver(options);
          } else {
              throw new Exception("Browser is not correct");
          }
    
          driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
          driver.manage().window().maximize();
    }
    

    您也应该查看http://fluentlenium.org/

答案 1 :(得分:0)

确保不会将同一Webdriver实例分配给多个测试。创建驱动程序实例的方法应该同步。这应该可以解决问题。

public synchronized void setup(String browser) throws Exception {
      if(browser.equalsIgnoreCase("firefox")) {
          FirefoxProfile profile = new FirefoxProfile();
          profile.setAcceptUntrustedCertificates(true);
          driver = new FirefoxDriver(profile);
      } else if(browser.equalsIgnoreCase("chrome")) {
          System.setProperty("webdriver.chrome.driver","C:\\chromedriver.exe");
          ChromeOptions options = new ChromeOptions();
          options.addArguments("--test-type");
          driver = new ChromeDriver(options);
      } else {
          throw new Exception("Browser is not correct");
      }

      driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
      driver.manage().window().maximize();
}