Learn Selenium and Java for Selenium

Sunday, 24 April 2016

Write Data in Excel using Selenium JXL

How Selenium supports Writing of Excel File?

Writing of Excel file can be achieved with the help of API called JXL. Currently JXL only support xls type file.

Steps to download jxl2.6 jar file and configure in the Project

Step1: Go to the URL:-http://www.findjar.com/jar/net.sourceforge.jexcelapi/jars/jxl-2.6.jar.html and down load the jar file
Step 2: Extract the jar file at the location of download
Step3: On Eclipse>Go to Project and right Click on it >Go to build path>Select Configure build pat>Under Libraries ,click on Add External Jar to add the Jar file

Steps to Write data into the Excel File

  • Specify the Location of File where file is to be stored
  • Create WorkBook
  • Create Sheet
  • Get Sheet
  • Add Cell Data 
  • Write WorkBook
  • Close WorkBook

 import java.io.File;  
 import java.io.IOException;  
 import org.apache.commons.io.FileUtils;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.OutputType;  
 import org.openqa.selenium.TakesScreenshot;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.chrome.ChromeDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 import org.testng.annotations.Test;  
 import org.testng.asserts.*;  
 import jxl.Workbook;  
 import jxl.read.biff.BiffException;  
 import jxl.write.*;  
 public class WriteExcel {  
      public static void main(String[] args) throws BiffException, IOException, WriteException {  
           File f = new File("D:/WriteData.xls");//Give a File Path  
           WritableWorkbook w = Workbook.createWorkbook(f);//Create WorkBook  
           w.createSheet("ashish", 0);//Create Sheet  
           WritableSheet s =w.getSheet(0);//Get Sheet  
           //Add Cell Data  
           Label data = new Label(0,0,"Test");  
           s.addCell(data);  
           //Write WorkBook  
           w.write();  
           //Close WorkBook  
           w.close();  
      }  
 }  

Notes

1-Eclipse support one forward slash or two backward slash ,so we have used forward slash in order to create the file
2-createWorkbook method() creates a work book
3-WritableWorkbook class has a method createSheet() which is used to create a sheet within a workbook, this method has a parameter 1 as "Name of Sheet" which is ashish in this case and parameter 2 as index of sheet: Here index of first sheet is zero
4-Label is a class provided by JXL which creates a cell when added to a sheet.Its Parameters are
    a) Parameter 1: Column number
    b) Parameter 2: Row number
    c) Parameter 3: Content to be added in cell
5-WritableSheet class has a method called addCell which is used to add cell data to the specified location mentioned in Label


Excel Sheet Output



Excel File Created Using JXL






Saturday, 23 April 2016

Read Excel file in Selenium using JXL

How Selenium supports reading of Excel File?

Reading of Excel file can be achieved with the help of API called JXL. Currently JXL only support xls type file.

Steps to download jxl2.6 jar file and configure in the Project

Step1: Go to the URL:-http://www.findjar.com/jar/net.sourceforge.jexcelapi/jars/jxl-2.6.jar.html and down load the jar file
Step 2: Extract the jar file at the location of download
Step3: On Eclipse>Go to Project and right Click on it >Go to build path>Select Configure build pat>Under Libraries ,click on Add External Jar to add the Jar file


Steps to Read the Excel File

  • Specify the Location of File
  • Load WorkBook
  • Load Sheet: Sheet can be loaded via getSheet() method , sheet name /index can be passed as argument.By default Sheet1 has zero index and so on
  • Load Cell: getCell() method used with 2 arguments, first argument points to column of excel sheet and second argument points to row of excel sheet 
  • Read Data

 import java.io.File;  
 import java.io.IOException;  
 import org.apache.commons.io.FileUtils;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.OutputType;  
 import org.openqa.selenium.TakesScreenshot;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.chrome.ChromeDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 import org.testng.annotations.Test;  
 import org.testng.asserts.*;  
 import jxl.Workbook;  
 import jxl.read.biff.BiffException;  
 public class ExcelRead {  
      public static void main(String[] args) throws BiffException, IOException {  
           File f = new File("D:/TestTest.xls");  
           Workbook w = Workbook.getWorkbook(f);  
           String c =w.getSheet("Sheet1").getCell(0, 0).getContents();  
           System.out.print(c);  
      }  
 }  

Notes

1-Eclipse support one forward slash or two backward slash ,so we have used forward slash in order to locate the file
2- Workbook is a class so we have created one reference variable "w"
3- getWorkbook() is a static method which is used to load the Work Book.As getWorkbook() is a static method it has been called by its class name
4-getContents() method return a string value so we have stored in a string called "c"

Output

Column 0 and Row 0 value of Excel file has been Printed 
Excel Sheet
Excel Sheet Used




Handling Keyboard Events in Webdriver

What are keyboard events?

Keyboard events are actions that can be performed with keyboard such as Alt F4, Shift "A", Control+Alt+Delete.There may be scenarios were we need to perform typing like a keyboard in certain fields

How Selenium handles keyboard events?

Selenium offers Action class in order to handle the keyboard events.The Action is a user facing API for emulating complex user action events.

There are different methods that are offered by Action Class. Most commonly used for keyboard events are
  • keyDown()- Press down a particular Key in keyboard, It can be Caps Lock or Shift button or any key present on keyboard
  • KeyUp()- UnPress the a particular key in keyboard.  It can be Caps Lock or Shift button or any key present on keyboard 
Here is the code snippets for using the Actions

//Configure the Action
Action builder=new Action(driver)

//To press a particular key(e.g Shift key)
builder.keydown(keys.SHIFT)


The below types a capital letter text on Email id field present on the facebook page


 import java.io.File;  
 import java.io.IOException;  
 import java.util.concurrent.TimeUnit;  
 import org.apache.commons.io.FileUtils;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.JavascriptExecutor;  
 import org.openqa.selenium.Keys;  
 import org.openqa.selenium.OutputType;  
 import org.openqa.selenium.TakesScreenshot;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.WebElement;  
 import org.openqa.selenium.chrome.ChromeDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 import org.openqa.selenium.interactions.Action;  
 import org.openqa.selenium.interactions.Actions;  
 import org.testng.annotations.Test;  
 import org.*;  
  public class KeyboardEvents  
 {  
      public static void main(String[] args) {  
           WebDriver a = new FirefoxDriver();  
           a.manage().window().maximize();  
           a.get("http://www.facebook.com");  
           a.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);  
           Actions builder = new Actions(a);  
           WebElement e=a.findElement(By.id("email"));  
           Action writeCapital=builder.keyDown(Keys.SHIFT).sendKeys(e, "abc").keyUp(Keys.SHIFT).build();  
           writeCapital.perform();  
      }  
 }  


Notes

1-WebElement is a class in Selenium which is currently used to store the email field location
2-Action class offers keyDown method which is used to press down a particular key
3-.build() method is used to combine different keys method in a single command.For example in below case we are pressing some key then sending some value to the field and then unpress the same key, so 3 different types of action took place in order to combine them build() method is used
4-Perform method is used here to execute the action.

Output


Capital "ABC" is typed on email id field

Friday, 22 April 2016

Handling Mouse Events in Webdriver

What are mouse events?

Mouse events are actions that can be performed with mouse such as double click, drag and drop, click and hold.There may be scenarios were we need to perform mouse hover to see the calender etc..

How Selenium handles mouse events?

Selenium offers Action class in order to handle the mouse events.The Action is a user facing API for emulating complex user action events.

There are different methods that are offered by Action Class. Most commonly used for Mouse events are


  • clickAndHold()- Click without releasing the current mouse location
  • contentClick() - Perform a context click at current mouse location
  • dobleClick()- Perform a double click at current mouse location
  • dragAndDrop(source,target) -Performs click and hold at the location of the source element and moves to the location of target element then releases the mouse
Here is the code snippets for using the Actions

//Configure the Action
Action builder=new Action(driver)

//To focus on element using Webdriver
builder.moveToElement(element).perform()

//To click on the element to Focus
builder.moveToElement(element).click().perform()

The below program focus on element using Action Class


import java.io.File;  
 import java.io.IOException;  
 import java.util.concurrent.TimeUnit;  
 import org.apache.commons.io.FileUtils;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.JavascriptExecutor;  
 import org.openqa.selenium.OutputType;  
 import org.openqa.selenium.TakesScreenshot;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.WebElement;  
 import org.openqa.selenium.chrome.ChromeDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 import org.openqa.selenium.interactions.Actions;  
 import org.testng.annotations.Test;  
 import org.*;  
  public class MouseEvents  
 {  
      public static void main(String[] args) {  
           WebDriver a = new FirefoxDriver();  
           a.manage().window().maximize();  
           a.get("http://www.seleniumhq.org/");  
           a.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);  
           Actions builder = new Actions(a);  
           WebElement e=a.findElement(By.id("menu_projects"));  
           builder.moveToElement(e).perform();  
      }  
 }  


Notes

1-WebElement is a class in Selenium which is currently used to store the Project button location
2-Action class offers moveToElement which is used to move the mouse to location stored in WebElement
3-Perform method is used here to execute the action.

Output


Project Tab is highlighted

Sunday, 17 April 2016

Generate Logs in Selenium


What are Log files?

Log files are check points that can be added at any step of code.Logs gives us detailed reasoning of any step failure .To see logs we first need to download Log4j jar file.

Steps to Configure Log4j in Selenium

1-Go to http://www.java2s.com/Code/Jar/a/Downloadapachelogginglog4jjar.htm
2-Download apache-logging/apache-logging-log4j.jar.zip( 435 k) and extract Jar File and Store it 
3-Go to Selenium>Right Click of Project Name>Click on Properties>Select Java Build Path>Go to Libraries>Add External jar and open and select the Log4j jar from the location it was saved
4- Open a notepad, Copy and Paste the code below and save the filename as Log4j.Properties with double quotes("") on it on the Project Location 

// Here we have defined root logger
log4j.rootLogger=INFO,CONSOLE,R,HTML,TTCC

// Here we define the appender
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.TTCC=org.apache.log4j.RollingFileAppender
log4j.appender.HTML=org.apache.log4j.FileAppender

// Here we define log file location
log4j.appender.R.File=./log/testlog.log
log4j.appender.TTCC.File=./log/testlog1.log
log4j.appender.HTML.File=./log/application.html

// Here we define the layout and pattern
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= %5p [%t] (%F:%L)- %m%n
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d - %c -%p - %m%n
log4j.appender.TTCC.layout=org.apache.log4j.TTCCLayout
log4j.appender.TTCC.layout.DateFormat=ISO8601
log4j.appender.HTML.layout=org.apache.log4j.HTMLLayout
log4j.appender.HTML.layout.Title=Application log
log4j.appender.HTML.layout.LocationInfo=true


Properties file is configured on the Project Location

The below code will generate Log info after each Steps of code execution



Notes
1-An object "L" of Logger Class has been created to generate Log Statements
2-Class name has been passed to the getLogger method because it is easy to trace the logs in case of Multiple Classes being used in a Project. See output >NotePad file a class Name is mentioned in the Log
3-Properties file of Logs has been configured in with the use of PropertyConfigurator.configure("Log4j.Properties") code



Output


Log File Created on the Project Folder

Log Info Details in NotePad

 








Setting up a Selenium Webdriver Project

How To Setup a Selenium WebDriver Project in Eclipse ?

Creating a Simple Selenium – Java project in Eclipse

This post will help the selenium users-Beginners to setup the selenium project and execute a simple WebDriver script
Steps To Create a Selenium Project in Eclipse


Step 1: Download Eclipse



Step 2: Creating a New Java Project in Eclipse IDE



Step 3: Enter a Project Name E.g:SampleDemo

Step 4: Creating a New Package
Right Click on the New Java Project created → New→ Package

Step 5: Type In a New Package Name E.g:com.selenium.example

Step 6: Creating a New Java Class file.
Right Click on the Newly created Package → New → Class

Step 7:Type In a Name for your Java Class file,
click on the check box for “public static void main (String args[])”
Click on Finish


Step 8: The Java class file is created and ready for Java Scripting.

Now, We need to add the Selenium Library files to our project
Step 9: Download the selenium server from the seleniumhq.org website.

Step 10: Click on Downloads Tab and then click on the link as highlighted in the screenshot

Step 11: Save the jar file in a specific Location E.g C:/Selenium

Step 12: Configuring Build Path.
Right Click on the package → Build Path → Configure Build Path

Step 13: Click on Libraries tab → Add External Jar’s

Step 14: The jar files should be loaded from the C:/Selenium folder (or where you have saved the downloaded Jar file from Seleniumhq website) to our Eclipse Workspace and should look as in the screenshot

Step 15:We can also verify by expanding the Referenced Libraries in the Project Explorer that, whether the Jar file is added properly

Step 16: Now, our Eclipse is ready for Selenium Scripting :-)
Web Driver object initialization as WebDriver driver=new FirefoxDriver();
As in the below Screenshot

You may see errors, but that’s not a problem here is how we resolve it.


Step 17: Mouse Hover near the WebDriver error line you will see an Auto suggest Option, you will find Import WebDriver.
Click on Import WebDriver –Now the error will be vanished.

Step 18: Now Mouse Hover near the Firefox Driver, and you will get an autosuggest option.
Click on the Import FirefoxDriver option the suggested list


You can also eliminate the steps 15,16,17 by manually adding the below Import statements
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
And, that’s it we are done with Selenium Project setup in Eclipse.

Implicit vs Explicit wait in Selenium


Why using waits in selenium?

When a web page is loaded the elements within a page may load at different time intervals, this makes locating element a bit difficult , if element is not present in the DOM it will raise ElementNotVisibleException. To solve these selenium has provides us 2 types of waits


  • Implicit wait: This wait is used to tell webdriver to wait for a certain period of time when trying to find the elements if they are not immediately available. 
  • Explicit wait: This wait is used to tell webdriver wait for a certain condition to occur before proceeding with the code


Implicit Wait

The below code is an example of Implicit wait where the webdriver waits for a fixed 20 seconds before halting the program as the class"aa" does not exist on facebook page


Output

NoSuchElementException



Explicit Wait

The below code is an example of Explicit wait where the webdriver waits until submit button on the facebook page is visible and clickable.It does not wait for fixed 10 seconds as specified in WebdriverWait(a,10)
















Output


Saturday, 16 April 2016

Scroll into View in Selenium

Scroll down to a view on a webpage in Selenium

How selenium supports scrolling down on a page?

Consider a web application, some times some text is visible towards bottom of a page so we need to scroll down to a page to see the text

Selenium provides JavaScript Executor interface which will allow to execute Java Script from Selenium Script

Scroll Down a Page 

The following code will scroll down to page of Wikipedia until the text "On this day..." element is visible

 import java.io.File;  
 import java.io.IOException;  
 import org.apache.commons.io.FileUtils;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.JavascriptExecutor;  
 import org.openqa.selenium.OutputType;  
 import org.openqa.selenium.TakesScreenshot;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.WebElement;  
 import org.openqa.selenium.chrome.ChromeDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 import org.testng.annotations.Test;  
      public class Scroll{  
           public static void main(String[] args) throws IOException, InterruptedException {  
                WebDriver a= new FirefoxDriver();  
                a.manage().window().maximize();  
                a.get("https://en.wikipedia.org/wiki/Main_Page");  
                JavascriptExecutor je = (JavascriptExecutor)a;  
                WebElement c= a.findElement(By.xpath(".//*[@id='On_this_day...']"));  
                je.executeScript("arguments[0].scrollIntoView(true);",c);  
                System.out.println(c);  
             a.quit();  
                }  
           }  



Notes

1- As JavascriptExecutor is interface we cannot create an object for this, we have typecast(downcasting) it with webdriver reference which is "a"
2- ScrollIntoView(true) :- It will scroll until element is not visible, once it is visible it will stop scrolling
3- executeScript("arguments[0].scrollIntoView(true);",c); :-This is a javascript code and here the code will keep on scrolling the page until the element present on "c" reference variable is not visible

Output









Assertion in Selenium

How to verify the Results?

Why Assertion and how Selenium support Assertion?


  • Assertion is needed to verify that web application which consist of UI elements such as text menu, check box, button, combo box ,text field are correct or not
  • It is used to verify Actual and Expected Output 
  • Assert Class is provided by TestNG which has different assert method available e.g.
    • assertEquals(String Actual, String Expected):-It takes two string arguments and checks whether both are equal or not , if not it will fail the test
    • assertTrue(condition)- It takes one Boolean argument and checks if condition is true, If it isint an Assertion Error is thrown
    • assertFalse(condition)- It takes one Boolean argument and checks if condition is false, If it isint an Assertion Error is thrown

The following code will verify "Create An Account" text present on the facebook page

 import java.io.File;  
 import java.io.IOException;  
 import org.apache.commons.io.FileUtils;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.OutputType;  
 import org.openqa.selenium.TakesScreenshot;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.chrome.ChromeDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 import org.testng.annotations.Test;  
 import org.testng.asserts.*;  
 public class Assert {  
 @Test  
           public void Ashishmthod()  
           {  
           WebDriver a= new FirefoxDriver();  
           a.manage().window().maximize();  
           a.get("http://www.facebook.com/");  
           String h= a.findElement(By.xpath(".//div[@class='mbs _52lq fsl fwb fcb']/span")).getText();  
           System.out.print(h);  
           org.testng.Assert.assertEquals(h, "Create an account");  
                }  
           }  

Notes

1- Webdriver provides a getText() method to fetch the text present on the desired location of the page
2- Actual Text is stored in String "s"
3- Assert Equals method of Asset Class compares Actual text to the Expected Text


Output






Selecting a option from Dropdown List in Selenium

How to select option from Drop Down List


How Selenium supports DropDown List?


  • Selenium webdriver provides a class called Select from package "org.openqa.selenium.support.ui.Select
  • Drop down Menu
  • Interestingly Select Class has 3 methods by which dropdown list values can be selected they are
    • selectByIndex():Selection will be made on the indexing of the list.First member of list will have index as zero and so on it will be incremented for the next members.
    • selectByValue():Selection will be made on the basis on numbering of the list
    • selectByVisibleText(): Selection will be made of the text visible on the drop down list

The following code will select Date/Month/Year on the facebook login page by using the methods described above

 import java.io.IOException;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 import org.openqa.selenium.support.ui.Select;  
 public class Dropdown {  
      public static void main(String[] args) throws IOException, InterruptedException {  
      WebDriver a= new FirefoxDriver();  
      a.manage().window().maximize();  
      a.get("http://www.facebook.com/");  
      Select index= new Select(a.findElement(By.xpath(".//*[@id='day']")));  
      index.selectByIndex(1);  
      Select month= new Select(a.findElement(By.xpath(".//*[@id='month']")));  
      month.selectByVisibleText("Jan");  
      Select year= new Select(a.findElement(By.xpath(".//*[@id='year']")));  
      year.selectByValue("1989");  
      a.quit();  
      }  
      }  

'

Notes

1- As Select is a class  3 different types of objects has been created to cater different type of dropdown list for day/month/year
2- Values on the drop down are accessed via Index/Visible text/Value


Output

Handling Popup in Selenium

How to handle popups of any Website


What are popups?


  • Popups are launched automatically from the website and they act as a Interruption
  • Popups windows are basically of 2 types
    • HTML( Act like a new Frame)
    • Non-HTML( Act like a Alert)
    • In order to differentiate between them just inspect the popup window with Firebug
  • Selenium has given us Alert Class to handle the Non-HTML popups

Non-HTML Pop-up window


The following code will get the text written on the Pop-up

 import java.io.File;  
 import java.io.IOException;  
 import org.apache.commons.io.FileUtils;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.OutputType;  
 import org.openqa.selenium.TakesScreenshot;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.chrome.ChromeDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 import org.testng.annotations.Test;  
 public class Alert {  
      public static void main(String[] args) throws IOException, InterruptedException {  
           WebDriver a= new FirefoxDriver();  
           a.manage().window().maximize();  
           a.get("http://www.ksrtc.in/");  
           a.findElement(By.xpath(".//*[@class='button1 redbtn']")).click();;  
           Thread.sleep(2000);       
           org.openqa.selenium.Alert s= a.switchTo().alert();  
           String aa=s.getText();  
           System.out.print(aa);  
      a.quit();  
           }  
      }  


Notes

1-Alert is a class and we can create a reference variable for Alert class 
2-SwitchTo() is a method offered by Selenium webdriver which act as a switching point to the new window which can be Alert and Frames
3- 3 different type of action can be taken on alert window for which 3 methods are available in Alert Class
  • Accept():- To Click on Ok/Submit button on the Alert
  • Decline(): Close the Alert window/Click on Cancel button on the Alert window
  • getText():- Returns exact message of the Alert


Output



Friday, 15 April 2016

Capture Screenshot in Selenium


How to Capture Screen Shot in Selenium



Why taking a screenshot?

  • Screenshot helps to understand the flow of the Application
  • For the failed cases screenshot helps to understand on which page the Test case has failed
  • Screenshot is taken to track the execution of Test Cases



The following code will takes the screenshot of the Facebook login page


 import java.io.File;  
 import java.io.IOException;  
 import org.apache.commons.io.FileUtils;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.JavascriptExecutor;  
 import org.openqa.selenium.OutputType;  
 import org.openqa.selenium.TakesScreenshot;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.WebElement;  
 import org.openqa.selenium.chrome.ChromeDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 import org.testng.annotations.Test;  
 public class screenshot {  
        public static void main(String[] args) throws IOException {  
           // TODO Auto-generated method stub  
           WebDriver a = new FirefoxDriver();  
           a.manage().window().maximize();  
           a.get("https://www.facebook.com");  
           a.findElement(By.xpath(".//*[@id='email']")).sendKeys("learn Automation");  
           TakesScreenshot ts = (TakesScreenshot)a;  
           File Source = ts.getScreenshotAs(OutputType.FILE);  
           FileUtils.copyFile(Source, new File("./screenshot/facebook1234.png"));  
           a.quit();  
      }  
 }  




Notes
1- TakesScreenshot is an interface in selenium and we cannot create a object of interface so we have typecast it
2-Typecasting of TakesScreenshot is done in order to get the object
3-getScreenshotAs is a method which is used to get screen shot as a file/Bytes
4-File is a class in java and its object "source" is used to store the screenshot in buffer memory
5-Again FileUtils is a class in java by which we can use a method called copy file which is used to copy a file stored in buffer memory to a particular project location
6- "./screenshot/facebook.png" :- Here "./" refers to the current project location folder which is Learn Automation

Output



In order to see facebook.pngfile we need to refresh the Learn Automation Project








Popular Posts

Recent Posts



Newsletter

Join our newsletter to get secret tips directly in your inbox!


*We Hate Spam!

Powered by Blogger.