Automatizovane testy

Sekcia o programovaní, programovacích jazykoch...
Používateľov profilový obrázok
gammaray
Administrátor
Administrátor
Príspevky: 7117
Dátum registrácie: Po 23. Okt, 2006, 02:00
Bydlisko: Kysucké Nové Mesto

Automatizovane testy

Príspevok od používateľa gammaray »

Caute.

Potrebujem automatizovane otestovat slider - https://demoqa.com/slider
Ako mam s nim pohnut ked to chcem automatizovat pomocou Selenide? Nechcem pouzivat Actions cez Selenium.

Nasiel som nejaky js script TU:
toto je uz vlozeny CSS selector do kodu - #sliderContainer > div.col-9 > span > input
Selector som okopiroval priamo zo stranky cez Devtools. Nic to nespravi, co je zle?

Kód: Vybrať všetko

    void setValueSlider(int value) {
        executeJavaScript(
                "$('#sliderContainer > div.col-9 > span > input').data('slider').value[0] = arguments[0];" +
                        "$('#sliderContainer > div.col-9 > span > input').triggerHandler('slide');",
                value
        );
Dalsia vec.
Ako mam zastavit progress bar ked ja nacitany napr. do 20% ??? - https://demoqa.com/progress-bar

Skusal som to cez if() ale neviem preco to nejde. Okamzite mi test prejde, vobec necaka. Co som tam dal zle???

Kód: Vybrať všetko

    @Test
    public void progressBar()  {
        int a = Integer.parseInt(Objects.requireNonNull($("#progressBar > div").getAttribute("aria-valuenow")));
        for (int i = 0; i < 1; i++) {
            $(By.id("startStopButton")).click();

            if (a == 20) {
                $(By.id("startStopButton")).click();
                System.out.println(a);
            }
        }
    }
ZOSTAVA CPU: AMD 5600x MB: GIGABYTE B550M AORUS PRO-P (rev. 1.0) Cooler CPU: SilentiumPC Fera 5 RAM: Crucial Ballistix Black 16GB (2x8GB) DDR4 3600MHz CL16 M.2 SSD NVME system: Samsung 980 1TB M.2 SSD NVME data: Samsung 980 1TB DVD RW: Samsung SH-S183A GPU: GeForce RTX™ 3070 GAMING OC 8G (rev. 2.0) PSU: CORSAIR RM750x PSU 750W 80+ Gold 2021 Monitor: LG 32GK850F CASE: Fractal Design Define Mini Headset: KOSS SB/45 Repro: Fluid Audio F5 Myš: Logitech G Pro Klávesnica: Corsair K68 RGB OS: Windows 10 Pro 64bit
Používateľov profilový obrázok
Danix64
Používateľ
Používateľ
Príspevky: 1081
Dátum registrácie: Po 12. Máj, 2008, 14:00
Bydlisko: Košice (04011)

Re: Automatizovane testy

Príspevok od používateľa Danix64 »

pred tym vnutornym IFakom (if (a == 20)...) sa ti stale v cykle vykona kliknutie na ten button a to je blbost, toto treba dat von pred cyklus

a mozno pomoze tam dat nejaky kratky wait (napr. v stovkach milisekund) pre zastavenie progressbaru pri pozadovanej hodnote
Spoiler: ukázať
fanless PC: Ryzen 5 5600G, 32GB RAM, 2x2TB SSD (12-15W idle)
fanless secondary miniPC: Intel N6005, 16GB RAM, 2TB SSD (<5W idle)
fanless small home server: Odroid H3 (Unraid), Raspberry Pi 4 (Debian/DietPi)
Používateľov profilový obrázok
gammaray
Administrátor
Administrátor
Príspevky: 7117
Dátum registrácie: Po 23. Okt, 2006, 02:00
Bydlisko: Kysucké Nové Mesto

Re: Automatizovane testy

Príspevok od používateľa gammaray »

Potom to ale neklikne na button a nenastartuje bar. Aj ked to dam prec test hned prejde na nic necaka.

skusal som aj toto

Kód: Vybrať všetko

    @Test
    public void progressBar() throws InterruptedException {
        $(By.id("startStopButton")).click();
        int a = Integer.parseInt(Objects.requireNonNull($("#progressBar > div").getAttribute("aria-valuenow")));

        if (a == 20) {
            $(By.id("startStopButton")).click();
            System.out.println(a);
        }
Ano je take riesenie ze:

Kód: Vybrať všetko

$(By.id("startStopButton")).click();
Thread.sleep(2000)
$(By.id("startStopButton")).click();
Ale to je naprd, take skolkarske o to zaujem nemam. Chcem aby citalo hodnotu z toho atributu a ked dosiahne pozadovanu hodnotu klikne na button.
ZOSTAVA CPU: AMD 5600x MB: GIGABYTE B550M AORUS PRO-P (rev. 1.0) Cooler CPU: SilentiumPC Fera 5 RAM: Crucial Ballistix Black 16GB (2x8GB) DDR4 3600MHz CL16 M.2 SSD NVME system: Samsung 980 1TB M.2 SSD NVME data: Samsung 980 1TB DVD RW: Samsung SH-S183A GPU: GeForce RTX™ 3070 GAMING OC 8G (rev. 2.0) PSU: CORSAIR RM750x PSU 750W 80+ Gold 2021 Monitor: LG 32GK850F CASE: Fractal Design Define Mini Headset: KOSS SB/45 Repro: Fluid Audio F5 Myš: Logitech G Pro Klávesnica: Corsair K68 RGB OS: Windows 10 Pro 64bit
Používateľov profilový obrázok
Danix64
Používateľ
Používateľ
Príspevky: 1081
Dátum registrácie: Po 12. Máj, 2008, 14:00
Bydlisko: Košice (04011)

Re: Automatizovane testy

Príspevok od používateľa Danix64 »

no ved ja som myslel tak, ze na zaciatku to treba manualne startnut (cize urobi sa klik na button pred cyklom) a tym sa zacne progressbar nacitavat od nuly do 100%. Hned za tym sa v cykle bude kontrolovat aktualna hodnota progressbaru a ked dosiahne pozadovanu hodnotu, tak cyklus sa ukonci a znovu sa stlaci potrebny button.
V tom cykle by kludne mohol byt kratky wait (ako som pisal) aby sa nekontroloval 1000x za sekundu stav co je zbytocne.
Spoiler: ukázať
fanless PC: Ryzen 5 5600G, 32GB RAM, 2x2TB SSD (12-15W idle)
fanless secondary miniPC: Intel N6005, 16GB RAM, 2TB SSD (<5W idle)
fanless small home server: Odroid H3 (Unraid), Raspberry Pi 4 (Debian/DietPi)
Používateľov profilový obrázok
gammaray
Administrátor
Administrátor
Príspevky: 7117
Dátum registrácie: Po 23. Okt, 2006, 02:00
Bydlisko: Kysucké Nové Mesto

Re: Automatizovane testy

Príspevok od používateľa gammaray »

Manualne nechcem robit nic, lebo to ma byt automatizovany test. Ten manualny klik ako pises sa robi aj tak na zaciatku testu (bar sa spusti na zaciatku) to nieje problem, potom nasleduje premenna "a" do ktorej sa zapise int hodnota atributu. Tam sa zapise hned 0 lebo ono to ide okamzite. Nasledne nasleduje if() ktory ma podmienku ze premenna "a" sa ma rovnat 20 a ked to dosiahne ma sa spustit kliknutie na button a potom sa hodnota vypise do konzoly.

Ale zrejme sa to takto nema robit, neviem. Skratka to nejde. Akurat mam z toho nervy. Podla mna je problem v tom ze on nevie kedy ma premenna "a" hodnotu 20. Nie ze to kontroluje 1000x za sekundu, on to vobec nekontroluje. A aj to ako casto sa Selenide pozera na stranku sa da nastavit. Default je 200ms. Skratka pustim test a po kliknuti na button test ohlasi ze vsetko je ok.

Kód: Vybrať všetko

@Test
    public void progressBar() throws InterruptedException {
        $(By.id("startStopButton")).click();
        int a = Integer.parseInt(Objects.requireNonNull($("#progressBar > div").getAttribute("aria-valuenow")));

        if (a == 20) {
            $(By.id("startStopButton")).click();
            System.out.println(a);
        }
ZOSTAVA CPU: AMD 5600x MB: GIGABYTE B550M AORUS PRO-P (rev. 1.0) Cooler CPU: SilentiumPC Fera 5 RAM: Crucial Ballistix Black 16GB (2x8GB) DDR4 3600MHz CL16 M.2 SSD NVME system: Samsung 980 1TB M.2 SSD NVME data: Samsung 980 1TB DVD RW: Samsung SH-S183A GPU: GeForce RTX™ 3070 GAMING OC 8G (rev. 2.0) PSU: CORSAIR RM750x PSU 750W 80+ Gold 2021 Monitor: LG 32GK850F CASE: Fractal Design Define Mini Headset: KOSS SB/45 Repro: Fluid Audio F5 Myš: Logitech G Pro Klávesnica: Corsair K68 RGB OS: Windows 10 Pro 64bit
Používateľov profilový obrázok
gammaray
Administrátor
Administrátor
Príspevky: 7117
Dátum registrácie: Po 23. Okt, 2006, 02:00
Bydlisko: Kysucké Nové Mesto

Re: Automatizovane testy

Príspevok od používateľa gammaray »

Ok, vyriesil som to. Takze takto. Na zaciatok sa klikne na start button, potom nasleduje fori cyklus (iteracia). Musel som dat az 300 opakovani cyklu aby mal progress bar cas sa dostat na 20%. Pokial som tam mal nejake nizsie cislo tak pocet opakovani skoncilo skor ako progress bar dosiahol 20%. Cize na if() sa test vysral kedze nikdy nenastal. Nasledne if() spravil co som mu zadal, klikol znova na start button resp. stop a vypisal do konzoly cislo 20. :OO=

A mozno existuje aj uhladenejsie riesenie ako toto, ja som zaciatocnik v tomto, neviem.

Kód: Vybrať všetko

    @Test
    public void progressBar() {
        $(By.id("startStopButton")).click();
        for (int i = 0; i < 300; i++) {
            int a = Integer.parseInt(Objects.requireNonNull($("#progressBar > div").getAttribute("aria-valuenow")));
            if (a >= 20) {
                $(By.id("startStopButton")).click();
                System.out.println(a);
                break;
            }
        }
    }

A co s tym sliderom co som pisal v prvom poste? Vie niekto?
ZOSTAVA CPU: AMD 5600x MB: GIGABYTE B550M AORUS PRO-P (rev. 1.0) Cooler CPU: SilentiumPC Fera 5 RAM: Crucial Ballistix Black 16GB (2x8GB) DDR4 3600MHz CL16 M.2 SSD NVME system: Samsung 980 1TB M.2 SSD NVME data: Samsung 980 1TB DVD RW: Samsung SH-S183A GPU: GeForce RTX™ 3070 GAMING OC 8G (rev. 2.0) PSU: CORSAIR RM750x PSU 750W 80+ Gold 2021 Monitor: LG 32GK850F CASE: Fractal Design Define Mini Headset: KOSS SB/45 Repro: Fluid Audio F5 Myš: Logitech G Pro Klávesnica: Corsair K68 RGB OS: Windows 10 Pro 64bit
Používateľov profilový obrázok
Danix64
Používateľ
Používateľ
Príspevky: 1081
Dátum registrácie: Po 12. Máj, 2008, 14:00
Bydlisko: Košice (04011)

Re: Automatizovane testy

Príspevok od používateľa Danix64 »

oj, sorry, zle som sa vyjadril, myslel som to manualne v teste ako

Kód: Vybrať všetko

$(By.id("startStopButton")).click();
:D

k tomu cyklu, zmen ho na while (alebo do while), kde podmienka bude ci a<20

update:
takto nejak, skusil som to naslepo napisat:

Kód: Vybrať všetko

@Test
public void progressBar() {
    $(By.id("startStopButton")).click();
    int a;
    do {
        a = Integer.parseInt(Objects.requireNonNull($("#progressBar > div").getAttribute("aria-valuenow")));
        System.out.println("a = " + a);
    }
    while (a < 20);
    $(By.id("startStopButton")).click();
}
ale existuju aj elegantnejsie riesenia, popozeraj metody waitUntil, neviem ci to ma selenide, ale urcite nieco take by malo mat
Naposledy upravil/-a Danix64 v St 01. Dec, 2021, 21:29, upravené celkom 1 krát.
Spoiler: ukázať
fanless PC: Ryzen 5 5600G, 32GB RAM, 2x2TB SSD (12-15W idle)
fanless secondary miniPC: Intel N6005, 16GB RAM, 2TB SSD (<5W idle)
fanless small home server: Odroid H3 (Unraid), Raspberry Pi 4 (Debian/DietPi)
buci
Nový používateľ
Nový používateľ
Príspevky: 40
Dátum registrácie: Pi 18. Júl, 2014, 22:31
Bydlisko: Sabinov

Re: Automatizovane testy

Príspevok od používateľa buci »

Este k tomu progressbaru:
mozno budem offtopic, lebo som nikdy nerobil webovu automatizaciu, ale ty len potrebujes zavolat nejaku metodu pre podmieneny wait nad elementom progressbar.

Kód: Vybrať všetko

$(By.id("startStopButton"))
toto je objekt akeho typu? SelenideElement? ak ano, tak podla mna si staci rovnako vytvorit element pre progressbar a nad nim zavolat metodu shouldHave()
mozno nieco take?

Kód: Vybrať všetko

$(By.id("startStopButton")).click();
$(By.id("progressbar")).shouldHave(Condition.attribute("aria-valuenow", 20));	//treba sa pohrat s najdenim spravneho elementu
$(By.id("startStopButton")).click();
Používateľov profilový obrázok
Danix64
Používateľ
Používateľ
Príspevky: 1081
Dátum registrácie: Po 12. Máj, 2008, 14:00
Bydlisko: Košice (04011)

Re: Automatizovane testy

Príspevok od používateľa Danix64 »

ano, tak ako pise buci, prave som nasiel, ze selenide ma na to sikovnu metodu nad jeho elementom shouldHave.
cize asi nejak takto:

Kód: Vybrať všetko

$("#progressBar > div").shouldHave(attribute(“aria-valuenow”, “20”));
tento riadok kodu pocka kym atribut aria-valuenow bude mat hodnotu 20.
Ako dlho bude selenide cakat zavisi zrejeme od jeho konfiguracie

a metodu atttribute si importni (cez static import) z com.codeborne.selenide.Condition

vychadzal som podla dokumentacie: https://selenide.org/documentation.html
Spoiler: ukázať
fanless PC: Ryzen 5 5600G, 32GB RAM, 2x2TB SSD (12-15W idle)
fanless secondary miniPC: Intel N6005, 16GB RAM, 2TB SSD (<5W idle)
fanless small home server: Odroid H3 (Unraid), Raspberry Pi 4 (Debian/DietPi)
Používateľov profilový obrázok
gammaray
Administrátor
Administrátor
Príspevky: 7117
Dátum registrácie: Po 23. Okt, 2006, 02:00
Bydlisko: Kysucké Nové Mesto

Re: Automatizovane testy

Príspevok od používateľa gammaray »

Ano viem o shouldHave a pod, ale toto nefunguje skusal som to. Dal som mu aj vacsi timeout aby mal cas, lenze neberie to. Selenide sa diva na stranku kazdych 200ms takze tych 20 by mal zistit, ale ee.

EDIT:

Pozeral som v konzole ze sa snazi citat hodnotu atributu, ale kedze cakanie ma defaultne 4s tak do konzoly vypise cislo 39 to je cislo na konci jeho cakania. On aj na rozdiel jeho pollinIntervalu 200ms to nedokaze. Lenze nastavil som mu tento pollingInterval na 20ms a uz to dokaze zachytit. Takze funguje aj shouldHave podmienka na ten atribut. Ovela cistejsi je ten test, diky :good:

A tvoje "do while" funguje tiez.
ZOSTAVA CPU: AMD 5600x MB: GIGABYTE B550M AORUS PRO-P (rev. 1.0) Cooler CPU: SilentiumPC Fera 5 RAM: Crucial Ballistix Black 16GB (2x8GB) DDR4 3600MHz CL16 M.2 SSD NVME system: Samsung 980 1TB M.2 SSD NVME data: Samsung 980 1TB DVD RW: Samsung SH-S183A GPU: GeForce RTX™ 3070 GAMING OC 8G (rev. 2.0) PSU: CORSAIR RM750x PSU 750W 80+ Gold 2021 Monitor: LG 32GK850F CASE: Fractal Design Define Mini Headset: KOSS SB/45 Repro: Fluid Audio F5 Myš: Logitech G Pro Klávesnica: Corsair K68 RGB OS: Windows 10 Pro 64bit
Používateľov profilový obrázok
gammaray
Administrátor
Administrátor
Príspevky: 7117
Dátum registrácie: Po 23. Okt, 2006, 02:00
Bydlisko: Kysucké Nové Mesto

Re: Automatizovane testy

Príspevok od používateľa gammaray »

Vie mi niekto povedat preco mi to nejde? Co mam opravit?

Vypis konzoly:
Spoiler: ukázať
"C:\Program Files\Java\jdk1.8.0_301\bin\java.exe"
Exception in thread "main" java.lang.NoClassDefFoundError: org/openqa/selenium/remote/internal/JsonToWebElementConverter
at Appium.Appiumtest.openCalculator(Appiumtest.java:36)
at Appium.Appiumtest.main(Appiumtest.java:17)
Caused by: java.lang.ClassNotFoundException: org.openqa.selenium.remote.internal.JsonToWebElementConverter
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 2 more
Kod:
Spoiler: ukázať
package Appium;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.net.MalformedURLException;
import java.net.URL;

public class Appiumtest {

static AndroidDriver<MobileElement> driver;

public static void main(String[] args) {
try {
openCalculator();
} catch (Exception e) {
e.getMessage();
e.getCause();
e.printStackTrace();
}
}

public static void openCalculator() throws Exception {
DesiredCapabilities cap = new DesiredCapabilities();
cap.setCapability("deviceName", "Oneplus 6");
cap.setCapability("udid", "cef1d951");
cap.setCapability("platformName", "Android");
cap.setCapability("platformVersion", "11.1.2.2");

cap.setCapability("appPackage", "com.oneplus.calculator");
cap.setCapability("appActivity", "com.oneplus.calculator.Calculator");

URL url = new URL("http://127.0.0.1:4723/wd/hub");
driver = new AndroidDriver<MobileElement>(url, cap);

System.out.println("Application started.....");
}
}
Postupoval som podla https://www.youtube.com/watch?v=N7vY3cP ... hk&index=8 a jemu to chybu nehadze. Pouzivam IntelliJ Idea

PS: Vyriesene, nekompatibilita verzii Appium a Selenium. https://github.com/appium/java-client/issues/1273
ZOSTAVA CPU: AMD 5600x MB: GIGABYTE B550M AORUS PRO-P (rev. 1.0) Cooler CPU: SilentiumPC Fera 5 RAM: Crucial Ballistix Black 16GB (2x8GB) DDR4 3600MHz CL16 M.2 SSD NVME system: Samsung 980 1TB M.2 SSD NVME data: Samsung 980 1TB DVD RW: Samsung SH-S183A GPU: GeForce RTX™ 3070 GAMING OC 8G (rev. 2.0) PSU: CORSAIR RM750x PSU 750W 80+ Gold 2021 Monitor: LG 32GK850F CASE: Fractal Design Define Mini Headset: KOSS SB/45 Repro: Fluid Audio F5 Myš: Logitech G Pro Klávesnica: Corsair K68 RGB OS: Windows 10 Pro 64bit

Návrat na "Programovanie"