I am developing test cases using Selenium and TestNG, and am following the Page Object Model design pattern.
Currently, my page classes look like this (Page1 is just a placeholder, they all have more meaningful names in actuality):
public class Page1 {
WebDriver driver;
...
public Page1(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
...
}
and my test classes look like this:
public class Test {
private WebDriver driver;
private Page1 page1;
private Page2 page2;
...
@BeforeMethod
public void setUp() {
driver = new ChromeDriver();
page1 = new Page1(driver);
page2 = new Page2(driver);
...
}
...
}
where the driver and each page object is declared directly inside the test class, and instantiated in @BeforeMethod.
As you can see, with a lot of page classes, the test class can quickly become cluttered simply by instantiating all of the page objects. I looked around and found that the Google Guice framework could potentially be used to simplify some of these dependencies. i.e. by just requiring
@Inject
private Page1 page1;
and not needing to call the constructor in the setup method.
However, even after reading some of the documentation online I am unsure of how to accomplish this. Does anyone have any knowledge of how to do something like this (or if it is even possible)? If not, is there an alternative way I can simplify and improve the readability of my test classes? Or is there even a point to doing what I'm trying to do?
-
I think this might help you - testautomationguru.com/…Joshi– Joshi2018年11月06日 02:54:36 +00:00Commented Nov 6, 2018 at 2:54
1 Answer 1
Firstly, you can remove any reference to the driver in the tests by creating a BasePage class:
class BasePage {
protected static WebDriver driver = null;
BasePage() {
if (driver == null) driver = new ChromeDriver();
}
class Page1 extends BasePage {
Page1() { super(); }
}
Secondly, @Before/@After should not carry test logic, but to prepare external components for the tests. When one read the test, it should be clear what is going on.
test() {
HomePage home = new LandingPage().login("name", "password");
home.clickOn....
}
Therefore, you do not need to instantiate pages in the @BeforeMethod, but on the specific tests that use these pages. If you feel the need to abstract the construction of the pages, the Factory Pattern may help.
Explore related questions
See similar questions with these tags.