Wykonywanie równoległe w Selenium

⚡ Inteligentne podsumowanie

Sesje, przebieg równoległy i zależności w Selenium połącz unikalny identyfikator sesji dla każdej instancji WebDriver z TestNG kontrolek pakietu, umożliwiających wielu oknom przeglądarki jednoczesne uruchamianie niezależnych lub uporządkowanych skryptów i szybsze zakończenie cyklu regresji.

  • 🧩 Zasada kluczowa: Każda nowa instancja WebDriver generuje nowy identyfikator sesji, dzięki czemu dwaj sterowniki nigdy nie współdzielą poleceń ani plików cookie na tej samej maszynie.
  • ⚙️ Realizacja: Ustaw równolegle = „metody” (lub testy, klasy, instancje) plus liczbę wątków na TestNG tag pakietu testng.xml służący do rozsyłania wykonania.
  • 🧵 Równoległość: Użyj jednego WebDrivera na metodę @Test, aby uniknąć sytuacji wyścigu na współdzielonych oknach przeglądarki podczas równoczesnych uruchomień.
  • 🔗 Zależność: Uporządkuj testy za pomocą dependOnMethods wewnątrz pliku testng.xml, dołączając znaczniki lub adnotację @Test, gdy jedna metoda musi poprzedzać inną.
  • 🤖 Wykorzystanie sztucznej inteligencji: Nowoczesne rozwiązania sztucznej inteligencji przewidują optymalną liczbę wątków, grupują bezpieczne metody równoległe i wykrywają niestabilne kandydatury na podstawie historycznych danych przebiegu.

Jak uruchomić wykonywanie równoległe w Selenium

Aby zrozumieć, jak uruchamiać skrypty równolegle, najpierw musisz wiedzieć, jak Selenium izoluje każdą przeglądarkę poprzez sesje.

Dlaczego potrzebujemy obsługi sesji?

Podczas wykonywania testu, Selenium WebDriver musi na każdym kroku komunikować się z przeglądarką, aby wykonać polecenia. Podczas trwania testu inny użytkownik może uruchomić drugi skrypt na tym samym komputerze i w tej samej przeglądarce.

Obsługa sesji

W takiej sytuacji potrzebny jest mechanizm, który zapobiegnie nakładaniu się dwóch wykonań. Selenium rozwiązuje ten problem poprzez obsługę sesji.

Jak osiągnąć obsługę sesji w Selenium Sterownik sieciowy?

Jeśli sprawdzisz Selenium W źródle WebDriver znajdziesz zmienną o nazwie sessionId. Za każdym razem, gdy tworzysz nową instancję WebDriver, tworzony jest nowy sessionId jest generowany i dołączany do tego Firefox, Chrome lub sterownik IE.

Osiągnij obsługę sesji Selenium Sterownik sieciowy

Każde kolejne polecenie będzie wykonywane wyłącznie w ramach danej sesji przeglądarki.

Osiągnij obsługę sesji Selenium Sterownik sieciowy

Ponieważ jest to funkcja wbudowana w WebDriver, nie ma potrzeby ręcznego przypisywania sessionId.

Code Przykład: Dla dwóch instancji WebDriver generowane są dwie różne sesje.

SessionHandling.java
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();
        // Go to guru99 demo site
        driver.get("https://demo.guru99.com/V4/");

        // Second session of WebDriver
        WebDriver driver2 = new FirefoxDriver();
        // Go to guru99 demo site
        driver2.get("https://demo.guru99.com/V4/");
    }
}

Jak uruchamiać testy równoległe za pomocą Selenium

Są sytuacje, w których chcesz przeprowadzić wiele testów jednocześnie, np. sprawdzanie między przeglądarkami lub duże kabiny dla palących.

W takich przypadkach parallel atrybut na TestNG tag suite wykonuje całą pracę.

Uruchom testy równoległe za pomocą Selenium

Atrybut równoległy znacznika pakietu przyjmuje cztery wartości:

Wartość atrybutuZnaczenie
TestyWszystkie produkty przypadki testowe wewnątrz tag testowanie Plik XML uruchamiany równolegle.
KlasyWszystkie przypadki testowe wewnątrz Java zajęcia prowadzone równolegle.
metodyWszystkie metody oznaczone adnotacją @Test są wykonywane równolegle.
instancjeTesty w tej samej instancji są wykonywane równolegle, natomiast dwie metody dwóch różnych instancji są wykonywane w różnych wątkach.

thread-count Atrybut decyduje, ile wątków jest przydzielanych do danego wykonania. Połącz go z TestNG oraz zainstalować TestNG in Eclipse przed uruchomieniem. W przypadku skalowania wykraczającego poza pojedynczą maszynę, przekieruj ten sam pakiet przez Selenium Siatka 4 do rozproszonego wykonywania równoległego.

Pełny przykład: trzy przypadki testowe są uruchamiane równolegle i wypełniane danymi logowania https://demo.guru99.com/.

Kompletny projekt wygląda następująco:

Uruchom testy równoległe za pomocą Selenium

TestowanieGuru99MultipleSession.java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;

public class TestGuru99MultipleSession {

    @Test
    public void executeSessionOne() {
        // First session of WebDriver
        System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://demo.guru99.com/V4/");
        // Find the 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();
        driver.get("https://demo.guru99.com/V4/");
        driver.findElement(By.name("uid")).sendKeys("Driver 2");
    }

    @Test
    public void executeSessionThree() {
        // Third session of WebDriver
        System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://demo.guru99.com/V4/");
        driver.findElement(By.name("uid")).sendKeys("Driver 3");
    }
}

TestNG.XML

testng.xml (metody równoległe)
<?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"/>
    </classes>
  </test>
</suite>

Kolejność i zależność przypadków testowych

Możesz ustawić kolejność i zależność walizka testowa wykonanie. Załóżmy, że masz dwa przypadki testowe, testGuru99TC1 oraz testGuru99TC2, i Ty chcesz testGuru99TC2 biec przed testGuru99TC1. Użyj dependsOnMethods atrybut (lub dependsOnGroups (do łańcuchowania na poziomie grupy) w celu ustalenia tej kolejności. W przypadku szerszego framework automatyzacji projekt, porównanie JUnit vs TestNGi przejrzyj znajdźElement odniesienie, jeśli Twoje testy zależne współdzielą lokalizatory.

testng.xml (zależy od metod)
<?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 name="testGuru99TC1" dependsOnMethods="testGuru99TC2"/>
        <include name="testGuru99TC2"/>
      </class>
    </classes>
  </test>
</suite>

TestNG środowisko wykonawcze, hostowane w testng.org, ocenia te deklaracje przed uruchomieniem wątków, więc metody zależne zawsze rozpoczynają się po zakończeniu ich wymagań wstępnych.

FAQ

Sesja to unikalny identyfikator sesji generowany za każdym razem, gdy tworzona jest nowa instancja WebDriver. Każde polecenie z tego sterownika kieruje do odpowiedniej sesji przeglądarki, izolując jeden test od drugiego.

Atrybut równoległy w tagu pakietu akceptuje testy, klasy, metody lub wystąpienia. TestNG tworzy wiele wątków (ustawianych za pomocą parametru thread-count) i uruchamia wybraną jednostkę równolegle, co skraca całkowity czas wykonywania.

Użyj atrybutu dependsOnMethods wewnątrz znacznika include pliku testng.xml lub @Test(dependsOnMethods = “name”) w kodzie. TestNG najpierw uruchamia test wymagany wstępnie i pomija test zależny w przypadku niepowodzenia.

Narzędzia AI grupują powiązane testy, przewidują optymalną liczbę wątków na podstawie poprzednich czasów wykonania oraz zmieniają kolejność pakietów, tak aby wolniejsze testy były uruchamiane jako pierwsze, skracając tym samym całkowity czas potrzebny na kompilację.

Tak. Sztuczna inteligencja analizuje wykresy wywołań i historię błędów, aby sugerować powiązania dependOnMethods, sygnalizować zależności cykliczne i proponować bezpieczne grupy równoległe, zmniejszając tym samym konieczność ręcznej obsługi pliku testng.xml.

Podsumuj ten post następująco: