Aplikace určená k testování produkčních webů společnosti OKAY s.r.o.
K běhu aplikace je potřeba mít v počítači nainstalovaný Python 3.8 a vyšší. Také je potřeba splnit závislosti definované v souboru requirements.txt
. Testy běží v prohlížeči Google Chrome, je tedy potřeba mít nainstalovaný nejen tento prohlížeč, ale také aplikaci Chromedriver - dostupná zde.
Aplikaci stáhněte z tohoto repozitáře, případně vytvořte kopii repozitáře na svém počítači / serveru. Před prvním spuštěním je potřeba nainstalovat potřebné balíčky:
pip install -r requirements.txt
Následně je potřeba vytvořit kopii souboru config_sample.json
a změnit nastavení.
cp config_sample.json config.json
{
"defaults": {
"delay": 10, // čas mezi úkony (sec)
"is_headless": 0, // render v paměti (bool)
"is_email": 0, // notifikace email (bool)
"is_slack": 0, // notifikace slack (bool)
},
"secrets": {
"mail_to": "", // mail pro notifikaci
"mail_from": "", // google mail pro odesílání
"mail_password": "", // heslo k tomuto mailu
"slack_token": "", // API token do slacku
"slack_channel": "" // ID kanálu ve slacku
},
"creds": {
"www.okay.cz": { // url adresa eshopu
"sid": "", // id (středisko) prodejce
"pass": "" // osobní heslo prodejce
}
}
}
Pokud chcete testy spouštět automaticky, je potřeba nastavit CRON.
Součástí repozitáře je skript get_chromedriver.sh
, pomocí kterého snadno stáhnete a "nainstalujete" chromedriver, který je potřeba pro běh testů na linuxovém serveru. Pokud jej chcete použít, je potřeba jej nastavit jako spustitelný:
sudo chmod +x get_chromedriver.sh
Následně jej můžete použít takto:
sudo ./get_chromedriver.sh [DOWNLOAD_URL]
Místo [DOWNLOAD_URL]
je potřeba doplnit odkaz na aktuální verzi chromedriveru. Podle vaší verze prohlížeče jej najdete zde. Stejný postup potom použijete i v případě aktualizace chromedriveru.
Pro testování jsou k dispozici dvě třídy, a sice OkayTest
a JenaTest
- zvolte si tu, která odpovídá testované stránce. Testy píšete v Pythonu pomocí jednoduchých metod.
Příklad:
from okay_tests import OkayTest
test = OkayTest(name="okaysk_menu")
test.open_url(url="https://www.okay.sk/")
test.open_random_menu_items(3)
test.open_random_footer_items(3)
test.abort()
Při inicializaci testu je možno použít několik volitelných argumentů, které mohou změnit chování testu. Zde jsou nejdůležitější z nich:
test = OkayTest(
name="okaysk_menu", # vlastní název testu
theme="120943050794", # ID šablony v Shopify
is_mobile=True, # aktivuje emulátor mobilu
delay=5 # změní výchozí čas mezi úkony
)
Všechny níže uvedené metody jsou použitelné jak pro třídu OkayTest
i JenaTest
.
Zavře prohlížeč a ukončí probíhající test.
test.abort()
Přidá aktuální produkt do košíku. Aby metoda fungovala, musí se test zrovna nacházet na detailu nějakého produktu.
test.add_to_cart()
Porovná hodnotu css stylu daného html elementu. Používá se pro kontrolu správného načtení css souboru.
test.check_css(element=".header--search-focus", style="background-color", value="rgba(26, 77, 150, 1)")
Všechny argumenty jsou povinné.
Pokusí se zaškrtnout konkrétní druhy pojištění v košíku a následně vytvoří printscreen košíku. Je potřeba definovat pojištění jako list
(pole) obsahující product ID
těchto pojištění.
test.check_insurances(insurances=["6797255966762", "6797255901226"])
test.check_insurances(insurances=["6797255573546"])
Argument insurances
je povinný.
Pokusí se zaškrtnout nábytkové služby v košíku a následně vytvoří printscreen košíku. Je potřeba definovat služby jako list
(pole) obsahující variant ID
těchto služeb.
test.check_services(services=["40968686796951", "40968686829719"])
test.check_services(services=["40968686928023"])
Argument services
je povinný.
Zvolí druh dopravy definovaný argumentem delivery
, pokud zároveň neobsahuje text v argumentu exclude
. Je potřeba, aby se test zrovna nacházel ve fázi volby dopravy.
test.choose_delivery(delivery='na moju adresu', exclude='mastercard', proceed=True)
Argument delivery
je povinný a musí odpovídat způsobu dopravy na daném webu.
Argument exclude
je nepovinný a slouží k přesnějšímu určení jednoho ze dvou podobných druhů doprav.
Argument proceed
je nepovinný a pokud jej nastavíte True
, bude test pokračovat k volbě platby (výchozí hodnota je False
).
Zvolí druh platby definovaný argumentem payment
. Je potřeba, aby se test zrovna nacházel ve fázi volby platby.
test.choose_payment(payment='na moju adresu', proceed=True)
Argument payment
je povinný a musí odpovídat způsobu platby na daném webu. Argument proceed
je nepovinný a pokud jej nastavíte True
, bude test pokračovat a dokončí objednávku (výchozí hodnota je False
).
Slouží k ověření, zda byla objednávka úspěšně dokončena. Ověření proběhne tím, že se test pokusí kliknout na prvek na thank-you stránce.
test.confirm_order()
Otevře aktuální košík a smaže všechny položky v něm. Tato metoda nevyvolá žádnou chybu v případě, kdy bude košík prázdný.
test.empty_cart()
Vyplní jednotlivá pole ve formuláři. Pole, která se mají vyplnit, jsou specifikována argumentem fields
, což je list
(pole) obsahující dictionary
s klíči id
a value
(viz příklad).
test.fill_form_fields(fields=[{"id": "name", "value": "Josef"}], proceed=True)
Argument fields
je povinný. Argument proceed
je nepovinný a pokud jej nastavíte True
, bude test pokračovat a odešle formulář (výchozí hodnota je False
).
Vrátí první element na stránce, který odpovídá CSS selectoru specifikovanému řetězcem v argumentu selector
.
element = test.find_element(selector=".button--add-to-cart")
Argument selector
je povinný.
Vrátí list
(pole) elementů na stránce, které odpovídají CSS selectoru specifikovanému řetězcem v argumentu selector
.
elements = test.find_elements(selector=".button--add-to-cart")
Argument selector
je povinný.
Vrátí prvního potomka elementu v argumentu, který odpovídá specifikovanému CSS selectoru.
child = test.find_child_element(
element=some_element,
selector='.tag.on-order'
)
Oba argumenty jsou povinné.
Vrátí list
(pole) potomků konkrétního elementu, které odpovídají specifikovanému CSS selectoru.
children = test.find_child_elements(
element=some_element,
selector='.tag.on-order'
)
Oba argumenty jsou povinné.
Vrátí seznam náhodných výrazů použitelných ve vyhledávání. Délka tohoto seznamu odpovídá číslu v argumentu items
.
words = test.get_random_words(items=3)
Argument items
je povinný.
Pokračovat z košíku do checkoutu. Pokud se zrovna nenacházíte v košíku, tato metoda jej otevře za vás. Zároveň vyplní všechny potřebné zákaznické detaily (pokud jsou potřeba) a pokračuje k volbě dopravy.
test.goto_checkout()
Můžete použít také další argumenty, které specifikují osobní údaje testovacího uživatele. Tyto argumenty jsou email
, name
, surname
, street
, zipnr
, city
and phonenr
.
- test.goto_checkout(email='testovac@seznam.cz', zipnr='73953')
Projde platební bránou gopay až po zadání čísla karty a potom se vrátí zpět do eshopu, čímž stornuje objednávku.
test.handle_gopay()
Za vstup vezme list
(pole), které se skládá z libovolného počtu dictionary
a uloží je jako výstup do souboru.
test.log_results(
name='(2) Do 50 kg',
url='https://www.okay.sk/collections/mikrovlnne-rury-a-mini-rury',
logs=[
{'Zásielkovňa': '1,00 €', 'Doručiť na moju adresu': '2,00& €'},
{'Bankový prevod': '-', 'Dobierka': '0 €', 'Platba na výdajni': '-'}
]
)
Všechny argumenty, tedy name
, url
a logs
jsou povinné.
Přihlásí uživatele do prodejní (tabletové) aplikace s pomocí uložených údajů.
Tyto údaje by měly být uloženy v souboru config.json
, viz výše.
test.login_seller()
Tuto metodu je vhodné používat ve všech for
a while
smyčkách na začátku každé iterace. Nastaví výchozí hodnoty testu během jednotlivých iterací, vyčistí cache a cookies.
test.new_test()
Najde na stránce první nejprodávanější produkt skladem. Pokud takový produkt neexistuje, vybere první produkt v kolekci při aktuálním řazení.
test.open_product()
Vezme seznam všech položek v hlavním menu, náhodně klikne na tolik, kolik je definováno argumentem items
a pořídí printscreeny. Můžete přidat nepovinný argument limit
, ktery omezí počet položek menu pouze na prvních N.
test.click_random_mainmenu_items(items=3, limit=5)
Argument items
je povinný.
Argument limit
je nepovinný.
Vezme seznam všech položek v patičkovém menu, náhodně klikne na tolik, kolik je definováno argumentem items
a pořídí printscreeny.
test.click_random_footer_items(items=3)
Argument items
je povinný.
Otevře položku v hlavním menu, která odpovídá řetězci zadanému argumentem text
.
test.click_specific_mainmenu_item(text='Televízory')
Argument text
je povinný.
Otevře webovou stránku definovanou argumentem url
.
test.open_url(url='https://www.okay.sk/')
Argument url
je povinný.
Vyčte seznam všech způsobů dopravy a vrátí jej jako dictionary
.
delivery = test.parse_delivery()
Vyčte seznam všech platebních metod a vrátí jej jako dictionary
.
payment = test.parse_payment()
Vyhledá frázi definovanou argumentem text
.
test.search_for(text='mobilný telefón')
Argument text
je povinný.
Vybere prodejnu nebo výdejnu z widgetu prodejen. Pokud chcete zvolit konkrétní prodejnu nebo výdejnu, zadejte její kód v argumenty code
, v opačném případě se vybere prodejna náhodně. Druhý argument proceed
určuje, zda bude test pokračovat do dalšího kroku objednávky.
test.select_pickup_point(proceed=True)
test.select_pickup_point(code='1046', proceed=False)
Oba argumenty jsou volitelné, výchozí hodnota argumentu proceed
je False
.
Odešle obsah košíku nabídkou na email zadaný v argumentu email
.
test.send_offer(email="test@test.cz")
Argument email
je povinný.
Nastaví filtr v kolekci podle jeho jména name
a hodnoty value
.
test.set_filter(name='výrobcovia', value='lg')
Oba argumenty jsou povinné.
Každá metoda, kterou můžete v testu použít, má navíc možnost zadání argumentu screenshots
. Pokud je tento argument nastaven False
, v průběhu této metody nebudou pořízeny žádné printscreeny (výchozí hodnota je True
).
Příklad:
test.click_random_mainmenu_items(items=3, screenshots=False)
Součástí repozitáře jsou také spubory *__samples.py
, které obsahují základní baterii testů. Můžete je použít jako referenční příklady při psaní vlastních testů.