2

Я пишу тесты на основе Java-сервера на основе Java для запуска параллельного кросс-браузера с использованием testng. Я поставил тесты для запуска параллельно на моем файле XML file.The выглядит следующим образом:Объект Webdriver перезаписывается, когда тесты выполняются параллельно.

<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.
  • Crteated отдельные классы для страниц (например: login.class, main.class и т.д.). Который имеет только @Test метод и расширенный класс driverbase получить драйвер.

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

<suite name="TestSuite" thread-count="2" parallel="none" > 

Как я могу решить эту проблему? Как запускать тесты параллельно без этой проблемы?

driverbase класс, как это:

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

 
\t * @param browser 
 

 
\t * @throws Exception 
 

 
\t */ 
 
\t  \t 
 
\t @BeforeSuite 
 

 
\t @Parameters("browser") 
 

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

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

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

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

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

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

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

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

Спасибо за помощь :)

+0

можете ли вы разместить driverbase.java? – Mona

+0

Добавлен код фрагмента кода драйвера – Sijin

+0

Посмотрите: https://github.com/Ardesco/Selenium-Maven-Template – Ardesco

ответ

1
  1. @BeforeSuite методы не должны возвращать что-то. => заменить на void
  2. Ваш testng имеет 2 теста differents, но @BeforeSuite всегда будет запускаться один раз в комплекте, что ваш комментарий показывает, что вы его не ожидаете. => заменить на @BeforeTest
  3. Когда вы запускаете //, 2 потока - это настройки значения драйвера (один с firefox, один с хромом), который объясняет вашу проблему.

Вы можете попробовать что-то вроде:

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/ тоже.

+0

Я пробовал это. Но не удастся. Я могу запускать тесты с параллельным = false. В этом случае оба тесты успешно выполняются. – Sijin

+0

Атрибуты в моем примере не являются потокобезопасными.Вы можете обернуть их в ThreadLocal или использовать @Factory вместо метода before class. – juherr

+0

Обнаружено решение с использованием HashMap. Теперь я могу запускать тесты параллельно. – Sijin