From 003b5a66064139333761045636f81573af421127 Mon Sep 17 00:00:00 2001 From: brumlablo Date: Wed, 8 Apr 2026 14:51:19 +0200 Subject: [PATCH 1/3] run headless tests on pr and in main --- .github/workflows/ci.yml | 32 +++++++++++++++++++ .gitignore | 3 +- .../automation/WebDriverProvider.java | 28 +++++++++++++++- 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..d4d4755 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,32 @@ +name: CI + +on: + push: + branches: + - main + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Java 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + cache: maven + + - name: Run tests + run: mvn test --no-transfer-progress -Dheadless=true + + - name: Upload failed screenshots + if: failure() + uses: actions/upload-artifact@v4 + with: + name: failed-screenshots + path: failedScreenshots/ + if-no-files-found: ignore diff --git a/.gitignore b/.gitignore index 32cbd76..1a766c2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ /target/ /.idea/ -/failedScreenshots/ \ No newline at end of file +/failedScreenshots/ +.vscode/settings.json diff --git a/src/main/java/cz/czechitas/automation/WebDriverProvider.java b/src/main/java/cz/czechitas/automation/WebDriverProvider.java index 901535c..b49d0d3 100644 --- a/src/main/java/cz/czechitas/automation/WebDriverProvider.java +++ b/src/main/java/cz/czechitas/automation/WebDriverProvider.java @@ -5,6 +5,7 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.edge.EdgeOptions; +import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.safari.SafariOptions; import javax.annotation.Nonnull; @@ -25,6 +26,10 @@ private WebDriverProvider() { throw new UnsupportedOperationException("Unable to instantiate class with only static methods."); } + private static final boolean HEADLESS = Boolean.parseBoolean( + System.getProperty("headless", String.valueOf("true".equalsIgnoreCase(System.getenv("CI")))) + ); + /** * Get new instance of the selenium {@link WebDriver}. * The given instance is dependent on web browsers installed on your computer and @@ -33,12 +38,21 @@ private WebDriverProvider() { * - Chrome * - Edge * + *

Headless mode is enabled automatically when running in CI (env {@code CI=true}) + * or when the system property {@code headless=true} is set.

+ * * @return web driver instance */ @Nonnull public static WebDriver getWebDriver() { try { - return WebDriverManager.firefoxdriver().create(); + FirefoxOptions options = new FirefoxOptions(); + if (HEADLESS) { + options.addArguments("--headless"); + options.addArguments("--width=1920"); + options.addArguments("--height=1080"); + } + return WebDriverManager.firefoxdriver().capabilities(options).create(); } catch (WebDriverManagerException exception) { return createChromeDriver(); } @@ -48,6 +62,12 @@ private static WebDriver createChromeDriver() { try { ChromeOptions options = new ChromeOptions(); options.addArguments("--remote-allow-origins=*"); + options.addArguments("--window-size=1920,1080"); + if (HEADLESS) { + options.addArguments("--headless=new"); + options.addArguments("--no-sandbox"); + options.addArguments("--disable-dev-shm-usage"); + } return WebDriverManager.chromedriver().capabilities(options).create(); } catch (WebDriverManagerException exception1) { return createEdgeDriver(); @@ -58,6 +78,12 @@ private static WebDriver createEdgeDriver() { try { EdgeOptions options = new EdgeOptions(); options.addArguments("--remote-allow-origins=*"); + options.addArguments("--window-size=1920,1080"); + if (HEADLESS) { + options.addArguments("--headless=new"); + options.addArguments("--no-sandbox"); + options.addArguments("--disable-dev-shm-usage"); + } return WebDriverManager.edgedriver().capabilities(options).create(); } catch (WebDriverManagerException exception1) { return createSafariDriver(); From 222d18b65e3927914cfaa545f1017cff63d1b35b Mon Sep 17 00:00:00 2001 From: brumlablo Date: Wed, 8 Apr 2026 14:52:53 +0200 Subject: [PATCH 2/3] tasks --- practice/tasks.txt | 75 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 practice/tasks.txt diff --git a/practice/tasks.txt b/practice/tasks.txt new file mode 100644 index 0000000..0e4ab18 --- /dev/null +++ b/practice/tasks.txt @@ -0,0 +1,75 @@ +tasks 1 +-------- +Navigace +1. Napište test, který přejde do sekce Pro rodiče -> Návody a formuláře. +2. Napište test, který přejde do sekce Pro učitelé -> Objednávka pro MŠ/ZŠ a jako +objednávanou službu v dolní části obrazovky zvolí Příměstský tábor. +3. Napište test, který pustupně projde všechny sekce horního veřejného menu. +4. Napište test, který přejde do sekce Pro učitelé -> Objednávka pro MŠ/ZŠ a do +políčka pro IČO vyplní IČO organizace czechitas. +5. Vytvořte si v aplikaci vlastního uživatele, pomocí kterého se budete následně +přihlašovat do aplikace. POZOR uživatele vytvořte ručně. Proč nemůžeme uživatele +vytvářet pomocí testu? Zamyslete se nad tím, jak by se dali uživatelé vytvářet +v testech? +6. Přihlaste se do aplikace pod Vámi nově vytvořeným uživatelem. Klikněte na +vytvoření nové přihlášky. Vyberte období programování a nakonec klikněte na +vytvoření přihlášky. Výsledkem navigace by měla být obrazovka s formulářem pro +založení přihlášky. + +Assertace +1. Ověřte, že na úvodní stránce se nachází „dlaždice“ Programování. +2. Ověřte, že pokud jde uživatel do sekce pro vytváření přihlášky pro rodiče (Pro rodiče +-> Vytvořit přihlášku) a není přihlášen, je na obrazovce k dispozici tlačítko pro +registraci. +3. V aplikaci se přihlaště pod Vámi založeným uživatel a ručně si vytvořte libovolnou +přihlášku. +4. Napište test, který provede přihlášení Vámi založeným uživatelem, otevře detail +první přihlášky v seznamu přihlášek a zkontroluje, že způsob úhrady odpovídá +způsobu úhrady, který jste zadali při jejím zakládání. + +tasks 2 +--------- +Opakování (Navigace) +1. Napište test, který přejde do sekce Pro učitelé -> Objednávka pro MŠ/ZŠ, vyplní do pole IČO +libovolné existující IČO a v dolní části formuláře se přepne na záložku Škola v přírodě, kde do +pole Počet dětí vyplní libovolný počet dětí. +Opakování (Assertace) +1. Napište test, který se přihlásí do aplikace, přejde pomocí horního menu do sekce Přihlášky a +ověří, že v tabulce přihlášek jsou sloupce pojmenované Jméno a Kategorie. +Komplexnější testy +1. Napište test, který bude plnit následující posloupnost úkonů: +a. Přihlaste se do aplikace +b. Přejděte pomocí horního menu do sekce Přihlášky +c. Klikněte zde na tlačítko Vytvořit novou přihlášku. +d. Vyberte období akce programování +e. Klikněte na tlačítko Vytvořit přihlášku pro akcí JavaScript a NodeJS. +f. Vyplňte pole ve formuláři (Termín, Křestní jméno, Příjmení, Datum narození, +Poznámka) pro vytvoření přihlášky (Jako způsob platby zvolte možnost hotově) a na +závěr přihlášku vytvořte. +g. Ověřte, že nově vytvořená přihláška má Vámi nastavené hodnoty (Termín, Křestní +jméno, Příjmení, Datum narození, Poznámka) správně uložené. +2. Vytvořte ručně přihlášku, kde jako příjmení žáka uveďte Tester001. (Toto jméno by v rámci +testovacích dat mělo být unikátní). +3. Napište test, který bude plnit následující posloupnost úkonů: +a. Přihlaste se do aplikace +b. Přejděte pomocí horního menu do sekce Přihlášky +c. Do vyhledávacího pole nad tabulkou přihlášek zadejte příjmení žáka z +předcházejícího úkolu +d. Pro vyhledanou přihlášku zvolte možnost upravit a nastavte způsob platby na +Bankovní převod +e. Uložte otevřenou přihlášku +f. Opět pomocí vyhledávacího pole nad tabulkou vyhledejte příjmení žáka z +předchozího úkolu +g. Pro vyhledanou přihlášku otevřete její detail +h. Ověřte, že způsob platby je nastaven na Bankovní převod +i. Ověřte, že zbývající částka k uhrazení je 1 800 Kč +j. Ověřte, že zpráva pro příjemce obsahuje příjmení žáka z předchozího úkolu +4. Vytvořte ručně druhého uživatele, pomocí kterého se budete moci přihlásit +5. Prodiskutujte s lektorem nebo kouči, jak se dá v Java programu uložit hodnota k +opakovanému použití. +6. Přihlaste se pod jedním z Vámi založených uživatelů a vytvořte přihlášku pro žáka s náhodně +vygenerovaným příjmením (lze použít metodu prohlizec.vygenerujNahodnePrijmeni()). +Ověřte, že v tabulce přihlášek nově založená přihláška skutečně existuje. Následně se +odhlaste a přihlaste pod druhým uživatelem. Nyní ověřte, že se přihláška prvního uživatele +nezobrazuje mezi přihláškami uživatele druhého. +7. Napište test, který ověří, že v aplikaci funguje funkcionalita změny hesla. From b1859f1be262473bb511ea63dca081ec7a8d9b8d Mon Sep 17 00:00:00 2001 From: Barbora Blo Date: Wed, 8 Apr 2026 15:33:06 +0200 Subject: [PATCH 3/3] Update practice/tasks.txt Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- practice/tasks.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/practice/tasks.txt b/practice/tasks.txt index 0e4ab18..140c2d3 100644 --- a/practice/tasks.txt +++ b/practice/tasks.txt @@ -4,7 +4,7 @@ Navigace 1. Napište test, který přejde do sekce Pro rodiče -> Návody a formuláře. 2. Napište test, který přejde do sekce Pro učitelé -> Objednávka pro MŠ/ZŠ a jako objednávanou službu v dolní části obrazovky zvolí Příměstský tábor. -3. Napište test, který pustupně projde všechny sekce horního veřejného menu. +3. Napište test, který postupně projde všechny sekce horního veřejného menu. 4. Napište test, který přejde do sekce Pro učitelé -> Objednávka pro MŠ/ZŠ a do políčka pro IČO vyplní IČO organizace czechitas. 5. Vytvořte si v aplikaci vlastního uživatele, pomocí kterého se budete následně