当前位置: 首页 > 知识库问答 >
问题:

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

邓阳嘉
2023-03-14
 <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>

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

项目的结构是这样的:

  • 创建了一个DriverBase.class来加载与浏览器对应的驱动程序,该浏览器具有my@beforeSuite.
  • crteated页面的单个类。(例如:login.class,main.class等),它只有@test方法,并且扩展了driverbase类来获取驱动程序。

当我在xml文件上设置parallel为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;
	  
	}

谢谢你的帮助:)

共有1个答案

欧阳勇军
2023-03-14
  1. @beforeSuite方法不应该返回某些内容。=>替换为void
  2. 您的testng有两个不同的测试,但是@beforeSuite总是按您的注释显示您不期望的套件运行一次。=>替换为@beforeTest
  3. 当您在//中运行时,有两个线程设置驱动程序值(一个使用firefox,一个使用chrome),这可以解释您的问题。

您可以尝试以下方法:

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/。

 类似资料:
  • 在通过Saucelabs跨浏览器执行selenium java测试时,我需要一些帮助来解决这个问题。我正在Jenkins作业中选择的两个浏览器上运行一个测试。 当一个测试通过执行时,另一个测试(类似)失败,出现错误: 似乎一个测试中断了另一个测试。这两个测试都在各自的通道和线程下运行。 共享代码: 扩展的Remote teTestBase类: suite.xml文件: 项目信息:java、sele

  • 问题内容: 我试图覆盖Python类的方法,因为我想每次实例属性更改其值时都调用另一个函数。但是,我不希望该方法出现此行为,因为在此初始化期间,我设置了一些稍后将要使用的属性: 到目前为止,我有此解决方案,而不必在运行时重写: 但是,我想避免这些,并在方法末尾进行覆盖: 我尝试了和,但是这些尝试都没有效果。我已经阅读了数据模型参考的这一部分,但是看起来自己的分配有些棘手。 如何可能在的末尾进行覆盖

  • 类TestParallel.FirstTestClass线程ID:22名称:TestNG 类TestParallel.SecondTestClass线程ID:23名称:TestNG 类TestParallel.TestSetup线程ID:23名称:TestNG java.lang.NullPoInterException位于TestParallel.TestSetup.OnTestFailure(

  • 我试图用TestNG并行运行一个示例测试项目。但它是在一个线程中顺序执行的。我漏掉什么了吗? 谢了。

  • 为了减少测试的运行时间,我希望并行运行测试。我有几个不能并行运行的类。 假设我有两种类型的类:-并行类-包含类1,类2-不并行类-包含类3,类4我想并行运行类1和类2到类3和类4(但lass3不会并行运行到类4) 我试图这样做: 我并行运行这两个测试,但只有第一个测试具有类的并行性。 如果我可以选择添加parallel=“classes”进行测试,我尝试在TestNG文档中搜索。我看不到,但它正在

  • 我目前正在尝试使用Cucumber实现并行测试运行。我设法使用万无一失的插件同时运行了两个不同的运行程序。现在我想检查是否可以并行运行SingleRunner文件多次。 我有一个签名测试。所以我需要在几个平台上并行运行。有可能吗? 这是我的跑步者档案 无跑道进近 工厂级 `导入org . open QA . selenium . web driver; ` 阶梯班 导入org.openqa.sel