As I mentioned in my previous post that we will create few more tests which will make use of the nested navigation class and common menu selector class to see how we can make use of these.
So, let create one more test to check some other navigation e.g. navigating to "Add New" page and to implement this we will make use of the same navigation class and menu selector class.
Before we start writing code for this test let's go through some of the refactoring that is needed MenuSelector class's select methods created in previous post.
MenuSelector class created in previous past:

We will be refactoring below areas in this class:
#1: Used WebDriverWait
#2: Removed browser.Wait(1)
#3: Used CssSelector locator to find subMenu instead of using LinkText locator
#1: Used WebDriverWait
As you can see that we have used below line of code to e.g. find topLevelMenu item
var topLevelM = browser.Driver.FindElement(By.Id(topLevelMenu));
Now, this might fail sometimes if e.g. this element is not visible yet during execution of this statement as it takes some time to load this.
So, it is always a good practice to make use of wait while doing these kind of stuffs as it might be possible that when this line is executed the required web element is not visible yet as it is still loading otherwise it throws an exception.

I will be covering different kind of waits that we can use during my later posts. So, we won't be focusing more on working of wait here.
So, let's just focus on this particular code for now.
Here we first made the driver to wait for at max 15 seconds to check the visibility of element. If it finds the element within this time span it will move to next sentence otherwise keep on checking for 15 seconds before saying that the element is not found.
This way we are making sure that application won't throw exception if it does not find the web element immediately and hence our framework becomes more robust.
#2: Removed browser.Wait(1)
As we are now using WebDriverWait so we don't have to use this. Further, it is always not recommended to use thread.sleep method. See below the complete Select() method:

#3: Used CssSelector locator to find subMenu instead of using LinkText locator
Finally, this is one more refactoring need in this class. This is needed as using LinkText locator will fail when we try to implement our next test due to the fact that there are more than one web elements with LinkText as "Add New" so, our web driver cannot find the required web element and our test will fail.
To overcome this I have used CssSelector locator so that instead of passing link text information as parameter during MenuSelector.Select() method call we will pass it's css value.
Now, as we have done the required refactoring, let move to to implement our test.
LeftNavigation.Posts.AddNew.Select(browser);
As you can see here that after LeftNavigation.Posts there is new nested class created i.e. AddNew for new navigation. And under this class a Select() method is created like we created in previous post with only difference that of css value for subMenu item. As in this case too topLevelMenu is same so only difference will be in subMenu hence the css value is different.

This will further call the common select method of MenuSelector.
As last step we need to confirm whether we are actually on add new post page or not. So, this is done using below sentence:
Assert.IsTrue(addNewPostPage.IsCurrentPage(),"Not the expected page");
Similar to our previous post where we checked whether we are on "All Posts" page or not, here I have created a new class i.e. "AddNewPostPage" with "IsCurrentPage()" method inside.
"IsCurrentPage()"is the method which does the confirmation whether this page is currently opened or not.
With this we are also making things consistent i.e. whenever we need to check whether current page is opened or not we will create a method named "IsCurrentPage()" which will make our framework easy to understand and use.
This is it.
In this post we did few refactoring which was needed in our framework and then created one more test to support our thought of making things common as mentioned in previous post.
Thanks for reading this post. See you in next post. Cya.
So, let create one more test to check some other navigation e.g. navigating to "Add New" page and to implement this we will make use of the same navigation class and menu selector class.
About test:
In this test we will write code to implement below steps:- Navigate to login page
- Login to application
- Navigate to Posts->Add New post page
- Confirm that we are on right page
Before we start writing code for this test let's go through some of the refactoring that is needed MenuSelector class's select methods created in previous post.
MenuSelector class created in previous past:
We will be refactoring below areas in this class:
#1: Used WebDriverWait
#2: Removed browser.Wait(1)
#3: Used CssSelector locator to find subMenu instead of using LinkText locator
#1: Used WebDriverWait
As you can see that we have used below line of code to e.g. find topLevelMenu item
var topLevelM = browser.Driver.FindElement(By.Id(topLevelMenu));
Now, this might fail sometimes if e.g. this element is not visible yet during execution of this statement as it takes some time to load this.
So, it is always a good practice to make use of wait while doing these kind of stuffs as it might be possible that when this line is executed the required web element is not visible yet as it is still loading otherwise it throws an exception.
I will be covering different kind of waits that we can use during my later posts. So, we won't be focusing more on working of wait here.
So, let's just focus on this particular code for now.
Here we first made the driver to wait for at max 15 seconds to check the visibility of element. If it finds the element within this time span it will move to next sentence otherwise keep on checking for 15 seconds before saying that the element is not found.
This way we are making sure that application won't throw exception if it does not find the web element immediately and hence our framework becomes more robust.
#2: Removed browser.Wait(1)
As we are now using WebDriverWait so we don't have to use this. Further, it is always not recommended to use thread.sleep method. See below the complete Select() method:
#3: Used CssSelector locator to find subMenu instead of using LinkText locator
Finally, this is one more refactoring need in this class. This is needed as using LinkText locator will fail when we try to implement our next test due to the fact that there are more than one web elements with LinkText as "Add New" so, our web driver cannot find the required web element and our test will fail.
To overcome this I have used CssSelector locator so that instead of passing link text information as parameter during MenuSelector.Select() method call we will pass it's css value.
Now, as we have done the required refactoring, let move to to implement our test.
Test execution:
After login to application using login method at step 2, next sentence starts executing i.e.LeftNavigation.Posts.AddNew.Select(browser);
As you can see here that after LeftNavigation.Posts there is new nested class created i.e. AddNew for new navigation. And under this class a Select() method is created like we created in previous post with only difference that of css value for subMenu item. As in this case too topLevelMenu is same so only difference will be in subMenu hence the css value is different.
This will further call the common select method of MenuSelector.
As last step we need to confirm whether we are actually on add new post page or not. So, this is done using below sentence:
Assert.IsTrue(addNewPostPage.IsCurrentPage(),"Not the expected page");
Similar to our previous post where we checked whether we are on "All Posts" page or not, here I have created a new class i.e. "AddNewPostPage" with "IsCurrentPage()" method inside.
"IsCurrentPage()"is the method which does the confirmation whether this page is currently opened or not.
With this we are also making things consistent i.e. whenever we need to check whether current page is opened or not we will create a method named "IsCurrentPage()" which will make our framework easy to understand and use.
This is it.
In this post we did few refactoring which was needed in our framework and then created one more test to support our thought of making things common as mentioned in previous post.
Thanks for reading this post. See you in next post. Cya.
Great information, thanks for providing an easy explanation.
ReplyDeleteIt is very much helpful.
Best Selenium training in Chennai | Best Selenium training in Chennai