Apache ANT med Selenium: Komplet selvstudie
Hvad er Apache Ant?
Mens man opretter et komplet softwareprodukt, skal man tage sig af forskellige tredjeparts API, deres klassesti, rensning af tidligere eksekverbare binære filer, kompilering af vores kildekode, udførelse af kildekode, oprettelse af rapporter og implementeringskodebase osv. Hvis disse opgaver er gøres én efter én manuelt, vil det tage enorm tid, og processen vil være tilbøjelig til fejl.
Her kommer vigtigheden af et byggeværktøj som Ant. Den gemmer, udfører og automatiserer alle processer i en sekventiel rækkefølge, der er nævnt i Ants konfigurationsfil (normalt build.xml).
Fordel ved Myrebygge
- Ant opretter applikationens livscyklus, dvs. rense, kompilere, indstille afhængighed, udføre, rapportere osv.
- Tredjeparts API-afhængighed kan indstilles af Ant, dvs. andre Jar-filers klassesti er indstillet af Ant build-fil.
- Der oprettes en komplet applikation til levering og implementering fra ende til ende.
- Det er et simpelt byggeværktøj, hvor alle konfigurationer kan udføres ved hjælp af XML-fil, og som kan udføres fra kommandolinjen.
- Det gør din kode ren, da konfigurationen er adskilt fra den faktiske applikationslogik.
Sådan installeres Ant
Trin til at installere Ant i Windows er som følgende
Trin 1) Gå til https://ant.apache.org/bindownload.cgi Eller download .zip-fil fra apache-ant-1.9.4-bin.zip
Trin 2) Udpak mappen og gå til og kopier stien til roden af den udpakkede mappe
Trin 3) Gå til Start -> Computer -> højreklik her og vælg 'Egenskaber' og klik derefter på Avancerede systemindstillinger
Trin 4) Et nyt vindue åbnes. Klik på knappen 'Environment Variable...'.
Trin 5) Klik på knappen 'Ny...' og indstil variabelnavnet som 'ANT_HOME' og variabelværdien som rodstien til den udpakkede mappe, og klik på OK.
Trin 6) vælg nu variabel 'Sti' fra listen og klik på 'Rediger' og tilføj; %ANT_HOME%\bin.
Genstart systemet én gang, og du er klar til at bruge Ant build-værktøjet nu.
Trin 7) For at kontrollere versionen af din Ant ved hjælp af kommandolinjen:
Myre -version
Forstå Build.xml
Build.xml er den vigtigste komponent i Ant build-værktøjet. For en Java projekt, er alle rengørings-, opsætnings-, kompilerings- og implementeringsrelaterede opgaver nævnt i denne fil i XML-format. Når vi udfører denne XML-fil ved hjælp af kommandolinje eller et hvilket som helst IDE-plugin, vil alle instruktioner, der er skrevet i denne fil, blive eksekveret på en sekventiel måde.
Lad os forstå koden i et eksempel build.XML
-
Project tag bruges til at nævne et projektnavn og basedir-attribut. Basedir er rodmappen til en applikation
<project name="YTMonetize" basedir=".">
- Ejendomsmærker bruges som variable i build.XML-filen, der skal bruges i yderligere trin
<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 bruges som trin, der udføres i sekventiel rækkefølge. Navneattribut er navnet på målet. Du kan have flere mål i en enkelt build.xml
<target name="setClassPath">
- path tag bruges til at samle alle filer logisk, som er på den fælles placering
<path id="classpath_jars">
- pathelement tag vil sætte stien til roden af den fælles placering, hvor alle filer er gemt
<pathelement path="${basedir}/"/>
- pathconvert tag bruges til at konvertere stier til alle almindelige filer inde i path tag til systemets classpath format
<pathconvert pathsep=";" property="test.classpath" refid="classpath_jars"/>
- fileset tag bruges til at indstille klassestien til forskellige tredjeparts jar i vores projekt
<fileset dir="${ytoperation.dir}" includes="*.jar"/>
- Echo tag bruges til at udskrive tekst på konsollen
<echo message="deleting existing build directory"/>
- Slet tag renser data fra en given mappe
<delete dir="${build.dir}"/>
- mkdir tag vil oprette en ny mappe
<mkdir dir="${build.dir}"/>
- javac tag bruges til at kompilere java kildekode og flytte .class filer til en ny mappe
<javac destdir="${build.dir}" srcdir="${src.dir}"> <classpath refid="classpath_jars"/> </javac>
- jar-tag vil oprette jar-fil fra .class-filer
<jar destfile="${ytoperation.dir}/YTOperation.jar" basedir="${build.dir}">
- manifest tag vil indstille din hovedklasse til udførelse
<manifest> <attribute name="Main-Class" value="test.Main"/> </manifest>
- 'afhænger'-attribut, der bruges til at få et mål til at afhænge af et andet mål
<target name="run" depends="compile">
- java-tag vil udføre hovedfunktionen fra den jar, der er oprettet i kompileringsmålsektionen
<java jar="${ytoperation.dir}/YTOperation.jar" fork="true"/>
Kør Ant ved hjælp af Eclipse plugin
For at køre Ant fra Eclipse skal du gå til filen build.xml -> højreklik på filen -> Kør som... -> klik på Byg fil
Eksempel
Vi tager et lille eksempelprogram, der vil forklare Ant-funktionalitet meget klart. Vores projektstruktur vil se sådan ud -
Her i dette eksempel har vi 4 mål
- Indstil klassesti til eksterne krukker,
- Rengør tidligere overholdt kode
- Kompiler eksisterende java-kode
- 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(); } }
Byg.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>
Sådan udføres TestNG kode ved hjælp af Ant
Her vil vi lave en klasse med Testng metoder og sæt klassesti til Test i build.xml.
For at udføre testng-metoden vil vi oprette en anden testng.xml-fil og kalde denne fil fra build.xml-filen.
Trin 1) Vi opretter en "Guru99AntClass.class" i pakken 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(); } }
Trin 2) Opret et mål for at indlæse denne klasse 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>
Trin 3) Opret 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>
Trin 4) Opret Target i Build.xml for at køre dette TestNG kode
<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>
Trin 5) Den komplette 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>
Trin 6) Produktion
Myre med Selenium Webdriver
Indtil videre har vi erfaret, at vi ved at bruge ANT kan placere alle tredjepartskrukker et bestemt sted i systemet og sætte deres vej til vores projekt. Ved at bruge denne metode sætter vi alle afhængigheder af vores projekt på et enkelt sted og gør det mere pålideligt til kompilering, udførelse og implementering.
Tilsvarende kan vi til vores testprojekter, der bruger selen, nemt nævne selenafhængighed i build.xml, og vi behøver ikke at tilføje en klassesti til det manuelt i vores applikation.
Så nu kan du ignorere nedenstående traditionelle måde at indstille klassestier til projekt på.
Eksempel:
Vi vil ændre det foregående eksempel
Trin 1) Indstil egenskaben selenium.jars til selenrelateret jar i ressourcemappen
<property name="selenium.jars" value=".\selenium"/>
Trin 2) Tilføj selenfilerne i target-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>
Trin 3) Fuldfø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>
Trin 4) Skift nu tidligere oprettede klasse Guru99AntClass.java med ny kode.
Her i dette eksempel vores trin ved hjælp af Selenium er:
- Gå til https://demo.guru99.com/test/guru99home/
- Læs alle kursuslinks én efter én
- Udskriv alle kursers hyperlink på konsollen.
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")); } } }
Trin 5) Efter vellykket udførelse vil output se sådan ud:
Download ovenstående eksempelfil
Resumé
Myre er et byggeværktøj til Java.
Ant brugt til kodekompilering, implementering, eksekveringsproces.
Ant kan downloades fra Apache internet side.
Build.xml-fil, der bruges til at konfigurere eksekveringsmål ved hjælp af Ant.
Ant kan køres fra kommandolinjen eller passende IDE-plugin som eclipse.