package com.algocrafts.chapter4;
import com.algocrafts.browsers.Browsers;
import com.algocrafts.conditions.Equals;
import com.algocrafts.converters.FirstMatch;
import com.algocrafts.converters.GetText;
import com.algocrafts.locators.ElementLocator;
import com.algocrafts.locators.ElementsLocator;
import com.algocrafts.selectors.ClassName;
import com.algocrafts.selectors.Name;
import com.algocrafts.selectors.TagName;
import com.algocrafts.selectors.Xpath;
import com.algocrafts.selenium.Browser;
import com.algocrafts.selenium.Element;
import com.algocrafts.selenium.Locator;
import com.algocrafts.selenium.SearchScope;
import com.google.common.base.Function;
import org.junit.Ignore;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Stream;
@Ignore
public class GoogleAutoCompleteTest {
private static final Logger log = LoggerFactory.getLogger(GoogleAutoCompleteTest.class);
//This is an ugly test not using page framework, it has the same function as the test below. :(
@Test
public void autoCompeleteUsingSelenium() throws InterruptedException {
WebDriver driver = new FirefoxDriver();
driver.get("http://google.com");
WebElement q = driver.findElement(By.name("q"));
WebElement suggestion = null;
for (char c : "ticketfly".toCharArray()) {
q.sendKeys(String.valueOf(c));
try {
suggestion = driver.findElement(
By.xpath("//div[contains(@class, " +
"'sbdd_b')]/descendant::div[text()='ticketfly']"));
suggestion.click();
} catch (NoSuchElementException e) {
log.debug("This is OK", e);
}
}
if (suggestion == null) {
suggestion = new WebDriverWait(driver, 1).until(new Function<WebDriver, WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
return driver.findElement(
By.xpath("//div[contains(@class, " +
"'sbdd_b')]/descendant::div[text()='ticketfly']"));
}
});
suggestion.click();
}
}
@Test
public void autoCompeleteUsingSeleniumFiltering() throws InterruptedException {
Browser driver = Browsers.CHROME;
driver.get("http://google.com");
WebElement q = driver.findElement(By.name("q"));
for (char c : "ticketfly".toCharArray()) {
q.sendKeys(String.valueOf(c));
Optional<Element> first = driver.untilFound(() -> By.className("sbdd_b"))
.untilFound(() -> By.tagName("ul"))
.findElements(() -> By.tagName("li"))
.filter((WebElement e) -> e.getText().equals("ticketfly")).findFirst();
if (first.isPresent()) {
first.get().click();
break;
}
}
}
@Test
public void autoCompeleteUsingAutocompleteMethod() throws InterruptedException {
Browser driver = Browsers.CHROME;
driver.get("http://google.com");
Element q = driver.untilFound(() -> By.name("q"));
autocomplete(q, "ticketfly", driver,
(Browser element) -> element.untilFound(ClassName.SBDD_B)
.untilFound(TagName.UL)
.findElements(TagName.LI)
.filter((WebElement e) -> e.getText().equals("ticketfly")).findFirst()
);
}
@Test
public void autoCompeleteUsingAutocompleteMethodWithFunctionalProgramming() throws InterruptedException {
Browser<ChromeDriver> driver = Browsers.CHROME;
driver.get("http://google.com");
Element q = driver.untilFound(() -> By.name("q"));
Locator<Browser<ChromeDriver>, Optional<Element>> locator = new ElementLocator<Browser<ChromeDriver>>(ClassName.SBDD_B)
.andThen(new ElementsLocator<>(TagName.LI))
.andThen(new FirstMatch<>((e) -> e.getText().equals("ticketfly")));
autocomplete(q, "ticketfly", driver, locator);
}
@Test
public void autoCompeleteUsingAutocompleteMethodWithFunctionalProgrammingIllustration() throws InterruptedException {
Browser<ChromeDriver> driver = Browsers.CHROME;
driver.get("http://google.com");
Element q = driver.untilFound(() -> By.name("q"));
Locator<Browser<ChromeDriver>, Element> browserElementLocator = new ElementLocator<>(ClassName.SBDD_B);
Locator<Element, Stream<Element>> after = new ElementsLocator<>(TagName.LI);
Predicate<Element> elementPredicate = GetText.TEXT.and(new Equals("ticketfly"));
Locator<Stream<Element>, Optional<Element>> ticketfly = new FirstMatch<>(elementPredicate);
Locator<Browser<ChromeDriver>, Optional<Element>> locator = browserElementLocator.andThen(after).andThen(ticketfly);
autocomplete(q, "ticketfly", driver, locator);
}
//This is an ugly test not using page framework, it has the same function as the test below. :(
@Test
public void autoCompeleteUsingSelenium2() throws InterruptedException {
Browser<ChromeDriver> driver = Browsers.CHROME;
driver.get("http://google.com");
Element q = driver.untilFound(Name.Q);
Element suggestion = null;
for (char c : "ticketfly".toCharArray()) {
q.sendKeys(String.valueOf(c));
Optional<Element> optionalElement = driver.optionalElement(Xpath.GOOGLE_AUTOCOMPLETE);
if (optionalElement.isPresent()) {
suggestion = optionalElement.get();
suggestion.click();
}
}
if (suggestion == null) {
suggestion = driver.untilFound(Xpath.GOOGLE_AUTOCOMPLETE);
suggestion.click();
}
}
public <Where extends SearchScope<Where>> void autocomplete(Element element, Object value, Where where,
Locator<Where, Optional<Element>> locator) {
Optional<Element> suggestion;
for (char c : value.toString().toCharArray()) {
element.sendKeys(String.valueOf(c));
suggestion = locator.locate(where);
if (suggestion.isPresent()) {
suggestion.get().click();
return;
}
}
suggestion = locator.locate(where);
if (suggestion.isPresent()) {
suggestion.get().click();
}
}
}