Pipeline: Push → GitHub Actions:
checkout → setup java → maven build → selenium tests → jacoco coverage → sonar analysis
Tartalomjegyzék
- Források
- Seleniumról általánosságban
- Előkészületek
- Codacy beállítása
- GitHub Actions
- Első tesz
- Weboldalak, amiket lehet tesztelni
- Selenium WebDriver + Java Cheat Sheet
- AssertJ
- Act
- Local teszthez és githez puska
https://www.youtube.com/watch?v=HpL6EX2kjq4
Gemini és ChatGPT
https://www.youtube.com/watch?v=XyBxEnyBb0A
https://devhints.io/xpath
https://www.geeksforgeeks.org/software-testing/xpath-locators/
https://www.geeksforgeeks.org/software-testing/introduction-to-junit-5/
https://testrigor.com/blog/how-to-resolve-timeoutexception-in-selenium/
A Selenium egy széles körben elterjedt, nyílt forráskódú tesztautomatizálási keretrendszer, amelyet főként webes alkalmazások felhasználói felületének (UI) tesztelésére használnak.
A Selenium IDE egy böngészőbe épülő kiegészítő, amely a legegyszerűbb automatizálási megoldások közé tartozik. A működése a „record & playback” elven alapul, vagyis a felhasználó által manuálisan végrehajtott lépéseket rögzíti, majd később ezeket automatikusan képes újrajátszani. Használatához nem feltétlenül szükséges programozási ismeret, azonban szkriptalapú nyelveket is támogat. Hátránya, hogy több korlátozással rendelkezik, így összetettebb tesztelésre kevésbé alkalmas.
A Selenium WebDriver egy programozás alapú megoldás UI tesztek automatizálására. Egy olyan API-t biztosít, amely lehetővé teszi, hogy különböző programozási nyelveken (pl. Java, C#, Python) írjunk teszteket, amelyek böngészőket vezérelnek. Közvetlen kapcsolatot létesít a böngészővel, így gyors és rugalmas végrehajtást biztosít. Széles körben elfogadott ipari szabványnak számít, és a legtöbb modern böngészővel kompatibilis.
A Selenium Grid egy olyan infrastruktúra, amely lehetővé teszi a tesztek párhuzamos futtatását különböző környezetekben. Segítségével a tesztek több gépen és több böngészőn egyszerre hajthatók végre, ami jelentősen felgyorsítja a tesztelési folyamatot és támogatja a skálázhatóságot.
VS Code kiegészőt töltsd le: Extension Pack for Java
Ctrl+Shift+P -> Írd be: Java: Create Java Project. -> Válaszd a Maven opciót, majd az maven-archetype-quickstart-ot. -> Legújabb verzió. -> Nevezd el a projektet. A megnyíló ablakon navigálj el oda ahova a projektedet szeretném, ne hozz neki ülön létre mappát. Majd nyomj pár entert a terminálba.
Terminálba -> git init
A .gitignore fájlt hozd létre és írd bele ezt:
# =========================
# Java compiled files
# =========================
*.class
# =========================
# Maven
# =========================
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
# =========================
# IntelliJ IDEA
# =========================
.idea/
*.iml
out/
# =========================
# Eclipse
# =========================
.project
.classpath
.settings/
.metadata/
bin/
# =========================
# VS Code
# =========================
.vscode/
# =========================
# OS files
# =========================
.DS_Store
Thumbs.db
# =========================
# Logs
# =========================
*.log
# =========================
# Selenium / test outputs
# =========================
screenshots/
reports/
allure-results/
allure-report/
# =========================
# Sonar
# =========================
.scannerwork/
.sonar/
# =========================
# Coverage
# =========================
coverage/
jacoco.exec
# =========================
# Temporary files
# =========================
*.tmp
*.temp
*.swp
# =========================
# Secrets
# =========================
.secretsTöltd fel a github.com-ra. A branch-t nevezd át main-re.
A pom.xml-ben a dependencies részre ezt másold be:
<!-- Source: https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.18.1</version>
</dependency>
<!-- Source: https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager -->
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>6.3.3</version>
<scope>compile</scope>
</dependency>
<!-- Source: https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.12.2</version>
<scope>test</scope>
</dependency>
<!--Modern AssertJ használatához.-->
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.27.3</version>
<scope>test</scope>
</dependency>Nem szerepel semmi sem duplán a org.junit.jupiter-t töröld ki a függőségekből.
A dependencyManagement taget töröld, de a tartalma maradjon meg.
Ezt töröld belőle (JUnit 4):
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>x.x</version>
<scope>test</scope>
</dependency>maven-surefire-plugin-t cseréld le újabbra:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
<!--És ezt is töröld, a fenti legyen helyette -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>A maven-compiler-plugin fölé a plugin-ba ezt másold be:
<groupId>org.apache.maven.plugins</groupId>A pluginManagement taget töröld, de a tartalma maradjon meg.
A https://mvnrepository.com/-ról vannak a függőségek:
- Selenium Java
- WebDriverManager (bonigarcia)
- JUnit Jupiter (Aggregator)
A maven.compiler.release alá ezeket másold be. Ha nem java 21-es használsz akkor azt írd be.
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>Van még jó pár hasznos kiegészítő beállítva ezen projekt pom.xml-be, javalott kimásolni. Ezek vannak benne a setup-ban: modern Selenium
- JUnit 5
- AssertJ
- Jacoco
- SonarCloud
- GitHub Actions
- Java 21
Utána ellenőrid le, hogy minden jól sikerült-e beállítani, terminálba (ctrl+shift+v -el tud másolni): mvn clean verify
Ha nincsen semmi piros hibaüzenet vagy warning, akkor jó.
Eclipse esetén:
A pom.xml-nél az első sorban ennél a linknél https helyett http legyen. http://maven.apache.org/xsd/maven-4.0.0.xsd
Projekten jobb klikk -> Build Path -> Configure Build Path -> Libraries -> ModulePath -> Jobb szélén Edit -> Java 21 -> Majd bal szélén katt a Java Compiler-re és Java 21.
Alapértelmezetten a workflow-k csak olvashatják a repódat. Mivel a jelvényeket be kell írniuk a mappádba, írási jogot kell adnod nekik:
Menj a GitHubon a Settings -> Actions -> General fülre.
Görgess le a Workflow permissions részig.
Jelöld be a Read and write permissions opciót, majd kattints a Save gombra.
codacy.com importáld be a repod, eltart egy ideig az importálás. Majd nyisd meg a repod a codacy-n és bal alul beállítások -> Codacy Badge-t másold ki és rakd a README.md fájlod tetejére.
És katt az Add badge to repository-ra.
A lenti workflow-kból választ ki, hogy melyiket szerenéd Sonar-al, vagy anélkül.
A github.com-on -> Actions -> Java with Maven. Katt a Configure gombra. Másold ki a .github/workflows/ci.yml tartalmát. A branch nevet és a java verziót csekkold le, ugyanannak kell lennie, mint a te projekted esetében, ha nem akkor módosítsd a workflow fájlt.
Felül nevezd át ci.yml-re.
Ezt módosítsd:
# =========================
# 5. Run Tests & Sonar Scan (ÖSSZEVONVA)
# =========================
# Egyszerre futtatja a teszteket headless módban.
- name: Run Tests and Sonar Scan
env:
HEADLESS: true
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: https://sonarcloud.io
# GitHub Secrets
LAMBDATEST_USERNAME: ${{ secrets.LT_USERNAME }}
LAMBDATEST_KEY: ${{ secrets.LT_ACCESS_KEY }}
# Hozzáadva a -e flag a részletes hibaüzenetekért
# -DrunTarget=cloud -> A DriverFactory osztálynak meg kell adni, hogyan futassa a teszteket.
run: mvn -B -e verify sonar:sonar -DrunTarget=cloud -Dsonar.projectKey=nagraggini_selenium-playground
Erre:
# =========================
# 5. Run Tests
# =========================
# Tesztek futtatása
- name: Run Tests
run: mvn -B verify -> Commit changes... gombra katt. Commit changes gombra katt.
sonarcloud.io-ra regisztrálj és importáld be a projektet. Utána Choose your Analysis Method: With GitHub Actions -> Az oldalon le van írva, hogyan állítsd be a secret token a github-on (Saját repod -> Settingy -> Secrets and Variables -> Actions -> Variables lapfül -> New environment secrets).
A projekted gyökér könyvtárában is csinálj egy .secrets fájl-t, amit hadj ki a .gitignore fájllal a verziókövetésből. Ezt írd bele: SONAR_TOKEN=a_te_sonar_cloud_tokened
Create or update a build file: Maven -> Configure -> És másold be azt a workflows-t,a mit a SonarCloud mutat, viszont a branch nevét (master/main) és a java verzióját javítsd át mindkét helyen.
A Java-version-t írd át arra amit a terminál kiír, amikor ezt írod bele: java -version
-> Commit changes-- gombra katt.
A projektben lévő workflow fájl profibban van megcsinálva ennél.
A test/java/../.. mappában lévő java fájlban láthatod az első tesztet.
WebDriver driver;
@Test
public void ElsoTeszt() {
//Ezzel nem jelenik meg a GUI, mert github actions-ben nincs ilyen, ha hagyod megjelenni, akkor a workflows el fog hasalni.
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless=new");
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--remote-allow-origins=*");
options.addArguments("--disable-gpu");
// A böngésző indítása
// Add át az opciókat a driver példányosításakor
driver = new ChromeDriver(options);
try {
// Navigáció egy oldalra
driver.get("https://www.google.hu");
// Kiírjuk az oldal címét ellenőrzésképpen
System.out.println("Az oldal címe: " + driver.getTitle());
} finally {
// Mindig zárjuk be a böngészőt a végén!
driver.quit();
}
}https://www.testmuai.com/selenium-playground https://automationexercise.com/test_cases http://www.uitestingplayground.com/ https://the-internet.herokuapp.com/ https://www.saucedemo.com/
Ez a dokumentum a legfontosabb és leggyakrabban használt Java Selenium WebDriver parancsokat tartalmazza.
// WebDriver példányosítása (Chrome)
WebDriver driver = new ChromeDriver();
// Böngésző ablak maximalizálása
driver.manage().window().maximize();
// Böngésző ablak teljes képernyős módba tétele (F11)
driver.manage().window().fullscreen();
// Sütik (Cookies) törlése
driver.manage().deleteAllCookies();| Parancs | Leírás |
|---|---|
driver.get("url") |
Megnyitja a megadott URL-t a böngészőben. |
driver.navigate().to("url") |
Megnyitja az URL-t, de megőrzi a böngészési előzményeket. |
driver.navigate().back() |
Visszalép az előző oldalra. |
driver.navigate().forward() |
Előrelép a következő oldalra. |
driver.navigate().refresh() |
Frissíti (újratölti) az aktuális oldalt. |
driver.close() |
Bezárja az aktuálisan fókuszban lévő böngészőfület. |
driver.quit() |
Bezárja az összes ablakot és teljesen leállítja a WebDriver-t. |
Elemek kereséséhez a driver.findElement(By...) vagy driver.findElements(By...) metódusokat használjuk.
// ID alapján
WebElement elementById = driver.findElement(By.id("user-name"));
// Class (Osztály) név alapján
WebElement elementByClass = driver.findElement(By.className("btn-submit"));
// Name attribútum alapján
WebElement elementByName = driver.findElement(By.name("email"));
// HTML tag neve alapján
WebElement elementByTag = driver.findElement(By.tagName("h1"));
// Pontos link szöveg alapján
WebElement elementByLink = driver.findElement(By.linkText("Kapcsolat"));
// Részleges link szöveg alapján
WebElement elementByPartialLink = driver.findElement(By.partialLinkText("Kapcs"));
// CSS Selector használatával
WebElement elementByCss = driver.findElement(
By.cssSelector("div.container > input[type='text']")
);
// XPath használatával
//Chrome devtoolban az Elements lapfülön ctrl+f és írd be azt amit keresel pl.: //button[@id='submit-btn']
//Ha csak egy találatot ad ki, akkor jó az xpath-od.
WebElement elementByXpath = driver.findElement(
By.xpath("//button[@id='submit-btn']")
);Miután megtaláltál egy elemet, az alábbi parancsokkal vezérelheted vagy kérhetsz le róla információt.
WebElement element = driver.findElement(By.id("search-box"));
// Interakciók
element.click(); // Rákattintás
element.sendKeys("Keresendő szó"); // Szöveg beírása
element.clear(); // Beviteli mező kiürítése
element.submit(); // Űrlap (form) elküldése
// Információ lekérés az elemtől
String text = element.getText(); // Elem látható szövege
String value = element.getAttribute("value"); // HTML attribútum értéke
String cssValue = element.getCssValue("color"); // CSS tulajdonság értéke
// Állapot ellenőrzések (Boolean: true/false)
boolean isDisplayed = element.isDisplayed(); // Látható az oldalon?
boolean isEnabled = element.isEnabled(); // Aktív / kattintható?
boolean isSelected = element.isSelected(); // Be van jelölve?// Aktuális oldal címe (Title)
String pageTitle = driver.getTitle();
// Aktuális oldal pontos URL címe
String currentUrl = driver.getCurrentUrl();
// Az oldal teljes HTML forráskódja
String pageSource = driver.getPageSource();A szinkronizációs hibák elkerülése érdekében kötelező várakozásokat használni.
Egy adott elemre és konkrét feltételre vár (maximum a megadott ideig).
WebDriverWait wait = new WebDriverWait(
driver,
Duration.ofSeconds(10)
);
// Vár, amíg az elem kattinthatóvá nem válik
WebElement gomb = wait.until(
ExpectedConditions.elementToBeClickable(
By.id("submit")
)
);
gomb.click();
// Vár, amíg az elem láthatóvá nem válik
WebElement uzenet = wait.until(
ExpectedConditions.visibilityOfElementLocated(
By.id("success-msg")
)
);Globális beállítás, minden elemkeresésre érvényesül.
driver.manage()
.timeouts()
.implicitlyWait(Duration.ofSeconds(10));import org.openqa.selenium.support.ui.Select;
Select dropdown = new Select(
driver.findElement(By.id("orszag-valaszto"))
);
dropdown.selectByVisibleText("Magyarország");
dropdown.selectByValue("HU");
dropdown.selectByIndex(1);// Váltás a felugró ablakra
Alert alert = driver.switchTo().alert();
// Szöveg lekérése
String alertText = alert.getText();
// "OK" gomb
alert.accept();
// "Mégse" gomb
alert.dismiss();
// Szöveg beírása
alert.sendKeys("Szöveg");// Váltás az iframe-be index alapján
driver.switchTo().frame(0);
// Váltás az iframe-be ID alapján
driver.switchTo().frame("iframe-id");
// Visszaváltás a főoldalra
driver.switchTo().defaultContent();Olvashatóbb és erősebb assertion API.
assertThat(driver.getTitle()).isEqualTo("Automation Exercise");
assertThat(name).isNotNull();
assertThat(text).contains("Hello");
assertThat(list).hasSize(3);
assertThat(number).isGreaterThan(10);Lokálisan lehet veel tesztelni a workflow-t. Linux-os terminálos telepítés és ellenőrzés:
sudo snap remove act curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo sh -s -- -b /usr/local/bin
hash -r act --version act push --secret SONAR_TOKEN="a_te_tokened" //Írd át! act push -v -v --bind //Medium-t válaszd. Sokat kell, majd várni mire mindent letölt.
Új branch-et hozz létre!
Kijelölés: git add . Mentés: git commit -m "Fixed: " Feltöltés: git push
Csekkolás: git status
Local teszt terminálba: mvn clean test
Local build test terminálba: act push -v -v --bind