Showing posts sorted by date for query selenium. Sort by relevance Show all posts
Showing posts sorted by date for query selenium. Sort by relevance Show all posts

How to Upload file in selenium using c#

How to Upload file in selenium using c#

We are facing a problem when we have a situation like an upload file in the server in the automation testing because most of the cases we have seen upload dialog box is not a web-based popup, it is a window-based popup. 


File upload box


Currently, Selenium can not handle it because it only supports web-based applications only, so we need to take help from 3rd party applications like autoIT or robot to handle this kind of popup. 

But we can handle this upload popup without any 3rd part application if we use C# language for selenium. There is a NuGet package available in .NET which can handle this upload pop up without any 3rd party applications. 

Package name: OpenDialogWindowHandler -v0.0.0.1

You need to import it from the NuGet package manager before using it inside the class.

Method to upload file

public void UploadFile(string filepath,string filename){
    HandleOpenDialog hndOpen =  new  HandleOpenDialog();
    hndOpen.fileOpenDialog(filepath,filename);
}

There first we need to create an object of HandleOpenDialog and then call the function
fileOpenDialog(). This function has 2 parameter 1st one is file path eg.  "c:\\helpfile"
and next one is file name. eg "help.txt".

How to change chrome download path using selenium

How to change chrome download path using selenium
How to change chrome download path using selenium

We can change our chrome download folder location from chrome settings and provide our desired location, but in case of automation, we need to change our download location dynamically. Suppose we need to download a file from an application and need to verify the downloaded file is a valid file or not. We have different API or jars are available to verify the document. I will discuss this verification in my later post. First, we need to download the file in a folder and folder will be created in runtime may be based on timestamp. So you can understand download path will be different every run. 

There is the code which will set the chrome download path runtime. 


 public WebDriver driver;  
 System.setProperty("webdriver.chrome.driver", driverPath+"chromedriver.exe");  
 HashMap<String, Object> chromePrefs = new HashMap<String, Object>();  
 chromePrefs.put("profile.default_content_settings.popups", 0);  
 chromePrefs.put("download.default_directory", downloadFilepath);  
 ChromeOptions options = new ChromeOptions();  
 options.setExperimentalOption("prefs", chromePrefs);  
 options.addArguments("--disable-notifications");  
 DesiredCapabilities cap = DesiredCapabilities.chrome();  
 cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);  
 cap.setCapability(ChromeOptions.CAPABILITY, options);  
 System.setProperty("webdriver.chrome.driver", driverPath+"chromedriver.exe");  
 driver = new ChromeDriver(options);  

Hope it will solve your problem. 

What is the "Background" keyword in Cucumber feature file


What is the "Background" keyword in Cucumber feature file


When we are writing Feature file in cucumber,  we write multiple Scenarios. All scenarios start with a particular point. Suppose  I am writing the feature file called home_page_facebook and the number of scenarios is there to check the home page functionality. Now if you think about any scenario then you need to login first on the facebook page to reach to the home page. So it is better to write all common or repeated step in one place rather than in all scenarios. To achieve this situation we need to add "Background" keyword in the feature file. Let's understand with an example.  

Feature file : home_page_facebook.feature

Feature: In order to test the home page of the application as a registered user  I want to specify the features of the home page. 

Scenario :  Home page default contents.
Given user on application landing page.
When user enter password
And user enter username
And user click on login button 
Then user navigates to application home page.
And user validate default contents of home page

Scenario : Top banner settings option.
Given user on application landing page.
When user enter password
And user enter username
And user click on login button 
Then user navigates to application home page.
When user click on the setting other 
Then user get the logout option


There is 2 scenario where you can see login steps are common to both the scenarios.  So we can eliminate the common section and put it into a commonplace.  

So I am rewriting the feature file with the Background keyword. 


Feature file : home_page_facebook.feature

Feature: In order to test the home page of the application as a registered user  I want to specify the features of the home page. 

Background: Flow till home page 
Given user on application landing page.
When user enter password
And user enter username
And user click on login button 
Then user navigates to application home page.

Scenario :  Home page default contents.
Then user validate default contents of home page

Scenario : Top banner settings option.
When user click on the setting other 
Then user get the logout option

Now you can see login steps are in the commonplace.
There we use Background keyword.  All steps mentioned in the Background keyword will be executed before every scenario or scenario outline. 

I have provided all my glue code and cucumber feature which I have written in eclipse.

cucumber Background keyword

Step definition 

 package com.Cucumber.steps;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.chrome.ChromeDriver;  
 import cucumber.api.java.After;  
 import cucumber.api.java.en.Given;  
 import cucumber.api.java.en.Then;  
 import cucumber.api.java.en.When;  
 public class home_page_facebook {  
      WebDriver driver;  
      @Given("^user on application landing page$")  
      public void user_on_application_landing_page() throws Throwable {  
        // Write code here that turns the phrase above into concrete actions  
           System.setProperty("webdriver.chrome.driver", "C:\\Users\\anjan\\Desktop\\cucmber\\chromedriver\\chromedriver.exe");  
           driver = new ChromeDriver();  
           driver.get("http://www.facebook.com/");  
           driver.manage().window().maximize();  
      }  
      @When("^user enter password$")  
      public void user_enter_password() throws Throwable {  
        // Write code here that turns the phrase above into concrete actions  
           driver.findElement(By.id("pass")).sendKeys("giveourfacebookpassword");  
      }  
      @When("^user enter username$")  
      public void user_enter_username() throws Throwable {  
        // Write code here that turns the phrase above into concrete actions  
           driver.findElement(By.id("email")).sendKeys("yourusername");  
      }  
      @When("^user click on login button$")  
      public void user_click_on_login_button() throws Throwable {  
        // Write code here that turns the phrase above into concrete actions  
           driver.findElement(By.id("loginbutton")).click();  
      }  
      @Then("^user navigates to application home page\\.$")  
      public void user_navigates_to_application_home_page() throws Throwable {  
        // Write code here that turns the phrase above into concrete actions  
        Thread.sleep(3000);  
      }  
      @Then("^user validate default contents of home page$")  
      public void user_validate_default_contents_of_home_page() throws Throwable {  
        // Write code here that turns the phrase above into concrete actions  
        if(driver.findElement(By.name("q")).isDisplayed())  
        {  
             System.out.println("home page search box diplayed");  
        }else{  
             System.out.println("home page search box not diplayed");  
        }  
      }  
      @When("^user click on the setting other$")  
      public void user_click_on_the_setting_other() throws Throwable {  
        // Write code here that turns the phrase above into concrete actions  
           driver.findElement(By.id("pageLoginAnchor")).click();  
           Thread.sleep(3000);  
      }  
      @Then("^user get the logout option$")  
      public void user_get_the_logout_option() throws Throwable {  
        // Write code here that turns the phrase above into concrete actions  
        if(driver.findElement(By.xpath("//*[text()='Log out']")).isDisplayed()){  
             System.out.println("logout diplayed");  
        }else{  
             System.out.println("logout not diplayed");  
        }  
      }  
      @After  
       public void tearDown(){  
           driver.quit();  
      }  
 }  


Feature file


 Feature: In order to test the home page of the application as a registered user  
  I want to specify the features of the home page.  
  Background: Flow till home page  
   Given user on application landing page  
   When user enter password  
   And user enter username  
   And user click on login button  
   Then user navigates to application home page.  
  Scenario: Home page default contents  
   Then user validate default contents of home page  
  Scenario: Top banner settings option  
   When user click on the setting other  
   Then user get the logout option  

In my previous cucumber tutorial, I have talked about how to setup cucumber in eclipse and how to run cucumber project. Here is the link

https://www.automation99.com/2017/06/how-to-install-cucumber.html


How to highlight elements in WebDriver during runtime

How to highlight elements in WebDriver during runtime

In web automation-testing, element highlighter plays a very important role. It helps to track the exact step to be performed.  UFT/QTP like testing tool is capable to highlight an element in run time because you will get this feature inbuilt with this tool. In Selenium there is no such feature available so we need to write our own code to highlight element.

  
Highlighting element is also useful for debugging the code.One way to know steps being performed in the browser is to highlight the web page elements.

The core to use "JavaScriptExecutor" to inject javascript in your application and change the CSS for the element, like create a border for the element. 

Sample code 
 JavascriptExecutor js=(JavascriptExecutor)driver;   
 js.executeScript("arguments[0].style.border='4px groove red'", Element);  

Explanation  

Arguments[0].style.border:- this script is injecting the CSS style tag into the element and making its border settings with a 4px wide red line with groove look.

Element: - This is the element around which border will be drawn.

I am creating a method which could be reusable for highlighting the test element. 

Element Highlight method 


 public void HighlightElement(WebDriver driver, WebElement elm){  
           try{  
                JavascriptExecutor js=(JavascriptExecutor)driver;   
                js.executeScript("arguments[0].style.border='4px groove red'", elm);  
          Thread.sleep(1000);  
          js.executeScript("arguments[0].style.border=''", elm);  
           }catch(Exception e){  
                System.out.println(e);  
           }  
      }px groove red'", email);  


Video



Complete code


 package com.selenium.sampleseleniumproject;  
 import org.testng.annotations.Test;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.JavascriptExecutor;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.WebElement;  
 import org.openqa.selenium.chrome.ChromeDriver;  
 public class AppTest3 {  
      protected WebDriver driver;  
      @Test  
      public void Highlight() throws InterruptedException {  
           System.setProperty("webdriver.chrome.driver",  
                     "C:\\Users\\anjan\\Desktop\\cucmber\\chromedriver\\chromedriver.exe");  
           driver = new ChromeDriver();  
           driver.get("http://www.faceboo.com");  
           driver.manage().window().maximize();  
           WebElement email = driver.findElement(By.xpath("//*[@id='email']"));  
           WebElement pass = driver.findElement(By.xpath("//*[@id='pass']"));  
           HighlightElement(driver, email);  
           email.sendKeys("[email protected]");  
           HighlightElement(driver, pass);  
           pass.sendKeys("password");  
           // close browser  
           driver.close();  
      }  
      public void HighlightElement(WebDriver driver, WebElement elm) {  
           try {  
                JavascriptExecutor js = (JavascriptExecutor) driver;  
                js.executeScript("arguments[0].style.border='4px groove red'", elm);  
                Thread.sleep(1000);  
                js.executeScript("arguments[0].style.border=''", elm);  
           } catch (Exception e) {  
                System.out.println(e);  
           }  
      }  
 }  

How to do scroll action till the particular element is present in appium


How to do scroll action till the particular element is present in appium ?


How to do scroll action till the particular element is present or not
I am currently working on appium for automating WhatsApp mobile application. I needed one method which would perform the ‘scroll’ action to a particular name or number and choose to click on a particular name or number. So I googled for that method and I found out that there are two methods, scrollTo(), scrollToExact(), which was supposed to solve my problem. But when  I started writing the code and again I faced another problem.  I am using appium java client 5.0.0-BETA9 (updated version )and on this version, there are no such methods like scrollTo() or scrollToExact().  Previously I had worked on the seetest tool and it is a mobile automation tool, there was a method called ‘swipewhileNotFound’ which would scroll the app view until the desired object was visible.  SeeTest is a licensed tool. Hence there are several readymade methods available for automating mobile application.  So I started writing this method for appium because I needed this method for appium to work.


I have used TestNG to write the test, but you can use any testing framework or simple Java class with the method mentioned above. I have posted my code here so that you can have a look at it. Also, you can download the complete java file from the below link


How to do scroll action till the particular element is present or not

 package appium;  
 import java.net.MalformedURLException;  
 import java.net.URL;  
 import java.util.concurrent.TimeUnit;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.Dimension;  
 import org.openqa.selenium.WebElement;  
 import org.openqa.selenium.remote.DesiredCapabilities;  
 import org.testng.annotations.*;  
 import io.appium.java_client.android.AndroidDriver;  
 public class WhatsAppAutomate {  
 // WebDriver driver;  
 protected AndroidDriver driver;  
 @BeforeClass  
  public void setUp() throws MalformedURLException {  
  DesiredCapabilities capabilities = new DesiredCapabilities();  
  capabilities.setCapability("deviceName", "8fe5de4a");  
  capabilities.setCapability("platformName", "Android");  
  capabilities.setCapability("appPackage", "com.whatsapp");  
  // This package name of your app (you can get it from apk info app)  
  capabilities.setCapability("appActivity", "com.whatsapp.Main");   
  driver = new AndroidDriver(new URL("http://192.168.0.102:5036/wd/hub"), capabilities);  
 }  
  @Test  
  public void testCal() throws Exception {  
  swipeWhileNotFound("down","//*[@text='Anjan Mondal']",1000,3000,3000,17,true);  
  }  
  public void swipeWhileNotFound(String direction, String xpath,int offset,int waitTime,int duration,int round, boolean click) throws InterruptedException {  
   Dimension size = driver.manage().window().getSize();  
  int startx = size.width/2;  
  int starty=0;  
  int endy=0;  
  try {  
  driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);  
  boolean loop = true;  
  int count = 0;  
  while (loop) {  
  if (count == round) {  
  System.out.println("round over");  
  break;  
  }  
  if (driver.findElements(By.xpath(xpath)).size() > 0) {  
  loop = false;  
  System.out.println("element found");  
  WebElement elm = driver.findElement(By.xpath(xpath));  
  if (click)  
  elm.click();  
  } else {  
  if(direction.toUpperCase().equals("UP")){   
  starty=size.height-offset;  
  endy = (int) (size.height * 0.60);  
  driver.swipe(startx, starty, startx, endy, duration);  
  Thread.sleep(waitTime);  
  }else if(direction.toUpperCase().equals("DOWN")){  
  starty = (int) (size.height * 0.80);   
  endy= offset;  
  driver.swipe(startx, endy, startx, starty, duration);  
  Thread.sleep(waitTime);  
  }   
  count++;  
  }  
  }  
  } catch (Exception e) {  
  System.out.print(e);  
  } finally {  
  driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);  
  }  
  }  
  @AfterClass  
  public void teardown() {  
  // close the app  
  driver.quit();  
  }  
 }  

How to use chrome headless using selenium

How to use chrome headless using selenium

How to use chrome headless using selenium  


A headless browser is a kind of web browser which has no user interface, In other words,  a browser, that access web pages but doesn’t show them to any human being. They’re actually used to provide the content of web pages to other programs. 



Why is that useful?



A headless browser is a great tool for automated testing and server environments where you don't need a visible UI shell. For example, you may want to run some tests against a real web page, create a PDF of it, or just inspect how the browser renders an URL.

Now Chrome also supports headless feature from version 59 .  

Right now, Selenium opens a full instance of Chrome. In other words, it's an automated solution but not completely headless. However, Selenium could use --headless in the future.


There are few bugs  in new chrome driver so we need to use 2 chromeOptions to use headless Chrome in selenium  

Here is code for chrome headless  in windows system 

 import org.junit.Assert;  
 import org.junit.Test;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.chrome.ChromeDriver;  
 import org.openqa.selenium.chrome.ChromeOptions;  
 import org.openqa.selenium.support.ui.ExpectedConditions;  
 import org.openqa.selenium.support.ui.WebDriverWait;  
 import java.io.IOException;  
 public class HeadlessChrome  
 {  
  @Test  
  public void createChromeDriverHeadless() throws IOException  
  {  
    ChromeOptions chromeOptions = new ChromeOptions();  
    System.setProperty("webdriver.chrome.driver", "C:\\Users\\anjan\\Desktop\\cucmber\\chromedriver_win32\\chromedriver.exe");  
    chromeOptions.addArguments("--headless");  
    chromeOptions.addArguments("--disable-gpu");  
    WebDriver Driver = new ChromeDriver(chromeOptions);  
    Driver.navigate().to("https://www.facebook.com");  
    WebDriverWait waitForUsername = new WebDriverWait(Driver, 5000);  
    waitForUsername.until(ExpectedConditions.visibilityOfElementLocated(By.id("email")));  
    Driver.findElement(By.id("email")).sendKeys("tomsmith");  
    Driver.findElement(By.id("loginbutton")).click();  
    WebDriverWait waitForError = new WebDriverWait(Driver, 5000);  
    waitForError.until(ExpectedConditions.visibilityOfElementLocated(By.id("email")));  
    Assert.assertTrue(Driver.findElement(By.id("loginbutton")).getText().contains("Log In"));  
    Driver.quit();  
  }  
 }  

How to create maven project in eclipse for selenium



how to create maven project in eclipse for selenium

How to create maven project in eclipse for selenium

In my earlier post I have discussed about maven tool on automation front.  I have also discussed about whats is POM and why we use maven tool for java project .  In this post I will create one sample selenium project using maven. Before creating the maven project we need to download and install maven.  I am assuming you  have JAVA and eclipse IDE installed in your machine.

Prerequisite 

  1. Download Maven LINK.
  2. Install maven .
  3. Add M2_HOME and MAVEN_HOME in the Windows environment, and point it to your Maven folder.
  4. Add Path
  5. Verify
  6. Install maven plugin in your eclipse.  
1. Download Maven

You can download maven from the below link.  
2. Install maven .

There is no installation file. You just need to download the archive file and extract in tour hard drive. Assuming you have extract the folder in C:\Program Files\Apache\maven

maven folder after unzip


3. Add M2_HOME and MAVEN_HOME

Add M2_HOME and MAVEN_HOME variable in windows environment.

M2_HOME should be C:\Program Files\Apache\maven
MAVEN_HOME should be C:\Program Files\Apache\maven


4.  Add Path
You need to Update PATH variable, append Maven bin folder – %M2_HOME%\bin, so that you can run the Maven’s command everywhere.

5. Verify

Run the below command to know that maven installed and configured in your system properly or not. If you see the version and maven home after executing the command it means maven configured properly. 

Maven command 

mvn –version in the command prompt/cmd

6. Install maven plugin in your eclipse. 

You need to download eclipse maven plugin from eclipse marketplace.
Maven plugin for eclipse

Or if you really don't want to do this above mentioned steps to configure maven in your system there is another simple way to solve this problem.You just need to download maven enabled eclipse from the eclipse website. Here is the link below for eclipse luna with eclipse integration .


Till now we have configured the maven environment.  Now we will create selenium project with maven 

Step 1:  Create maven project from eclipse IDE 

Go to File -> Project -> Maven -> Maven Project 

Next screen will ask for your project location where you want to create the project.  You can use Default Workspace location. 


Step 2:  Select Archetype 

 In the next screen, It will ask you to select an Archetype. Depending on the type of project that you are working, you need to choose the archetype


Step 3:  Enter a group id for the artifact

Now you need to enter a group id for the artifact, artifact id ,version and package,
We will input as shown in the below image. Version number will be by default 0.0.1-SNAPSHOT


Step 4: Finish step

After clicking finish button the maven project will be created with maven structure. It will create one sample POM also.

Sample POM look like this

Step 4: Edit POM file and add selenium dependency 

Copy the selenium dependency XML from maven central. or you can also get the XML from selenium org web site


  1. selenium website  -  LINK http://docs.seleniumhq.org/download/maven.jsp


    2. maven central   - LINK


Edit the POM XML file for the project and add the selenium dependency 



Step 6: Save the project using CTRL+S

Once you save the project it maven start building the project. Means maven start pulling all required dependency  from the maven central.

You can build the project using build maven command. you can set the goal as compile.


Step 7:  Navigate to src/test/java 

If you navigate to src/test/java folder , you will see there is class call AppTest . You can use this call for writing test case or you can create different class file per your requirement. 

I have created separate  class file called "TestCode" under src/test/java folder. I am using junit for writing test.  If you look into the POM file , you will see junit is already added in the dependency.  If you observe junit is not added in your POM file then you need to add the dependency for junit. 



Step 8:  Run the Junit test

Run the test in junit you will see chrome will open and navigate to facebook page . In my previous post I have mentioned how to open chrome in selenium. 


download maven selenium projectDownload sample maven selenium  Project