We improved the original code in part 2.
The code looks better.
There are just a few problems left:
all methods are in the same class
the methods are related to interaction with different site pages
the class name is too vague
We will fix all these as follows:
create a HomePage class and move to it all constants, variables, locators and methods that interact with home page; pass the driver as a parameter in the HomePage class constructor
create a ResultsPage class and move to it all constants, variables, locators and methods that interact with results page; pass the driver as a parameter in the ResultsPage class constructor
create a DetailsPage class and move to it all constants, variables, locators and methods that interact with home page; pass the driver as a parameter in the DetailsPage class constructor
Basically, what we do is to break down the Task class in smaller page classes, each dedicated to one page of the site.
Page Object Model, in summary.
public class HomePage {
private WebDriver driver;
private static final URL = String url = "https://www.amazon.in/";
private By searchBoxId = By.id("twotabsearchtextbox");
private By searchButtonId = By.id("nav-search-submit-button");
public HomePage(WebDriver driver) {
this.driver = driver;
}
public void open() {
driver.get(URL);
}
public boolean isDisplayed() {
return driver.getCurrentUrl().contains(URL);
}
public void search(String productName) {
WebDriverWait wait = wait(10);
wait.until(ExpectedConditions.elementToBeClickable(searchBoxId);
WebElement searchBox = driver.findElement(searchBoxId);
searchBox.click();
searchBox.clear();
searchBox.sendKeys(productName);
wait.until(ExpectedConditions.elementToBeClickable(searchButtonId);
WebElement searchBtn = driver.findElement(searchButtonId);
searchBtn.click();
}
private WebDriverWait wait(int seconds) {
return WebDriverWait product = new WebDriverWait(driver,
Duration.ofSeconds(seconds));
}
}
public class ResultsPage {
private WebDriver driver;
private By resultBy = By.xpath("//a[@class='a-link-normal']//span");
public ResultsPage(WebDriver driver) {
this.driver = driver;
}
public boolean isDisplayed() {
wait(10).until(ExpectedConditions.visibilityOfElementLocated(resultBy);
return true;
}
public String getPageId() {
return driver.getWindowHandle();
}
public void selectProduct(String productName) {
wait(30).until(
ExpectedConditions.numberOfElementsToBeMoreThan(resultBy, 0));
List<WebElement> results = driver.findElements(resultBy);
WebElement result = results.stream()
.filter(e -> e.getText()
.contains(productName))
.findFirst()
.get();
scrollTo(result);
wait.until(ExpectedConditions.elementToBeClickable(result));
clickJS(result);
}
public void switchToNewWindow(String parentWindowId) {
Set<String> windowHandles = driver.getWindowHandles();
windowHandles.stream()
.filter(e -> !e.equals(parentWindowId))
.findFirst()
.get();
driver.switchTo().window(windowHandle);
}
private void scrollTo(WebElement element) {
((JavascriptExecutor) driver).executeScript(
"arguments[0].scrollIntoView(true);", element);
}
private void clickJS(WebElement element) {
((JavascriptExecutor) driver).executeScript(
"arguments[0].click();", element);
}
private WebDriverWait wait(int seconds) {
return WebDriverWait product = new WebDriverWait(driver,
Duration.ofSeconds(seconds));
}
}
public class DetailsPage {
private WebDriver driver;
private By productTitleBy = By.xpath("//span[@id='productTitle']");
private By secondProductBy = By.xpath("(//div[@class='a-cardui'])[2]"));
private By addToCartBy = By.xpath(
"(//input[@name='submit.addToCart'])[1]");
private By addToCartButtonBy = By.xpath(
"//input[@id='add-to-cart-button']"));
private By addedToCartBy = By.xpath("//h1[@class='a-size-medium-plus']");
public DetailsPage(WebDriver driver) {
this.driver = driver;
}
public boolean isDisplayed() {
wait(30).until(ExpectedConditions.titleContains(keyword));
return true;
}
public String getProductTitle() {
wait(10).until(
ExpectedConditions.visibilityOfElementLocated(secondProductBy);
WebElement productTitle = driver.findElement(productTitleBy);
return productTitle.getText().trim();
}
public void addProductToCart() {
wait(10).until(
ExpectedConditions.visibilityOfElementLocated(secondProductBy);
WebElement addToCart = driver.findElement(addToCartBy);
addToCart.click();
}
public void selectAddToCart() {
wait(10).until(
ExpectedConditions.elementToBeClickable(addToCartButtonBy);
WebElement addtoCartButton = driver.findElement(addToCartButtonBy);
addtoCartButton.click();
}
public String addToCartStatus() {
wait(10).until(
ExpectedConditions.visibilityOfAllElementsLocatedBy(addedToCartBy);
WebElement addedToCartLabel = driver.findElement(addedToCartBy);
return addToCartLabel.getText();
}
private WebDriverWait wait(int seconds) {
return WebDriverWait product = new WebDriverWait(driver,
Duration.ofSeconds(seconds));
}
}
Thanks for reading.