Selenium to narzędzie przeznaczone do testów automatycznych stron WWW, można z niego korzystać w wielu językach przy pomocy dedykowanych bibliotek. W tym mini poradniku pokażę jak zainstalować i korzystać z Selenium z silnikiem PhantomJS w trybie headless (bez otwierania gui przeglądarki) w pythonie.
0x01 – Instalacja
Instalacja na systemie Debian/Ubuntu jest prosta i sprowadza się do kilku komend:
#!/bin/bash # Aktualizujemy listę pakietów sudo apt-get update # Instalujemy python i pip sudo apt-get install python3 python3-pip # Instalujemy bibliotekę Selenium dla pythona sudo pip install selenium # Instalujemy wymagane pakiety dla PhantomJS sudo apt-get install build-essential chrpath libssl-dev libxft-dev sudo apt-get install libfreetype6 libfreetype6-dev sudo apt-get install libfontconfig1 libfontconfig1-dev # Pobieramy i rozpakowujemy PhantomJS cd ~ export PHANTOM_JS="phantomjs-2.1.1-linux-x86_64" wget https://bitbucket.org/ariya/phantomjs/downloads/$PHANTOM_JS.tar.bz2 sudo tar xvjf $PHANTOM_JS.tar.bz2 # Kopiujemy binarke do właściwego katalogu sudo mv $PHANTOM_JS /usr/local/share sudo ln -sf /usr/local/share/$PHANTOM_JS/bin/phantomjs /usr/local/bin # Sprawdzamy czy jest OK phantomjs --version
Skrypt instalacyjny i przykłady zamieszczę na moim github’ie.
0x02 – Zabawa
Kiedy mamy już wszystko gotowe możemy rozpocząć zabawę, mamy bardzo wiele możliwości możemy min. obsługiwać formularze, klikać w linki etc.
Poniżej przykładowy skrypt, mi służył do pobierania pliku video ze strony:
from selenium import webdriver import time import urllib.request def get_url(url): # Inicjalizujmey selenium z silnikiem PhantomJS driver = webdriver.PhantomJS() # Ustawiamy rozdzielczość - opcjonlanie potrzebne do screenshotów driver.set_window_size(1024, 768) # Wczytujemy podany adres URL driver.get(url) # Czekamy kilka sekund na załadowanie strony time.sleep(5) try: # Znajdujemy element na stronie przez XPATH i klikamy driver.find_element_by_xpath("//*[@id='player']/div[5]/div").click() # Znów czekamy na załadowanie np. AJAX time.sleep(5) # Wyszukujemy elemnt, kopiujemy atrybut etc. src = driver.find_element_by_xpath("//*[@id='player']/video[1]").get_attribute("src") return src except Exception: debug(driver) driver.close() return False # Zamykamy połącznie driver.close() return src def debug(driver): # Zapisujemy screenschot driver.save_screenshot('screenshot.png'); # Zapisujemy HTML do pliku page = driver.page_source file_ = open('page.html', 'w') file_.write(page) file_.close() # Wykonujemy url = get_url("http://...") if url != False: print(url) else: print("Błąd!")
0x03 – Podsumowanie
Selenium może przydać się nie tylko do testów ale też do automatyzacji częstych czynności w sieci czy scrapowania stron internetowych korzystających z AJAX czy zabezpieczanych przed takimi praktykami. Warto się pobawić tym narzędziem jeśli znajdziecie trochę czasu 🙂
Jedyny problem jaki znalazłem to obsługa websockets w PhantomJS, jeśli ktoś zna rozwiązanie tego problemu będę wdzięczny za komentarz.
Makulatura