Объект Webdriver перезаписывается, когда тесты выполняются параллельно

Я пишу тесты Selen-Web-драйвера на основе Java для запуска параллельного кросс-браузерного теста с использованием 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 и имеет расширенный класс driverbase для получения драйвера.

Тест запускается успешно, когда я устанавливаю параллельный ни один в XML-файле

<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 ответа

  1. @BeforeSuite методы не должны возвращать что-то. => заменить на void
  2. Ваш тест имеет 2 разных теста, но @BeforeSuite всегда будет запускаться один раз в зависимости от того, что ваш комментарий показывает, что вы этого не ожидаете. => заменить на @BeforeTest
  3. Когда вы работаете в //, 2 потока устанавливают значение драйвера (один с 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/ тоже.

Чтобы тот же экземпляр 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();
}
Другие вопросы по тегам