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.
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ó.

Vélemény, hozzászólás?