Selenium + Python + Debian server

cs v kategorii code • 7 min. čtení
Mind the age! Most likely, its content is outdated. Especially if it’s technical.

Už mi nestačí hrabat se pouze v jednotkových či integračních testech a tak si nějak dobu hraju se Selenium. S nástrojem, který dokáže z velké části nahradit i „testera klikače“. Před pár dny jsem měl potřebu si Selenium rozběhat na serveru s tím, že absolutně netuším, jestli to lze a jestli to lze udělat nějak snadno. (Mimochodem serverem mám na mysli mašinu někde bůh ví kde bez jakéhokoliv vstupně/výstupního zařízení.)

Pokud nebudu počítat občas trochu zmatené lidi v diskuzích kolem tohoto problému (na otázku jak nainstalovat Firefox na Debian serveru bez Xek jsem našel nespočet odpovědí „ty blázne, to nejde. Proč to vůbec potřebuješ, vždyť to je blbost!“), tak to udělat lze a velmi jednoduše.

Jako první si musíme uvědomit, cože to vlastně požadujeme. Chceme použít Selenium 2.0 (Webdriver) v Pythonu na otestování webové aplikace, která nám běží na Debian serveru bez X serveru. Začněme tedy postupně řešit.

Nejprve je potřeba Python, nainstalujeme.

# apt-get install python

Super, máme. Dále potřebujeme Selenium pro Python. Selenium lze nejjednodušejí nainstalovat přes PyPI (Python Package Index), na to potřebujeme nainstalovat balík python- pip.

# apt-get install python-pip
# pip install selenium

Máme nutný základ pro jakékoliv testování pomocí Pythonu a Selenia. Dál je potřeba nějak vyřešit problém „žádný X server“. Řešeních je víc, já si však vybral XVFB. Celým jménem virtual framebuffer X server. Česky se jedná o virtuální X server. Tedy možnost spouštět grafické programy bez nutnosti fyzické podpory pro grafický výstup. Jen nic není vidět. :)

Budeme potřebovat nejen balík xvfb, ale také knihovnu pyvirtualdisplay pro Python, abychom mohli ovládat xvfb přímo z našeho testovacího kódu.

# apt-get install xvfb
# pip install pyvirtualdisplay

Nyní nám zbývá předposlední část a to nainstalovat Firefox. Ve standardních Debian repozitářích k nalezení není a tak se musí nejprve přidat další zdroj na linuxmint.

# vim /etc/apt/sources.list
// pridat radek "deb http://packages.linuxmint.com debian import"
# apt-get update
# apt-get install firefox

Tím je připraveno prostředí a můžeme konečně spustit první test funkčnosti.

from selenium import webdriver
from pyvirtualdisplay import Display

display = Display(visible=0, size=(800, 600))
display.start()

browser = webdriver.Firefox()
browser.get('http://www.google.com')
print browser.title
browser.quit()

display.stop()

Pokud vše proběhlo hladce, zbývá si už jen ukázku přepsat do Pythoních unittestů a s radostí začít testovat. :)

class SomeTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.display = Display(visible=0, size=(800, 600))
        cls.display.start()

    def setUp(self):
        self.browser = webdriver.Firefox()
        self.browser.get('http://www.google.com')

    def testGoogleTitle(self):
        self.assertEqual(self.browser.title, 'Google')

    def tearDown(self):
        self.browser.quit()

    @classmethod
    def tearDownClass(cls):
        cls.display.stop()

if __name__ == '__main__':
    unittest.main(verbosity=2)

Výstup pak už je klasický, který známe:

testGoogleTitle (__main__.SomeTest) ... ok

----------------------------------------------------------------------
Ran 1 test in 4.226s

OK

Dále je dobré si udělat nějaký vlastní wrapper pro TestCase, který se postará o rutiny. (Stále pamatujeme na DRY.) Případně ještě nevytvářet instanci Firefoxu pro každý jednotlivý test, ale pro celou třídu nebo pro všechny testy. Záleží na potřebách a preferencích.

Tento způsob se mi velmi líbí i pro desktop, protože (díky použití Webdriveru) nemusím pouštět žádný Selenium server a ani mi na monitoru nevyskakuje Firefox. Vše hezky v pozadí. A když se něco nedaří a potřebuju vidět, co se děje, stačí pouze dočasně odstranit vytváření virtuálního X serveru.

Proč jsem zvolil Webdriver?

Protože to je součást Selenia 2.0 (největší novinkou druhé verze je právě integrace Webdriveru). Tedy je to směr, kterým se tento nástroj ubírá.

Protože má objektovější API. Sice to v mých velmi jednoduchých ukázkách není dobře vidět, ale náznak tam je. Pak lze kusy kódu lépe zapouzdřit. Například vytvořit celou třídu reprezentující nějaký základní stavební kámen na webu a není třeba jeho funkčnost mít všude možně (změna v HTML se poté nerovná změně ve všech testech, ale jen někde na jednom místě).

Protože Selenium ovládá prohlížeč skrze JavaScript, kdežto Webdriver ovládá přímo prohlížeč. Na Webdriveru se podílejí všichni hlavní tvůrci prohlížečů. Díky tomu také není potřeba spouštět Selenium server.








Může se vám také líbit

en Makefile with Python, November 6, 2017
en Fast JSON Schema for Python, October 1, 2018
en Deployment of Python Apps, August 15, 2018
cs Jasně, umím Git…, August 6, 2014
cs Checklist na zabezpečení webových aplikací, March 1, 2016

Další články z kategorie code.
Nenechte si ujít nové články díky Atom/RSS kanálu.



Poslední příspěvky

cs Mami, tati, přejde to, December 9, 2023 in family
cs Co vše bychom měli dělat s dětmi?, November 24, 2023 in family
cs O trávicí trubici, November 7, 2023 in family
cs Na šestinedělí se nevyspíš, October 28, 2023 in family
cs Copak to bude?, October 20, 2023 in family