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

Java 当测试并行运行时,Webdriver对象被覆盖,java,selenium-webdriver,testng,selenium-chromedriver,selenium-firefoxdriver,Java,Selenium Webdriver,Testng,Selenium Chromedriver,Selenium Firefoxdriver,我正在编写基于Java的SeleniumWeb驱动程序测试,以使用testng运行并行跨浏览器测试。 我已将测试设置为在xml文件上并行运行。该文件如下所示: @BeforeSuite方法不应返回某些内容。=>替换为void 您的testng有两个不同的测试,但是@BeforeSuite将始终按套件运行一次,您的评论显示您没有预料到这一点。=>替换为测试前的@BeforeTest 当您在//中运行时,两个线程设置驱动程序值(一个使用firefox,一个使用chrome),这可以解释您的问题

我正在编写基于Java的SeleniumWeb驱动程序测试,以使用testng运行并行跨浏览器测试。 我已将测试设置为在xml文件上并行运行。该文件如下所示:


  • @BeforeSuite
    方法不应返回某些内容。=>替换为
    void
  • 您的testng有两个不同的测试,但是
    @BeforeSuite
    将始终按套件运行一次,您的评论显示您没有预料到这一点。=>替换为测试前的
    @BeforeTest
  • 当您在//中运行时,两个线程设置驱动程序值(一个使用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();
    }
    

    您也应该查看一下。

    以确保不会将同一个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();
    }
    

    你能发布driverbase.java吗?添加了driverbase代码片段看看:我试过了。但没有成功。我能够运行parallel=false的测试。在这种情况下,两个测试都成功运行。在我的示例中,属性不是线程安全的。您可以将它们包装到ThreadLocal中,或者使用@Factory而不是before类方法。使用HashMap找到了一个解决方案。现在我可以并行运行测试了。您可以发布解决方案吗?