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