Apache ANT med Selenium: Komplett handledning
Vad är Apache Ant?
När man skapar en komplett mjukvaruprodukt måste man ta hand om olika tredjeparts API, deras klassväg, rensa tidigare körbara binära filer, kompilera vår källkod, köra källkod, skapa rapporter och distributionskodbas etc. Om dessa uppgifter är görs en efter en manuellt, kommer det att ta enorm tid, och processen kommer att vara benägen att göra fel.
Här kommer vikten av ett byggverktyg som Ant. Den lagrar, kör och automatiserar alla processer i en sekventiell ordning som nämns i Ants konfigurationsfil (vanligtvis build.xml).
Fördelen med myrbygge
- Ant skapar applikationens livscykel dvs rengör, kompilerar, ställer in beroende, kör, rapporterar, etc.
- Tredje parts API-beroende kan ställas in av Ant, dvs andra Jar-fils klasssökväg ställs in av Ant byggfil.
- En komplett applikation skapas för leverans och implementering från slut till slut.
- Det är ett enkelt byggverktyg där alla konfigurationer kan göras med hjälp av XML-fil och som kan köras från kommandoraden.
- Det gör din kod ren eftersom konfigurationen är skild från den faktiska applikationslogiken.
Hur man installerar Ant
Steg för att installera Ant i Windows enligt följande
Steg 1) Gå till https://ant.apache.org/bindownload.cgi Eller ladda ner .zip-fil från apache-ant-1.9.4-bin.zip
Steg 2) Packa upp mappen och gå till och kopiera sökvägen till roten av den uppackade mappen
Steg 3) Gå till Start -> Dator -> högerklicka här och välj "Egenskaper" och klicka sedan på Avancerade systeminställningar
Steg 4) Ett nytt fönster öppnas. Klicka på knappen "Environment Variable...".
Steg 5) Klicka på knappen "Ny..." och ställ in variabelnamnet som "ANT_HOME" och variabelvärdet som rotsökvägen till den uppackade mappen och klicka på OK.
Steg 6) välj nu variabeln 'Path' från listan och klicka på 'Redigera' och lägg till; %ANT_HOME%\bin.
Starta om systemet en gång och du är redo att använda Ant build-verktyget nu.
Steg 7) Så här kontrollerar du versionen av din Ant med kommandoraden:
Myra -version
Förstå Build.xml
Build.xml är den viktigaste komponenten i Ant byggverktyget. För en Java projekt, all rensning, installation, kompilering och distributionsrelaterade uppgifter nämns i denna fil i XML-format. När vi kör den här XML-filen med hjälp av kommandoraden eller någon IDE-plugin, kommer alla instruktioner som skrivs in i den här filen att exekveras på ett sekventiellt sätt.
Låt oss förstå koden i ett exempel på build.XML
-
Projekttaggen används för att nämna ett projektnamn och baserat attribut. Basedir är rotkatalogen för ett program
<project name="YTMonetize" basedir=".">
- Egenskapstaggar används som variabler i build.XML-filen som ska användas i ytterligare steg
<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 taggar som används som steg som kommer att köras i sekventiell ordning. Namnattribut är namnet på målet. Du kan ha flera mål i en enda build.xml
<target name="setClassPath">
- path tag används för att bunta alla filer logiskt som finns på den gemensamma platsen
<path id="classpath_jars">
- pathelement-taggen kommer att ställa in sökvägen till roten av den gemensamma platsen där alla filer lagras
<pathelement path="${basedir}/"/>
- pathconvert-tagg som används för att konvertera sökvägar för alla vanliga filer inuti sökvägstaggen till systemets klassvägsformat
<pathconvert pathsep=";" property="test.classpath" refid="classpath_jars"/>
- fileset-taggen som används för att ställa in klasssökväg för olika tredjepartsjar i vårt projekt
<fileset dir="${ytoperation.dir}" includes="*.jar"/>
- Echo-tagg används för att skriva ut text på konsolen
<echo message="deleting existing build directory"/>
- Ta bort taggen rensar data från given mapp
<delete dir="${build.dir}"/>
- mkdir-taggen skapar en ny katalog
<mkdir dir="${build.dir}"/>
- javac-tagg som används för att kompilera java-källkod och flytta .class-filer till en ny mapp
<javac destdir="${build.dir}" srcdir="${src.dir}"> <classpath refid="classpath_jars"/> </javac>
- jar-taggen kommer att skapa jar-fil från .class-filer
<jar destfile="${ytoperation.dir}/YTOperation.jar" basedir="${build.dir}">
- manifest-taggen kommer att ställa in din huvudklass för exekvering
<manifest> <attribute name="Main-Class" value="test.Main"/> </manifest>
- "beror"-attribut som används för att göra ett mål beroende av ett annat mål
<target name="run" depends="compile">
- java-taggen kommer att utföra huvudfunktionen från burken som skapats i kompileringsmålsektionen
<java jar="${ytoperation.dir}/YTOperation.jar" fork="true"/>
Kör Ant med Eclipse plugin
För att köra Ant från eclipse gå till filen build.xml -> högerklicka på filen -> Kör som... -> klicka på Bygg fil
Exempelvis
Vi kommer att ta ett litet exempelprogram som kommer att förklara Ant-funktionalitet mycket tydligt. Vår projektstruktur kommer att se ut som -
Här i detta exempel har vi 4 mål
- Ställ in klasssökväg för externa burkar,
- Rengör tidigare uppfylld kod
- Kompilera befintlig java-kod
- Kör koden
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>
Hur man utför TestNG kod med Ant
Här ska vi skapa en klass med Testng metoder och ange klassväg för Testning i build.xml.
För att nu köra testng-metoden kommer vi att skapa en annan testng.xml-fil och anropa den här filen från build.xml-filen.
Steg 1) Vi skapar en “Guru99AntClass.class” i paketet 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(); } }
Steg 2) Skapa ett mål för att ladda denna klass i 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>
Steg 3) Skapa 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>
Steg 4) Skapa Target i Build.xml för att köra detta TestNG koda
<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>
Steg 5) Den kompletta 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"/> <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>
Steg 6) Produktion
Myra med Selenium Webdriver
Hittills har vi lärt oss att med ANT kan vi placera alla burkar från tredje part på en viss plats i systemet och ange deras väg för vårt projekt. Med den här metoden sätter vi alla beroenden av vårt projekt på en enda plats och gör det mer tillförlitligt för kompilering, exekvering och distribution.
På liknande sätt, för våra testprojekt som använder selen, kan vi enkelt nämna selenberoende i build.xml och vi behöver inte lägga till en klasssökväg för det manuellt i vår applikation.
Så nu kan du ignorera nedan nämnda traditionella sätt att ställa in klassvägar för projekt.
Exempelvis:
Vi kommer att modifiera det föregående exemplet
Steg 1) Ställ in egenskapen selenium.jars till selenrelaterad jar i resursmappen
<property name="selenium.jars" value=".\selenium"/>
Steg 2) Lägg till selenfilerna i målet setClassPath
<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>
Steg 3) Slutför 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>
Steg 4) Ändra nu tidigare skapad klass Guru99AntClass.java med ny kod.
Här i detta exempel våra steg med hjälp av Selenium är:
- Gå till https://demo.guru99.com/test/guru99home/
- Läs alla kurslänkar en efter en
- Skriv ut alla kurser hyperlänkar på konsolen.
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")); } } }
Steg 5) Efter framgångsrik körning kommer utdata att se ut så här:
Sammanfattning
Ant är ett byggverktyg för Java.
Ant används för kodkompilering, distribution, exekveringsprocess.
Ant kan laddas ner från Apache webbsajt.
Build.xml-fil som används för att konfigurera exekveringsmål med Ant.
Ant kan köras från kommandoraden eller lämplig IDE-plugin som eclipse.