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

Apache Ant

Fordel ved Myrebygge

  1. Ant opretter applikationens livscyklus, dvs. rense, kompilere, indstille afhรฆngighed, udfรธre, rapportere osv.
  2. Tredjeparts API-afhรฆngighed kan indstilles af Ant, dvs. andre Jar-filers klassesti er indstillet af Ant build-fil.
  3. Der oprettes en komplet applikation til levering og implementering fra ende til ende.
  4. 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.
  5. 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

Installer Ant

Trin 2) Udpak mappen og gรฅ til og kopier stien til roden af โ€‹โ€‹den udpakkede mappe

Installer Ant

Trin 3) Gรฅ til Start -> Computer -> hรธjreklik her og vรฆlg 'Egenskaber' og klik derefter pรฅ Avancerede systemindstillinger

Installer Ant

Trin 4) Et nyt vindue รฅbnes. Klik pรฅ knappen 'Environment Variable...'.

Installer Ant

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.

Installer Ant

Trin 6) vรฆlg nu variabel 'Sti' fra listen og klik pรฅ 'Rediger' og tilfรธj; %ANT_HOME%\bin.

Installer Ant

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

Installer Ant

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

Kรธr Ant ved hjรฆlp af Eclipse Plugin

Eksempel

Vi tager et lille eksempelprogram, der vil forklare Ant-funktionalitet meget klart. Vores projektstruktur vil se sรฅdan ud -

Kรธr Ant ved hjรฆlp af Eclipse Plugin

Her i dette eksempel har vi 4 mรฅl

  1. Indstil klassesti til eksterne krukker,
  2. Rengรธr tidligere overholdt kode
  3. Kompiler eksisterende java-kode
  4. Kรธr koden

Guru99AntClass.klasse

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>				

Kรธr Ant ved hjรฆlp af Eclipse plugin

Sรฅdan udfรธres TestNG kode ved hjรฆlp af Ant

Udfรธr 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.klasseโ€ i pakken testAnt

Guru99AntClass.klasse

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

Udfรธr TestNG kode ved hjรฆlp af Ant

Download ovenstรฅende fil

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รฅ.

Myre med Selenium Webdriver

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) Nu skal du รฆndre den tidligere oprettede klasse Guru99AntClass.java med ny kode.

Her i dette eksempel vores trin ved hjรฆlp af Selenium er:

  1. Gรฅ til https://demo.guru99.com/test/guru99home/
  2. Lรฆs alle kursuslinks รฉn efter รฉn
  3. 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:

Myre med Selenium Webdriver

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.

Opsummer dette indlรฆg med: