Sunday 31 January 2016

How to Start Appium Server using Java Code?



 We have seen how to start and stop Appium server manually and now in this post we will come to know how to start and stop Appium server programmatically. Appium provide APIs so that you can start the server before running your test case or test suit and then you can stop the server once the execution is over.

Once you install appium you the files node.exe and appium.js will be there is your system. You need the path of these two files for starting apium server programmatically. Then you can copy and paste the below code. Call appiumStart() in @BeforeClass or @BeforeTest .

Required Jar files are commons-validator-1.4.1.jar and java-client-3.2.0.jar which you can download from here.

Video -



Explanation about the code -

AppiumDriverLocalService class provied the api to start and stop the server hence we have used this in our code below.usingPort() method is used to provide port number for starting the server. We ned to pass our node.exe path to method usingDriverLocation() and appium.js path to withAppiumJs() method. Then start() and stop() methods are used to start and stop the server. We need to use getUrl() method to get and pass the url while setting up the Desired Capabilities.




import java.io.File;

import io.appium.java_client.service.local.AppiumDriverLocalService;
import io.appium.java_client.service.local.AppiumServiceBuilder;

public class AppiumServerStartStop {

    static String Appium_Node_Path="C:\\Program Files (x86)\\Appium\\node.exe";
    static String Appium_JS_Path="C:\\Program Files (x86)\\Appium\\node_modules\\appium\\bin\\appium.js";
    static AppiumDriverLocalService service;
    static String service_url;

    public static void appiumStart() throws Exception{
        service = AppiumDriverLocalService.buildService(new AppiumServiceBuilder().
                usingPort(2856).usingDriverExecutable(new File(Appium_Node_Path)).
                withAppiumJS(new File(Appium_JS_Path)));
        service.start();
        Thread.sleep(25000);
        service_url = service.getUrl().toString();
    }

    public static void appiumStop() throws Exception{
        service.stop();

    }
}

Note use the service_url like shown below while setting up Desired Capabilities-

AppiumDriver driver= new AndroidDriver(new URL(service_url),cap);

If you find this Post useful do share with your friends and if you have some questions or suggestions do share them with me in the comments section below.Please follow QA Automated for latest updates.


 

Friday 29 January 2016

Testing List View with Espresso Data Adapter



Espresso Data Adapter is used for testing of  Adapter Views like ListView & GirdView. In short Adapter Views is view whose children are bounded by an Adapter. In this case we need to use onData() instead if onView() because onData() is the one who matches the Data bound to the view item.


Video Tutorial -


I am going to explain testing of ListView using Espresso in detail. Below is the screenshot of the App with 50 List items. Each row contains a TextView and a ToggleButton. At the top of there is Text "Clicked on row no." which will show the row number on which you just clicked. The ToggleButton if checked displays text "checked". This is all about the ListView which we are going to test now.

Espresso Data Adapter
Espresso Data Adapter
1.Testing Scrolling functionality of ListView - In this we need to test scrolling to particular position and scrolling to the end of ListView


@Testpublic void testScrollingAt()throws Exception
{
    // Scrolls till the position 20 

 onData(hasEntry(equalTo(ListViewSample.ROW_TEXT),is("List item: 20")))

    .check(matches(isCompletelyDisplayed()));
    //scrolls till the end     

onData(hasEntry(equalTo(ListViewSample.ROW_TEXT),is("List item: 49")))

    .check(matches(isCompletelyDisplayed()));
}

 
Testing List Items with Espresso Data Adapter
Testing List Items with Espresso
2. Testing clicking on particular List item and checking the List item is selected.


@Testpublic void testClickOnListItem()
{
    onData(hasEntry(equalTo(ListViewSample.ROW_TEXT),is("List item: 25")))
            .onChildView(withId(R.id.rowTextView)).perform(click());
    onView(withId(R.id.selection_row_value)).check(matches(withText("25")));
}

 
Testing List with Espresso Adapter
Testing List with Espresso Adapter
4. Testing Toggle button for particular row



@Testpublic void testToggleButton()throws Exception
{
    onData(hasEntry(equalTo(ListViewSample.ROW_TEXT),is("List item: 25")))
            .onChildView(withId(R.id.rowToggleButton)).perform(click());
    Thread.sleep(1000);
    onData(hasEntry(equalTo(ListViewSample.ROW_TEXT),is("List item: 25")))
            .onChildView(withId(R.id.rowToggleButton)).check(matches(isChecked()));
}
Testing List with Espresso Adapter
Testing List with Espresso Adapter

I hope this post helps you find your code coverage for your test suit :)
Please Share your feedback in comments section below and follow QA Automated to get latest post update.Happy Testing :-)

Download sample code from - https://github.com/googlesamples/android-testing

Thursday 28 January 2016

How to Test Toast Message using Espresso?



Now a days many apps uses Toast Messages and if you are testing android app which displays Toast Messages and you want to write Espresso test case to assert the Toast Message then this post will help you to achieve that. In last post I have shared how to add Custom Matcher? which will help you to understand this post clearly as I am going to add a custom Matcher to test Toast.

Video Tutorial - 
 

Check below is the ToastMatcher which identifies the Toast is not part of activity window-

public class ToastMatcher extends TypeSafeMatcher<Root> {

    @Override    public void describeTo(Description description) {
        description.appendText("is toast");
    }

    @Override    public boolean matchesSafely(Root root) {
        int type = root.getWindowLayoutParams().get().type;
        if ((type == WindowManager.LayoutParams.TYPE_TOAST)) {
            IBinder windowToken = root.getDecorView().getWindowToken();
            IBinder appToken = root.getDecorView().getApplicationWindowToken();
            if (windowToken == appToken) {
              return true;
            }
        }
        return false;
    }



This ToastMatcher you can use it in your test case like this -

1. Test if the Toast Message is Displayed

onView(withText(R.string.mssage)).inRoot(new ToastMatcher())
.check(matches(isDisplayed()));

2. Test if the Toast Message is not Displayed

onView(withText(R.string.mssage)).inRoot(new ToastMatcher())
.check(matches(not(isDisplayed())));

3. Test id the Toast contains specific Text Message
 

onView(withText(R.string.mssage)).inRoot(new ToastMatcher())
.check(matches(withText("Invalid Name"));

 

I hope this post helps you find your code coverage for your test suit :)
Please Share your feedback in comments section below and follow QA Automated to get latest post update.Happy Testing :-)

Friday 22 January 2016

How to Create Custom Matcher in Espresso?



Espresso allows us to create our own custom matcher and according to me it is really useful for automation. I use many custom matchers once I learn how to use it as it gives me flexibility in automating different functionality.

Video Tutorial -



Testing Scenario- > 
You want to test a Simple login screen and check if negative input or no input is given then it displays Error Message as shown in figure.
Espresso Custom Matcher Example
Espresso Custom Matcher Example


The effective way of testing this is using custome matcher. Let us see how to create a custom matcher
1. Create a class name ErrorMatcher inside androidTest folder with below code


public class ErrorMatcher {


        
 @NonNull

 public static Matcher<View> withError(final Matcher<String> stringMatcher) {

            return new BoundedMatcher<View, TextView>(TextView.class) {

                
 @Override

 public void describeTo(final Description description) {
                    description.appendText("error text: ");
                    stringMatcher.describeTo(description);
                }

                
 @Override

 public boolean matchesSafely(final TextView textView) {
                    return stringMatcher.matches(textView.getError().toString());
                }
            };
        }
    }

2. Matching logic is to match the subset of TextView with only error messages.
3.  describeTo method is for debug output.
4. Then you can use your custom matcher in the test case as shown below


@Test 

public void testLoginMandatory()
{
    onView(withId(R.id.email_sign_in_button)).perform(click());
    onView(ErrorMatcher.withError(Matchers.
            containsString("The field is required"))).check(matches(isDisplayed()));
}

I hope this post helps you find your code coverage for your test suit :)
Please Share your feedback in comments section below and follow QA Automated to get latest post update.Happy Testing :-)

Thursday 21 January 2016

How to use View Matchers, View Actions and View Assertions in Espresso?

View Matchers -

Video Tutorial -


Espresso has many ViewMatcher options which are very effective in uniquely locate UI element. You can also combine and create a combination of View Matchers to find element uniquely. In Espresso we can locate the lement very effectively even though with help of these View Matchers. 

In this post you will find all the ViewMatcher options provided by Espresso with example and short .If you spend a little bit time going through this post you will be able to create automated test cases faster.

The View Matcher is written like onView(ViewMatcher) which are commonly used. There are two types of actions that can be performed on View those are -
onView(ViewMatcher).perform(ViewAction)
onView(ViewMatcher).check(ViewAssertion)



// frequently used matchers
// using resurce id
onView(withId(R.id.anuja));
// using visible text
onView(withText("Done"));
// using content description
onView(withContentDescription("profile"));
//using Hint Text
onView(withHint("Sample_text"));
// using spinner text
onView(withSpinnerText("Spinner_text"));
//return TextView with links
onView(hasLinks());

//UI property matchers are mostly used in combination 

onView(allOf(withId(R.id.anuja),isDisplayed()));
onView(allOf(withId(R.id.anuja),isCompletelyDisplayed()));
onView(allOf(withId(R.id.anuja),isClickable()));
onView(allOf(withId(R.id.anuja),isChecked()));
onView(allOf(withId(R.id.anuja),isNotChecked()));
onView(allOf(withId(R.id.anuja),isEnabled()));
onView(allOf(withId(R.id.anuja),hasFocus()));
onView(allOf(withId(R.id.anuja),hasLinks()));
onView(allOf(withId(R.id.anuja),isSelected()));
onView(allOf(withId(R.id.anuja), hasContentDescription()));

//object matcher example 

onView(withClassName(endsWith("EditText")));
onView(withText(startsWith("Hello")));
onView(allOf(withId(R.id.anuja), isDisplayed()));
onView(anyOf(withText("sample")));

//onData is used in case of ListView, GridView and AdapterView 

onData(withText("List")).atPosition(2);

//Root Matchers 

//Matches with Text on dialog 

onView(withText(R.string.hello_world)).inRoot(isDialog()); 

//Matches with Root that takes windows focus 

onView(withText(R.string.hello_world)).inRoot(isFocusable()); 

//Matches with root whoch is autocomplete or action bar spinner 

onView(withText(R.string.hello_world)).inRoot(isPlatformPopup()); 

//Matches with root that can handle touch events 

onView(withText(R.string.hello_world)).inRoot(isTouchable()); 

//Matchers with decor view 

onView(withText(R.string.hello_world)).inRoot(withDecorView(isDisplayed()));

I have mentioned some frequently used combinations of ViewMatcher samples. Apart from this you can create Custom Matcher as per you requirement. I will post that example as well in future posts.


View Actions -

Video Tutorial -


There are various Actions you can perform on the selected element to automate and reduce your manual effort and time. Let us now see most frequently used View Actions in Espresso.


//To type a test inside TextBox 

onView(withText("Enter Name")).perform(typeText("John"));
//To replace the text already written in TextBox 

onView(withText("Enter Name")).perform(replaceText("Tom"));
//To type Text inside the focus view 

onView(withText("Enter Name")).perform(typeTextIntoFocusedView("Tom"));
//To clear the text from TextBox

 onView(withText("Enter Name")).perform(clearText());
//To click a button

 onView(withText("Done")).perform(click());
//To perform double click

 onView(withText("Done")).perform(doubleClick());
//To perform long press operation 

onView(withText("Done")).perform(longClick());
//To swipe up the view

 onView(withId(R.id.sample_view)).perform(swipeUp());
//To swipe down a view

 onView(withId(R.id.sample_view)).perform(swipeDown());
//To swipe left 

onView(withId(R.id.sample_view)).perform(swipeLeft());
//To swipe right

 onView(withId(R.id.sample_view)).perform(swipeRight());
// To scroll ListView 

onView(withId(R.id.list_view)).perform(scrollTo());
//press backpressBack();
//press IME buttons of softkeyboard like done,ok,enter,
//searchpressImeActionButton();
//To close soft keybaord 

closeSoftKeyboard();
//To open phone specific menu 

pressMenuKey();
//To press key with 

keycodepressKey(66);
//To open as Link in the browser

 onView(withText("www.googl.com")).perform(openLinkWithText("www.google.com"));


A test case can never be called complete without assertions and hence it is important to know View Assertions provided by Espresso to complete your test cases.


//check the element is displayed 

onView(withId(R.id.anuja)).check(matches(isDisplayed()));
//check the element displays perticular Text 

onView(withId(R.id.anuja)).check(matches(withText(R.string.hello_world)));
onView(withId(R.id.anuja)).check(matches(withText("Hello world")));
//check if the one element is displayed on right of the other element 

onView(withId(R.id.anuja)).check(isRightOf(withText("Hi")));
//check if the one element is displayed on left of the other element 

onView(withId(R.id.anuja)).check(isLeftOf(withText("Hello")));
//check if the one element is displayed on below of the other element

 onView(withText("how are you")).check(isBelow(withText("Hi")));
//check if the one element is displayed on below of the other element

 onView(withText("Hi")).check(isAbove(withText("How are you")));
//check element does not exists 

 onView(withText("I am fine")).check(doesNotExist());


P.S.-you all are welcome to ask any doubts or post your own samples.

I hope this post helps you find your code coverage for your test suit :)
Please Share your feedback in comments section below and follow QA Automated to get latest post update.Happy Testing :-)

Wednesday 20 January 2016

How to Add and Run Your First Espresso Test Case ?



Before adding any test case it is important that you follow a proper project structure. Click here to know where to add your Espresso instrumented test cases.

Video Tutorial -



By the end of this post you will be ready with your first Espresso test case. There are two ways to write test case suit in Espresso and this post will cover both of them for simple Hello World App.

First way is using Activity Instrumentation.Below is Simple test case which checks the UI Element with given ID is displayed after launching activity ->
1. The class uses two annotations @LargeTest and @Runwith these two annotations are used to specify the behavior for our TestClass.
2. The class extends AcitivtyInstrumentationTestCase2 class with launch activity as MainActivity which we want to test in this example.
3. @Before and @After is annotations and used to specify which method should be executed before each test case and which method should be executed after completion of each test case.
4. @Test annotation is added for each test case method.
5. In the below test case the getAcitivity() launches our Main Activity.
6. onView() is used to select a view for testing and withId() is used to locate the UI element and rest is used to check whether the particular element is displayed or not.



@RunWith(AndroidJUnit4.class)
@LargeTest
public class EspressoTest1 extends ActivityInstrumentationTestCase2<MainActivity>{

        public EspressoTest1() {
            super(MainActivity.class);
        }

        @Before 
         public void setUp() throws Exception {
            super.setUp();
            injectInstrumentation(InstrumentationRegistry.getInstrumentation());
        }

        @Test 
        public void test1ChatId() {
            getActivity();
            onView(withId(R.id.anuja)).check(matches(isDisplayed()));
        }

        @After        public void tearDown() throws Exception {
            super.tearDown();
        }
}


Second way is without using Activity Instrumentation ->
1. The class uses two annotations @LargeTest and @Runwith these two annotations are used to specify the behavior for our TestClass.
2.The below line of code is used to run the test case in particular order.
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
3. @Before and @After is annotations and used to specify which method should be executed before each test case and which method should be executed after completion of each test case.
4.onView() is used to select a view for testing and withId() is used to locate the UI element and rest is used to check whether the particular element is displayed or not.


@RunWith(AndroidJUnit4.class)
@LargeTest
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class EspressoTest2 { 

@Rule
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(
        MainActivity.class); 


 @Before 
 public void setUp() throws Exception {
        //Before Test case execution 
}

    @Test     
      public void test1ChatId() {
        onView(withId(R.id.anuja)).check(matches(isDisplayed()));
    }

    @After 
public void tearDown() throws Exception {
    //After Test case Execution
    }
}


How to run these test cases ->
1. Click on "Build Variants".
2. Select Android Instrumentation Tests.
First Espresso Test
First Espresso Test

3. Select class name or test case name -> right click -> Run
Write & Run Espresso Test
Running First Espresso Test


Note - 
add below code the defaultConfig before running the test case -

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"


I hope this post helps you find your code coverage for your test suit :)
Please Share your feedback in comments section below and follow QA Automated to get latest post update.Happy Testing :-)

Tuesday 19 January 2016

How and Where to add Test cases in Android Studio?

There are some specific rules for writing test folder in android studio related to project structure and hierarchy. In case of Espresso, Robotium and UIautomator we need to write instrumentation test cases which will be written in androidTest folder of the project. Let us see how to create that folder.

1. In android studio it is important to write instrumented functional test cases in src/androdTest/java folder and unit tests in src/Test/java.

2.Now we need to create androidTest folder. right click on the src -> New ->Folder ->Java folder


3. Click on Change Folder Location and add location src/androidTest/Java

4.  Right click on java -> New -> Package and the enter package name


5. Once the package is created then right click on the package name -> New -> Java Class give Class Name TestClass  and click on OK.


After creating the TestClass you are ready to start writing your test cases.

How to Setup Espresso for functional Testing?



You are reading this post because you want to go with Espresso Framework for your functional testing.The framework is very flexible and allows you to test different functionality with ease and accuracy.Let us get to the point and start configuring your project with espresso.
To configure Espresso within your Android Project is very simple and quick. By the end of this post you will be able to start writing your tests. In case you face any issues post it here.

Introduction to Espresso Video Tutorial -


Espresso Setup Step by Step Video Tutorial -


1.Espresso works in the same project where your app is build, so first step is to open your project.

2. Open file build.gradle inside- project -> App -> build.gradle and add below line of code at the end.


 

dependencies {
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    }
    androidTestCompile 'com.android.support.test:runner:0.5',{
        exclude group: 'com.android.support', module: 'support-annotations'
    }
}
android {
    defaultConfig {
        testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
    }
}

3. Then click on sync gradle, once the build is successful you are all set to write Espresso test cases. 

Note - 
add below code the defaultConfig before running the test case -

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
 
Note - Learn More About Android Studio HERE 
 
 
I hope this post helps you find your code coverage for your test suit :)
Please Share your feedback in comments section below and follow QA Automated to get latest post update.Happy Testing :-)
 

Setting up Appium with Android Studio



Appium is widely used automation tool for Mobile Applications and this post will help you to setup the Appium with Android Studio including writing and executing your first test case using Appium.If you are not familiar with android studio then also this post will definitely help you to to setup Appium. I hope this post helps you to setup your Appium Test Environment quickly. If you face any issues do post your questions. Let is get started with how to install Appium and configure in Android Studio.This is very easy step by step tutorial for appium setup in android studio.





  1. Download -
    1. Android Studio
    2. Appium Jar files for Java
    3. Latest Appium Client Library
    4. Appium Server 
    5. Install Java
  2. Install Android Studio please follow the steps given in the link to install android studio step by step on windows machine click here
  3. After installation of android studio ,open android studio and create a new project - How to create android project?
4. Add the downloaded Appium jars into your project - click on project -> click on app->copy all the jars in lib. Select the copied jars except Selenium, Java client and Junit Jar ,then right click on it and click on "Add as Library".

5. Click on build.gradle in app you will see all the libs added like below screenshot add junit:4.12.Sync the project or Re-build the project. It should show "Build Successful Message"

Build.gradle code for appium setup
Appium Gradle Dependency


6. Now you are ready to write your first test case - right click on the package and click on "Create Java Class". Copy given test case sample.

7. Running the Test case-

  • Click on build variant
  • Select Unit Testing
  • Start  the appium server with Specific port "4444"click here
  • Connect device with USB debugging on or start an emulator.
  • Right click on the test class and click on "Run"
 

import java.net.MalformedURLException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;



public class WaitTests {

 WebDriver driver;

 @Before
 public void setUp() throws MalformedURLException {
  // Created object of DesiredCapabilities class.
  DesiredCapabilities capabilities = new DesiredCapabilities();

  // Set android deviceName desired capability. Set your device name.
  capabilities.setCapability("deviceName", "XT1562");

  // Set BROWSER_NAME desired capability. It's Android in our case here.
  capabilities.setCapability(CapabilityType.BROWSER_NAME, "Android");

  // Set android VERSION desired capability. Set your mobile device's OS version.
  capabilities.setCapability(CapabilityType.VERSION, "6.0.1");

  // Set android platformName desired capability. It's Android in our case here.
  capabilities.setCapability("platformName", "Android");

  // Set android appPackage desired capability. It is
  // com.android.calculator2 for calculator application.
  // Set your application's appPackage if you are using any other app.
  capabilities.setCapability("appPackage", "com.android.calculator2");

  // Set android appActivity desired capability. It is
  // com.android.calculator2.Calculator for calculator application.
  // Set your application's appPackage if you are using any other app.
  capabilities.setCapability("appActivity", "com.android.calculator2.Calculator");

  // Created object of RemoteWebDriver will all set capabilities.
  // Set appium server address and port number in URL string.
  // It will launch calculator app in android device.
  driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
  driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
  
  
 }

 @Test
 public void testFirstCalculator() {
  
 
  // Click on DELETE/CLR button to clear result text box before running test.
  driver.findElements(By.xpath("//android.widget.Button")).get(0).click();

  // Click on number 2 button.
  driver.findElement(By.name("7")).click();

 driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS); 
}

@After
 public void End() {
  driver.quit();
 }
}

 
 
Once your Setup is Complete Learn more About Appium with this simple Step by Step
APPIUM TUTORIAL 
Note - Learn More About Android Studio Basic Features and Functionality HERE .
 
If you want to learn more about Testing with Emulators and Real Devices do refer this article -

Real Device vs Emulator Testing Ultimate Showdown

Please share your feedback in comments section below and join QA-Automated 
for latest post updates.Happy Testing !!!



Starting Appium Server in Windows

Hi all this is simple post which will help you to install Appium for windows and will guide you on how to start Appium Server. Now we will have a question in our mind that why we need Appium Server ? To understand this let us see How Appium Works
  1. Appium client (e.g.- Java) connects with Appium Server and communicate via JSON Wire Protocol
  2. Appium Server then creates a session for the client and also checks the desired capabilities of client and connects with respective vendor-provided frameworks like Selendroid/UIAutomator
  3. Vendor-provided APIs will then communicate with bootstrap.jar which is running in Emulator/Real device for performing client operations
  4. Bootstrap.jar act as a TCP server to perform action on our Application Under Test

 

How to Install Appium and Start the Server -

  1.  Download the Appium for Windows from here
  2. Double click on the .exe and install Appium. 
  3. Appium Sever Installation
    Appium Sever Installation
  4. Launch by clicking the icon.
    Appium Sever in Windows
    Appium Sever in Windows
  5. click on settings to change the port number.
    Appium Server Settings
    Appium Sever Settings
  6.  click on play button. 
    Appium Server
    Appium Sever

Now your appium server is up and running and you can plug in your device and start writing executing Appium Test Cases.

If you have any questions on this or have some feedback please comment it. If feel this is useful then do share it with your friends and colleagues.


Configure Appium Sever - 

Appium Sever will launch with default configuration parameters. We have option to customize server settings as per our requirement. In case you face any issue or exception while connecting to the server then you need to look into the server settings first to debug your issue.
Let us look into how to modify appium sever settings.


Android Settings :

  • Click on Android Settings button as shown in bellow image.
  • Select Platform Name = Android
  • Select Automation Name = Appium
  • Select PlatformVersion = Your android device's OS version. 
General Settings

  • Click on General Settings button as shown in bellow image.
  • Note down Server Address and Post number. We need it during appium software automation test script creation. Server Address is : 127.0.0.1 and Port number is : 4723.

Hi I hope this tutorial helped you to understand why we need appium server, how appium server works and How to start appium server? Please share your feedback in comments section below and join QA-Automated for latest post updates.Happy Testing !!!