Ahogy azt már egy Facebook bejegyzésemben írtam, rátaláltam a Selenium WebDriverre, ami egy nagyon jó eszköz az adatok levadászását végző crawlerek elkészítésére is. Alapvetően nem erre készül, hanem a tesztelési feladatok automatizálására és feldolgozására, de ahogy azt a Quora-n feltett kérdésemre válaszolták, kiváló az én céljaimra is.
Tartalomjegyzék
Mi az a Selenium?
A Selenium egy nyílt forráskódú, ingyenes automatizált tesztkörnyezet, mellyel webes alkalmazásokat lehet tesztelni a különféle böngészők és platformok alatt. A Selenium scriptek sokféle programnyelven elkészíthetők, én a Java-t használom, de nagyon sok script található a neten Python vagy C# nyelven írva is.
A Selenium Software nem csak egy eszközt jelent, hanem egy teljes csomagot, melyek a tesztfolyamatok különféle fázisait támogatják.
A Selenium RC-ből és a Selenium WebDriver egyesítéséből született meg a Selenium 2 framework.
A Seleniumot egy Jason Huggins nevű programozó készítette el 2004-ben, aki webes alkalmazások fejlesztésén dolgozott, és ezeket folyamatosan tesztelni kellett. Ezek folyamatos elvégzése nem volt elég hatékony, ezért lekódolta a JavaScriptTestRunner nevű programot a böngészőfolyamatok vezérlésére. Mivel ez jól működött, ezért nyílt forráskódúvá tette, és később átnevezték Seleniumra. A nevét programozói humorként kapta, mivel a kifejlesztésekor már volt egy versenytárs tesztelőkörnyezet a piacon, amit a Mercury Interactive készített (mercury = higany). Mivel a szelén (szelén = selenium) a higanymérgezés kezelésére is használatos, így a fejlesztőcsoport felvette ezt a nevet a projekthez.
Selenium IDE
A Selenium IDE a Selenium framework legegyszerűbb tagja, Firefox bővítményként érhető el. Teszt prototípusok felállítására szolgál, nem támogatja a feltételeket vagy az iterációt. A teszt lefuttatása lassabb a csomag többi tagjához képest, de nagyon könnyű telepíteni a Firefox segítségével, és nem szükséges hozzá programozói tapasztalat.
Selenium RC (Selenium Remote Control)
A Selenium RC volt a Selenium framework legfontosabb tagja, mivel lehetővé tette a programozóknak, hogy olyan nyelven írják meg a teszteket, amelyet szeretnek. A már említett Java, Python és C# mellett használható a PHP, a Perl és a Ruby is.
Hátránya, hogy nehezebb telepíteni, mint az IDE-t, programozói tudás kell hozzá, Selenium RC Server szükséges a futtatásához, és lassabb, mint a WebDriver. Előnye a böngésző- és platformfüggetlenség, hogy használhatók feltételek és ciklusok, támogatja az adatvezérelt tesztelést, teljeskörű API-val rendelkezik és gyorsabb az IDE-nél.
Selenium WebDriver
A Selenium WebDriver számos nézőpont alapján jobb választás, mint az IDE vagy az RC. Modern megközelítést használ a böngészőműveletek automatizálására. Nem a JavaScript automatizálásra támaszkodik, hanem közvetlenül a böngészőt vezérli, és így kommunikál vele.
Ugyanazokat a programozási nyelveket támogatja, mint a Selenium RC: Java, C#, PHP, Python, Perl, Ruby. Hátránya, hogy ehhez is szükséges programozói készség, és nem rendelkezik beépített eszközzel a futtatás közbeni válaszok naplózására vagy a teszteredmények legenerálására. A legnagyobb előnye a fentieken kívül, hogy nem kell hozzá külön összetevő, mint az RC Server, és ez a leggyorsabb a három termék közül.
Selenium Grid
A Selenium Grid a Selenium RC-hez készült párhuzamos tesztek elvégzésére, melyek egyszerre futhatnak le különböző gépeken és böngészőkön. Ezzel idő spórolható meg, és szimultán tesztek készíthetők sokféle eszközre. Mindig van egy hub-ja, mely kiadja a Selenium parancsokat, és ehhez kapcsolódnak a teszt node-jai.
Selenium a web crawlerek elkészítéséhez
Én a Selenium WebDriver-t használom a crwalerek elkészítéséhez, a fentiekből már világos, hogy miért. Gyors, nem kell hozzá külön komponens, és közvetlenül kommunikál a böngészővel. Mostanában Maven projekteket hozok létre, melynél a függőségek közé beteszem a Selenium összetevőket, és a projekt futtatásakor azok automatikusan letöltődnek a Maven repository-ból.
Az első, saját kis crawleremet már el is készítettem vele, ezt meg is mutatom:
package com.viktorjava.seleniumcrawler; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class Crawler { public static void main(String[] args) { String url = "ide jon az url"; WebDriver driver = new ChromeDriver(); SaveToDatabase toDatabase = new SaveToDatabase(); driver.get(url); WebElement table = driver.findElement(By.tagName("table")); List<WebElement> lines = table.findElements(By.tagName("tr")); int i = 0; int j = 0; String[] elemek = new String[16]; for (WebElement line : lines) { if (j != 0) { List<WebElement> tags = line.findElements(By.tagName("td")); i = 0; for (WebElement tag : tags) { elemek[i] = tag.getText(); i++; } toDatabase.insert(elemek); } j++; } toDatabase.closeConnection(); driver.quit(); } }
Az egyik weboldal számokat tartalmazó oldalát dolgoztam fel a crawler segítségével. Chrome böngésző segítségével töltöttem le az adatokat, ezért egy ChromeDriver-t használtam fel.
A Selenium használata jól nyomon követhető, egy table WebElement-be mentette az adatokat, ahol a forráskódban megtalálta a table HTML tag-et.
Ezután egy WebElement-eket tartalmazó lines listába tette a táblázatból azokat az elemeket, melyeket a tr HTML tag-gel azonosított, azaz a táblázat sorait.
Ezután végig mentem a listán, és megkerestem a td HTML tag-eket, ezek a táblázat cellái. Mivel tudtam, hogy 16 cella van egy sorban, ezért azokat elmentettem egy 16 elemű tömbbe.
A tömböt átadtam a toDatabase objemktumnak, amely gondoskodik a megkapott tömb feldolgozásáról és adatbázisba mentéséről. Ezt már nem mutatom meg, mert nem jelent újdonságot.
Még a Maven projekt pom.xml-jét beillesztem ide, hogy milyen jó dolog a Maven is.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.viktorjava</groupId> <artifactId>Hostessen</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.141.59</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-chrome-driver</artifactId> <version>3.141.59</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava-io</artifactId> <version>r03</version> <type>jar</type> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version> </dependency> </dependencies> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> </project>
A selenium-java és a selenium-chrome-driver az gondolom érthető, a guava-io a Google Guava fájlkezeléssel foglalkozó könyvtára, ezzel könnyebbek a fájlműveletek, a mysql-connector-java pedig a mysql adatbázis kezeléséhez szükséges.
A Maven-t a StudiCore Maven tanfolyamán ismertem meg, a Google Guava-ról meg volt már korábban szó a StudiCore Java SE képzésén (41 fejezet).
Frissítés: A jogi szabályozás pontatlanságai miatt eltávolítottam a projekt URL címét, így most egy általánosságban elképzelt weboldal felhasználásáról volt szó.