Apache ANT cu Selenium: Tutorial complet
Ce este Apache Ant?
รn timp ce creaศi un produs software complet, trebuie sฤ aveศi grijฤ de diferitele API-uri terศฤ parte, calea lor de clasฤ, curฤศarea fiศierelor binare executabile anterioare, compilarea codului nostru sursฤ, execuศia codului sursฤ, crearea de rapoarte ศi baza de cod de implementare etc. Dacฤ aceste sarcini sunt fฤcut unul cรขte unul manual, va dura un timp enorm, iar procesul va fi predispus la erori.
Aici intervine importanศa unui instrument de construcศie precum Ant. Stocheazฤ, executฤ ศi automatizeazฤ toate procesele รฎntr-o ordine secvenศialฤ menศionatฤ รฎn fiศierul de configurare al lui Ant (de obicei build.xml).
Beneficiul Ant build
- Ant creeazฤ ciclul de viaศฤ al aplicaศiei, adicฤ curฤศaศi, compilaศi, setaศi dependenศa, executaศi, raportaศi etc.
- Dependenศa API-ului terศฤ parte poate fi setatฤ de Ant, adicฤ calea de clasฤ a altui fiศier Jar este setatฤ de fiศierul de compilare Ant.
- Este creatฤ o aplicaศie completฤ pentru livrarea ศi implementarea End to End.
- Este un instrument simplu de construcศie รฎn care toate configuraศiile pot fi fฤcute folosind fiศierul XML ศi care poate fi executat din linia de comandฤ.
- Vฤ face codul curat, deoarece configuraศia este separatฤ de logica realฤ a aplicaศiei.
Cum se instaleazฤ Ant
Paศi pentru a instala Ant รฎn Windows este dupฤ cum urmeazฤ
Pas 1) Acceseazฤ https://ant.apache.org/bindownload.cgi Sau Descฤrcaศi fiศierul .zip de la apache-ant-1.9.4-bin.zip
Pas 2) Dezarhivaศi folderul ศi accesaศi ศi copiaศi calea la rฤdฤcina folderului dezarhivat
Pas 3) Accesaศi Start -> Computer -> faceศi clic dreapta aici ศi selectaศi โProprietฤศiโ, apoi faceศi clic pe Setฤri avansate de sistem
Pas 4) Se deschide o nouฤ fereastrฤ. Faceศi clic pe butonul โVariabilฤ de mediuโฆโ.
Pas 5) Faceศi clic pe butonul โNouโฆโ ศi setaศi numele variabilei ca โANT_HOMEโ ศi valoarea variabilei ca cale rฤdฤcinฤ cฤtre folderul dezarhivat ศi faceศi clic pe OK.
Pas 6) acum selectaศi variabila โCaleโ din listฤ ศi faceศi clic pe โEditareโ ศi adฤugaศi; %ANT_HOME%\bin.
Reporniศi sistemul o datฤ ศi sunteศi gata sฤ utilizaศi instrumentul Ant build acum.
Pas 7) Pentru a verifica versiunea Ant folosind linia de comandฤ:
Ant โ versiune
รnศelegerea Build.xml
Build.xml este cea mai importantฤ componentฤ a instrumentului Ant build. Pentru o Java proiect, toate sarcinile legate de curฤศare, configurare, compilare ศi implementare sunt menศionate รฎn acest fiศier รฎn format XML. Cรขnd executฤm acest fiศier XML folosind linia de comandฤ sau orice plugin IDE, toate instrucศiunile scrise รฎn acest fiศier vor fi executate รฎn mod secvenลฃial.
Sฤ รฎnศelegem codul dintr-un exemplu de build.XML
-
Eticheta de proiect este folositฤ pentru a menศiona un nume de proiect ศi un atribut basedir. Basedir este directorul rฤdฤcinฤ al unei aplicaศii
<project name="YTMonetize" basedir=".">
- Etichetele de proprietate sunt folosite ca variabile รฎn fiศierul build.XML pentru a fi utilizate รฎn paศii ulterioare
<property name="build.dir" value="${basedir}/build"/>
<property name="external.jars" value=".\resources"/>
<property name="ytoperation.dir" value="${external.jars}/YTOperation"/>
<property name="src.dir"value="${basedir}/src"/>
- Target etichete utilizate ca paศi care se vor executa รฎn ordine secvenศialฤ. Atributul nume este numele ศintei. Puteศi avea mai multe ศinte รฎntr-un singur build.xml
<target name="setClassPath">
- eticheta path este folositฤ pentru a grupa toate fiศierele care se aflฤ รฎn locaศia comunฤ
<path id="classpath_jars">
- Eticheta pathelement va seta calea cฤtre rฤdฤcina locaศiei comune รฎn care sunt stocate toate fiศierele
<pathelement path="${basedir}/"/> - Eticheta pathconvert folositฤ pentru a converti cฤile tuturor fiศierelor comune din interiorul etichetei cale รฎn formatul classpath al sistemului
<pathconvert pathsep=";" property="test.classpath" refid="classpath_jars"/>
- Eticheta set de fiศiere folositฤ pentru a seta classpath pentru diferite jar terศe din proiectul nostru
<fileset dir="${ytoperation.dir}" includes="*.jar"/> - Eticheta Echo este folositฤ pentru a imprima text pe consolฤ
<echo message="deleting existing build directory"/>
- ศtergeศi eticheta va ศterge datele din folderul dat
<delete dir="${build.dir}"/>
- Tag-ul mkdir va crea un director nou
<mkdir dir="${build.dir}"/>
- Eticheta javac folositฤ pentru a compila codul sursฤ java ศi pentru a muta fiศierele .class รฎntr-un folder nou
<javac destdir="${build.dir}" srcdir="${src.dir}">
<classpath refid="classpath_jars"/>
</javac>
- jar tag va crea fiศierul jar din fiศierele .class
<jar destfile="${ytoperation.dir}/YTOperation.jar" basedir="${build.dir}">
- Eticheta manifest va seta clasa principalฤ pentru execuศie
<manifest> <attribute name="Main-Class" value="test.Main"/> </manifest>
- Atributul โdepindeโ folosit pentru ca o ศintฤ sฤ depindฤ de o altฤ ศintฤ
<target name="run" depends="compile">
- Tag-ul java va executa funcศia principalฤ din jarul creat รฎn secศiunea ศintฤ de compilare
<java jar="${ytoperation.dir}/YTOperation.jar" fork="true"/>
Rulaศi Ant folosind Eclipse conecteaza
Pentru a rula Ant din eclipse, accesaศi fiศierul build.xml -> faceศi clic dreapta pe fiศier -> Executaศi ca... -> faceศi clic pe Build file
Exemplu
Vom lua un mic exemplu de program care va explica foarte clar funcศionalitatea Ant. Structura proiectului nostru va arฤta astfel:
Aici, รฎn acest exemplu, avem 4 ศinte
- Setaศi calea clasei pentru borcanele externe,
- Curฤศaศi codul respectat anterior
- Compilaศi codul java existent
- Rulaศi codul
Guru99AntClass.class
package testAnt;
import java.util.Date;
public class Guru99AntClass {
public static void main(String...s){
System.out.println("HELLO GURU99 ANT PROGRAM");
System.out.println("TODAY's DATE IS->"+ currentDate() );
}
public static String currentDate(){
return new Date().toString();
}
}
Build.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--Project tag used to mention the project name, and basedir attribute will be the root directory of the application-->
<project name="YTMonetize" basedir=".">
<!--Property tags will be used as variables in build.xml file to use in further steps-->
<property name="build.dir" value="${basedir}/build"/>
<property name="external.jars" value=".\resources"/>
<property name="ytoperation.dir" value="${external.jars}/YTOperation"/>
<property name="src.dir"value="${basedir}/src"/>
<!--Target tags used as steps that will execute in sequential order. name attribute will be the name of the target and < a name=OLE_LINK1 >'depends' attribute used to make one target to depend on another target -->
<target name="setClassPath">
<path id="classpath_jars">
<pathelement path="${basedir}/"/>
</path>
<pathconvert pathsep=";"property="test.classpath" refid="classpath_jars"/>
</target>
<target name="clean">
<!--echo tag will use to print text on console-->
<echo message="deleting existing build directory"/>
<!--delete tag will clean data from given folder-->
<delete dir="${build.dir}"/>
</target>
<target name="compile" depends="clean,setClassPath">
<echo message="classpath:${test.classpath}"/>
<echo message="compiling.........."/>
<!--mkdir tag will create new director-->
<mkdir dir="${build.dir}"/>
<echo message="classpath:${test.classpath}"/>
<echo message="compiling.........."/>
<!--javac tag used to compile java source code and move .class files to a new folder-->
<javac destdir="${build.dir}" srcdir="${src.dir}">
<classpath refid="classpath_jars"/>
</javac>
<!--jar tag will create jar file from .class files-->
<jar destfile="${ytoperation.dir}/YTOperation.jar"basedir="${build.dir}">
<!--manifest tag will set your main class for execution-->
<manifest>
<attribute name="Main-Class" value="testAnt.Guru99AntClass"/>
</manifest>
</jar>
</target>
<target name="run" depends="compile">
<!--java tag will execute main function from the jar created in compile target section-->
<java jar="${ytoperation.dir}/YTOperation.jar"fork="true"/>
</target>
</project>
Cum se executฤ TestNG cod folosind Ant
Aici vom crea o clasฤ cu Testng metode ศi setaศi calea clasei pentru Testarea รฎn build.xml.
Acum, pentru a executa metoda testng, vom crea un alt fiศier testng.xml ศi vom apela acest fiศier din fiศierul build.xml.
Pas 1) Creฤm un โGuru99AntClass.classโ in pachet testAnt
Guru99AntClass.class
package testAnt;
import java.util.Date;
import org.testng.annotations.Test;
public class Guru99AntClass {
@Test
public void Guru99AntTestNGMethod(){
System.out.println("HELLO GURU99 ANT PROGRAM");
System.out.println("TODAY's DATE IS->"+ currentDate() );
}
public static String currentDate(){
return new Date().toString();
}
}
Pasul 2) Creaศi o ศintฤ pentru a รฎncฤrca aceastฤ clasฤ รฎn Build.xml
<!-- Load testNG and add to the class path of application -->
<target name="loadTestNG" depends="setClassPath">
<!โusing taskdef tag we can add a task to run on the current project. In below line, we are adding testing task in this project. Using testing task here now we can run testing code using the ant script -->
<taskdef resource="testngtasks" classpath="${test.classpath}"/>
</target>
Pas 3) Creaศi testng.xml
testng.xml
<?xml version="1.0"encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="YT"thread-count="1"> <test name="GURU99TestNGAnt"> <classes> <class name="testAnt.Guru99AntClass"> </class> </classes> </test> </suite>
Pas 4) Creazฤ Target รฎn Build.xml pentru a rula acest lucru TestNG cod
<target name="runGuru99TestNGAnt" depends="compile">
<!-- testng tag will be used to execute testng code using corresponding testng.xml file. Here classpath attribute is setting classpath for testng's jar to the project-->
<testng classpath="${test.classpath};${build.dir}">
<!โxmlfileset tag is used here to run testng's code using testing.xml file. Using includes tag we are mentioning path to testing.xml file-->
<xmlfileset dir="${basedir}" includes="testng.xml"/>
</testng>
Pas 5) Build.xml complet
<?xml version="1.0"encoding="UTF-8"standalone="no"?>
<!--Project tag used to mention the project name, and basedir attribute will be the root directory of the application-->
<project name="YTMonetize" basedir=".">
<!--Property tags will be used as variables in build.xml file to use in further steps-->
<property name="build.dir"value="${basedir}/build"/>
<!-- put testng related jar in the resource folder -->
<property name="external.jars" value=".\resource"/>
<property name="src.dir" value="${basedir}/src"/>
<!--Target tags used as steps that will execute in sequential order. name attribute will be the name
of the target and 'depends' attribute used to make one target to depend on another target-->
<!-- Load testNG and add to the class path of application -->
<target name="loadTestNG"depends="setClassPath">
<taskdef resource="testngtasks"classpath="${test.classpath}"/>
</target>
<target name="setClassPath">
<path id="classpath_jars">
<pathelement path="${basedir}/"/>
<fileset dir="${external.jars}" includes="*.jar"/>
</path>
<pathconvert pathsep=";"property="test.classpath"refid="classpath_jars"/>
</target>
<target name="clean">
<!--echo tag will use to print text on console-->
<echo message="deleting existing build directory"/>
<!--delete tag will clean data from given folder-->
<delete dir="${build.dir}"/>
</target>
<target name="compile"depends="clean,setClassPath,loadTestNG">
<echo message="classpath:${test.classpath}"/>
<echo message="compiling.........."/>
<!--mkdir tag will create new director-->
<mkdir dir="${build.dir}"/>
<echo message="classpath:${test.classpath}"/>
<echo message="compiling.........."/>
<!--javac tag used to compile java source code and move .class files to a new folder-->
<javac destdir="${build.dir}"srcdir="${src.dir}">
<classpath refid="classpath_jars"/>
</javac>
</target>
<target name="runGuru99TestNGAnt"depends="compile">
<!-- testng tag will be used to execute testng code using corresponding testng.xml file -->
<testng classpath="${test.classpath};${build.dir}">
<xmlfileset dir="${basedir}"includes="testng.xml"/>
</testng>
</target>
</project>
Pas 6) producศie
Descฤrcaศi fiศierul de mai sus
Furnica cu Selenium Webdriver
Pรขnฤ acum, am รฎnvฤศat cฤ folosind ANT putem pune toate borcanele terศilor รฎntr-o anumitฤ locaศie din sistem ศi le putem stabili calea pentru proiectul nostru. Folosind aceastฤ metodฤ, setฤm toate dependenศele proiectului nostru รฎntr-un singur loc ศi รฎl facem mai fiabil pentru compilare, execuศie ศi implementare.
รn mod similar, pentru proiectele noastre de testare care utilizeazฤ seleniu, putem menศiona cu uศurinศฤ dependenศa de seleniu รฎn build.xml ศi nu este nevoie sฤ adฤugฤm manual o cale de clasฤ a acesteia รฎn aplicaศia noastrฤ.
Deci, acum puteศi ignora modul tradiศional menศionat mai jos de a seta cฤile de clasฤ pentru proiect.
Exemplu:
Vom modifica exemplul anterior
Pas 1) Setaศi proprietatea selenium.jars la borcanul legat de seleniu รฎn folderul de resurse
<property name="selenium.jars" value=".\selenium"/>
Pas 2) รn setClassPath ศintฤ, adฤugaศi fiศierele cu seleniu
<target name="setClassPath">
<path id="classpath_jars">
<pathelement path="${basedir}/"/>
<fileset dir="${external.jars}" includes="*.jar"/>
<!-- selenium jar added here -->
<fileset dir="${selenium.jars}" includes="*.jar"/>
</path>
Pas 3) Completeazฤ Build.xml:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--Project tag used to mention the project name, and basedir attribute will be the root directory of the application-->
<project name="YTMonetize" basedir=".">
<!--Property tags will be used as variables in build.xml file to use in further steps-->
<property name="build.dir" value="${basedir}/build"/>
<!-- put testng related jar in the resource folder -->
<property name="external.jars" value=".\resource"/>
<!-- put selenium related jar in resource folder -->
<property name="selenium.jars" value=".\selenium"/>
<property name="src.dir" value="${basedir}/src"/>
<!--Target tags used as steps that will execute in sequential order. name attribute will be the name
of the target and 'depends' attribute used to make one target to depend on another target-->
<!-- Load testNG and add to the class path of application -->
<target name="loadTestNG" depends="setClassPath">
<taskdef resource="testngtasks" classpath="${test.classpath}"/>
</target>
<target name="setClassPath">
<path id="classpath_jars">
<pathelement path="${basedir}/"/>
<fileset dir="${external.jars}" includes="*.jar"/>
<!-- selenium jar added here -->
<fileset dir="${selenium.jars}"includes="*.jar"/>
</path>
<pathconvert pathsep=";" property="test.classpath" refid="classpath_jars"/>
</target>
<target name="clean">
<!--echo tag will use to print text on console-->
<echo message="deleting existing build directory"/>
<!--delete tag will clean data from given folder-->
<delete dir="${build.dir}"/>
</target>
<target name="compile" depends="clean,setClassPath,loadTestNG">
<echo message="classpath:${test.classpath}"/>
<echo message="compiling.........."/>
<!--mkdir tag will create new director-->
<mkdir dir="${build.dir}"/>
<echo message="classpath:${test.classpath}"/>
<echo message="compiling.........."/>
<!--javac tag used to compile java source code and move .class files to new folder-->
<javac destdir="${build.dir}"srcdir="${src.dir}">
<classpath refid="classpath_jars"/>
</javac>
</target>
<target name="runGuru99TestNGAnt" depends="compile">
<!-- testng tag will be used to execute testng code using corresponding testng.xml file -->
<testng classpath="${test.classpath};${build.dir}">
<xmlfileset dir="${basedir}" includes="testng.xml"/>
</testng>
</target>
</project>
Pas 4) Acum schimbaศi clasa creatฤ anterior Guru99AntClass.java cu cod nou.
Iatฤ รฎn acest exemplu paศii noศtri folosind Selenium sunt:
- Acceseazฤ https://demo.guru99.com/test/guru99home/
- Citiศi link-urile tuturor cursurilor unul cรขte unul
- Imprimaศi hyperlinkul tuturor cursurilor pe consolฤ.
Guru99AntClass.java:
package testAnt;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;
public class Guru99AntClass {
@Test
public void Guru99AntTestNGMethod(){
WebDriver driver = new FirefoxDriver();
driver.get("https://demo.guru99.com/test/guru99home/");
List<WebElement> listAllCourseLinks = driver.findElements(By.xpath("//div[@class='canvas-middle']//a"));
for(WebElement webElement : listAllCourseLinks) {
System.out.println(webElement.getAttribute("href"));
}
}
}
Pas 5) Dupฤ execuศia cu succes, rezultatul va arฤta astfel:
Descฤrcaศi fiศierul exemplu de mai sus
Rezumat
Ant este un instrument de construcศie pentru Java.
Ant folosit pentru compilarea codului, implementare, proces de execuศie.
Ant poate fi descฤrcat de pe Apache site-ul web.
Fiศierul Build.xml utilizat pentru a configura ศinte de execuศie folosind Ant.
Ant poate fi rulat din linia de comandฤ sau din pluginul IDE adecvat, cum ar fi Eclipse.















