Чтобы понять, как запускать сценарии параллельно, давайте сначала разберемся
Зачем нам нужна обработка сессий?
Во время выполнения теста Selenium WebDriver должен постоянно взаимодействовать с браузером для выполнения заданных команд. Во время выполнения также возможно, что до завершения текущего выполнения кто-то еще начнет выполнение другого сценария на том же компьютере и в браузере того же типа.
В такой ситуации нам нужен механизм, с помощью которого наши два разных исполнения не должны пересекаться друг с другом. Это может быть достигнуто с помощью Session Handling в Selenium.
Как добиться обработки сеансов в Selenium WebDriver?
Если вы проверите исходный код Selenium WebDriver, вы найдете переменную с именем ‘sessionId’. Всякий раз, когда мы создаем новый экземпляр объекта WebDriver, новый «sessionId» будет генерироваться и присоединяться с этим конкретным драйвером Firefox / Chrome / IE ().
Таким образом, все, что мы делаем после этого, будет выполняться только в этом конкретном сеансе браузера Firefox.
Поскольку это встроенная функциональность, нет необходимости явно назначать идентификатор сеанса.
Пример кода: здесь будут созданы два разных сеанса для двух разных WebDriver.
import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class SessionHandling { public static void main(String...strings ){ //First session of WebDriver WebDriver driver = new FirefoxDriver(); //Goto guru99 site driver.get("http://demo.guru99.com/V4/"); //Second session of WebDriver WebDriver driver2 = new FirefoxDriver(); //Goto guru99 site driver2.get("http://demo.guru99.com/V4/"); } }
Как запустить параллельные тесты с Selenium
Есть ситуации, когда вы хотите запустить несколько тестов одновременно.
В таких случаях можно использовать «параллельный» атрибут
Параллельный атрибут тега suite может принимать четыре значения:
тесты | Все тестовые случаи внутри тега <test> файла Testing xml будут выполняться параллельно. |
классы | Все тестовые случаи внутри класса Java будут выполняться параллельно |
методы | Все методы с аннотацией @Test будут выполняться параллельно. |
экземпляры | Тестовые случаи в одном и том же экземпляре будут выполняться параллельно, но два метода двух разных экземпляров будут выполняться в разных потоках. |
Атрибут thread-count позволяет вам указать, сколько потоков должно быть выделено для этого выполнения.
Полный пример: в этом примере три контрольных примера будут выполняться параллельно и заполнять данные для входа на сайте http://demo.guru99.com
Полный проект будет выглядеть так:
TestGuru99MultipleSession.java
import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.Test; public class TestGuru99MultipleSession { @Test public void executSessionOne(){ //First session of WebDriver System.setProperty("webdriver.chrome.driver","chromedriver.exe"); WebDriver driver = new ChromeDriver(); //Goto guru99 site driver.get("http://demo.guru99.com/V4/"); //find user name text box and fill it driver.findElement(By.name("uid")).sendKeys("Driver 1"); } @Test public void executeSessionTwo(){ //Second session of WebDriver System.setProperty("webdriver.chrome.driver","chromedriver.exe"); WebDriver driver = new ChromeDriver(); //Goto guru99 site driver.get("http://demo.guru99.com/V4/"); //find user name text box and fill it driver.findElement(By.name("uid")).sendKeys("Driver 2"); } @Test public void executSessionThree(){ //Third session of WebDriver System.setProperty("webdriver.chrome.driver","chromedriver.exe"); WebDriver driver = new ChromeDriver(); //Goto guru99 site driver.get("http://demo.guru99.com/V4/"); //find user name text box and fill it driver.findElement(By.name("uid")).sendKeys("Driver 3"); } }
TestNG.XML
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="TestSuite" thread-count="3" parallel="methods" > <test name="testGuru"> <classes> <class name="TestGuru99MultipleSession"> </class> </classes> </test> </suite>
Порядок тестов и зависимость
Вы можете установить порядок и зависимость выполнения Test Case .
Предположим, у вас есть два тестовых примера, testGuru99TC1 и testGuru99TC2, и вы хотите выполнить тестовый testGuru99TC2 перед testGuru99TC1. В этом случае мы будем использовать атрибут depenonMethods для создания зависимости и порядка выполнения.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="TestSuite" thread-count="3" parallel="methods" > <test name="testGuru"> <classes> <class name="TestGuru99MultipleSession"> <include value="testGuru99TC1" dependsOnMethods=" testGuru99TC2"/> <include value="testGuru99TC2"/> </class> </classes> </test> </suite>
Резюме
- Новый идентификатор сеанса создается для нового экземпляра WebDriver.
- Один сеанс будет связан с одним конкретным браузером.
- Используя атрибут thread и parallel, вы запускаете свои сценарии параллельно.
- Вы можете использовать атрибутную зависимость, чтобы установить порядок тестирования выполнения