How to run a Selenium Project from command line using JAR files 
Tags: automation, testng, jar, cmd
Published: 2021-05-24 21:18:22

###What is JAR ?

**JAR(Java ARchive)** files are archive files that include a Java-specific manifest file. They are built on the ZIP format and typically have a **.jar** file extension.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zi0s9iygbj85ltlz98e0.gif)

In simple words *JAR* file is a compressed format of a *compiled* Java project. This file contains with **.class** files, meta data and some other resources. Also these files are a way to distribute our source code and can be used by external programs.

In here we are focusing on how to run a **.jar** file from command line without using any IDE.

First step should be we are going to need a java project to create a **.jar** file and I’ll use one of my previous program which I used to run with selenium and TestNG.

You can refer to my article on [*“Use of .properties file in selenium project with TestNG”*](https://manulwick.medium.com/use-of-properties-file-in-selenium-with-testng-8551dceeba96) and I’ll take the same code and continue it further.

For your reference find my GitHub project [here](https://github.com/mwickramanayaka/Daraz-Add-to-card-test-Selenium.git)

**PropertiesFile Class:**
```javascript
package test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.reporter.ExtentSparkReporter;
public class PropertiesFile {
//Create a object for class properties 
 static Properties prop = new Properties();
 //defining the project path
 static String projectPath = System.getProperty("user.dir");
//setting expected title from the ebay.com/Daraz.lk
 static String expectedTitleebay ="Electronics, Cars, Fashion, Collectibles & More | eBay";
 static String expectedTitledaraz ="Online Shopping Sri Lanka: Clothes, Electronics & Phones | Daraz.lk";
//create the htmlReporter object
static ExtentSparkReporter htmlReporter;
 static ExtentReports extent;
 static ExtentTest test1;
public static String browserName = null;
public static void main(String[] args) throws InterruptedException {
PropertiesFileTestNG.setup();
  PropertiesFileTestNG.test1();
  PropertiesFileTestNG.tearDown();
 }
public static void getProperties() {
try {
//create a object for class InputStream
   InputStream input = new FileInputStream(projectPath + "/src/test/java/test/config.properties");
   //Load properties file
   prop.load(input);
   //get values from properties file
   String browser = prop.getProperty("browser");
   System.out.println(browser);
   //Setting browsername in the PropertiesFileTestNG class
   PropertiesFileTestNG.browserName = browser;
} catch (Exception exp) {
System.out.println(exp.getMessage());
   System.out.println(exp.getCause());
   exp.printStackTrace();
}
}
public static void setProperties() {
try {
//create a object for class OuputStream
   OutputStream output = new FileOutputStream(projectPath + "/src/test/java/test/config.properties");
   //Load properties file and set firefox
   prop.setProperty("result", "test passed");
   //store values i properties file
   prop.store(output, "setting firefox");
} catch (Exception exp) {
System.out.println(exp.getMessage());
   System.out.println(exp.getCause());
   exp.printStackTrace();
  }
}
}
``` 

**PropertiesFileTestNG Class:**

```javascript
package test;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.Status;
import com.aventstack.extentreports.reporter.ExtentSparkReporter;
import io.github.bonigarcia.wdm.WebDriverManager;
public class PropertiesFileTestNG {
//creating driver object
 private static WebDriver driver = null;
//setting expected title from the ebay.com/Daraz.lk
 static String expectedTitleebay ="Electronics, Cars, Fashion, Collectibles & More | eBay";
 static String expectedTitledaraz ="Online Shopping Sri Lanka: Clothes, Electronics & Phones | Daraz.lk";
//create the htmlReporter object
static ExtentSparkReporter htmlReporter;
 static ExtentReports extent;
 static ExtentTest test1;
 
 public static String browserName = null;
 
 @BeforeSuite
 public static void setup() {
  
  PropertiesFile.getProperties();
if(browserName.equalsIgnoreCase("chrome")) {
   //initializing and starting the chrome browser
   WebDriverManager.chromedriver().setup();
   driver = new ChromeDriver();
    
  }else if(browserName.equalsIgnoreCase("firefox")) {
   //initializing and starting the firefox browser
   WebDriverManager.firefoxdriver().setup();
   driver = new FirefoxDriver();
   
  }
htmlReporter = new ExtentSparkReporter("extentReport.html");
  //create ExtentReports and attach reporter(s)
  extent = new ExtentReports();
  extent.attachReporter(htmlReporter);
 
 }
@Test  
 public static void test1() throws InterruptedException {
   
  //creates a toggle for the given test, add all log events under it
  test1 = extent.createTest("ebay Search Test", "test to validate search box ");
test1.log(Status.INFO, "Starting test case");
  
  if (browserName.equals("firefox")) {
   System.out.println("Starting test on Firefox");
   test1.pass("Starting test on Firefox");
  }else if(browserName.equals("chrome")) {
   System.out.println("Starting test on chrome");
   test1.pass("Starting test on chrome");
  }
  
  //maximize the window 
  driver.manage().window().maximize();
  test1.pass("maximize has done");
//Navigate to Ebay.com
  driver.get("https://www.ebay.com");
  Thread.sleep(1000);
  test1.pass("Navigate to Ebay.com");
//compare whether the title id matching
  String actualTitle = driver.getTitle();
  Assert.assertEquals(actualTitle, expectedTitleebay);
  test1.pass("title is correct");
//enter in the TextBox
  driver.findElement(By.xpath("//*[@id=\"gh-ac\"]")).sendKeys("Mobile");
  test1.pass("Entered text in the text box");
  Thread.sleep(1000);
  //hit enter
  driver.findElement(By.xpath("//*[@id=\"gh-btn\"]")).sendKeys(Keys.RETURN); 
  test1.pass("Press keybopard enter key");
  Thread.sleep(1000);
 
 }
 
 @AfterSuite
 public static void tearDown() {
driver.quit();
  test1.pass("closed the browser");
test1.info("test completed"); 
  
  //write results into the file
  extent.flush();
PropertiesFile.setProperties();
 }
}
``` 

**config.properties:**

```javascript
browser=chrome
``` 
Since we were calling **main()** from the *PropertiesFileTestNG* class we won’t be able to run the actual test in **main()** method class. For that I have pasted this code in the class level in *PropertiesFile Class.*

```javascript
//setting expected title from the ebay.com/Daraz.lk
 static String expectedTitleebay ="Electronics, Cars, Fashion, Collectibles & More | eBay";
 static String expectedTitledaraz ="Online Shopping Sri Lanka: Clothes, Electronics & Phones | Daraz.lk";
//create the htmlReporter object
static ExtentSparkReporter htmlReporter;
 static ExtentReports extent;
 static ExtentTest test1;
public static String browserName = null;
``` 

Copy all the above codes to your project and run it.

This will go to the site *www.ebay.com* and then it will validate site by comparing Title. After will enter *"mobile"* in the search box and hit enter.

I have used **@Test** annotation to execute the test case which is *test1* and used *extent Reports* as the reporting library.

After a successful test it will call the *PropertiesFile* and write the status of our test to the *.properties* file.

So in above code we had to change the browser name as "chrome" or "firefox" by opening the project. So the same thing can be done with CMD without using Eclipse.

So First lets create a **.jar** file by right clicking on the project and going to **export** option.

You will see this window and click **Runnable JAR file.**

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h4iej13c23jg2ix4cpg3.PNG)

Under Launch Configuration select the class which you included the *main()* method. In our case it is *PropertiesFile.class*

Give a name to the JAR file (in my case I named it as *selenium.jar* ) and define the export Destination and Finish.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d89ykw3o0vylpchgw2t1.PNG)

Go to the physical location that you have saved the JAR file and you will see it created there as **selenium.jar**

Now we have created our JAR file and lets run it from the command line.

Open the cmd and navigate to the *selenium.jar* file location.

Enter this command to execute the *selenium.jar* file and hit Enter.
```javascript
java -jar selenium.jar
```

You will see the progress in the cmd and passing all tests.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bypnn9yx48fmmnk2fwnn.PNG)

You will see the *SOP()* outputs we print in the console and its passing. Also we can go to extent reports and see the test results.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7scymtk5hvznj1a0p870.png)

In this article we created a JAR file and ran a selenium TestNG framework using command line without using any IDE.

####𝑻𝑯𝑰𝑵𝑲 𝑸𝑼𝑨𝑳𝑰𝑻𝒀!