package net.thucydides.core.pages.integration;
import net.thucydides.core.webdriver.javascript.JavascriptExecutorFacade;
import net.thucydides.core.webdriver.jquery.ByJQuery;
import net.thucydides.core.webdriver.jquery.ByJQuerySelector;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.remote.UnreachableBrowserException;
import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class WhenUsingTheFluentAPIWithJavascriptAndJQuery {
private static StaticSitePage page;
private static WebDriver driver;
@BeforeClass
public static void openDriver() {
driver = new PhantomJSDriver();
page = new StaticSitePage(driver, 1000);
page.open();
}
@AfterClass
public static void shutdownDriver() {
driver.quit();
}
@Test
public void should_inject_jquery_into_the_page() {
WebDriver driver = new PhantomJSDriver();
StaticSitePage page = new StaticSitePage(driver, 1000);
getPage().open();
getPage().evaluateJavascript("$('#firstname').focus();");
Boolean jqueryInjected = (Boolean) getPage().evaluateJavascript("return (typeof jQuery === 'function')");
assertThat(jqueryInjected, is(true));
driver.quit();
}
@Test
public void should_be_able_to_use_the_javascript_executor_with_parameters() {
getPage().evaluateJavascript("$('#firstname').focus();", "#firstname");
assertThat(getPage().element(getPage().firstName).hasFocus(), is(true));
}
@Test
public void should_be_able_to_set_focus_directly() {
JavascriptExecutorFacade js = new JavascriptExecutorFacade(getPage().getDriver());
js.executeScript("$('#firstname').focus();");
assertThat(getPage().element(getPage().firstName).hasFocus(), is(true));
}
@Test
public void should_support_jquery_queries_in_the_page() {
StaticSitePage page = getPage();
getPage().evaluateJavascript("$('#firstname').focus();");
assertThat(getPage().element(getPage().firstName).hasFocus(), is(true));
getPage().evaluateJavascript("$('#lastname').focus();");
assertThat(getPage().element(getPage().lastName).hasFocus(), is(true));
}
@Test
public void should_support_jquery_queries_that_return_values_in_the_page() {
Object result = getPage().evaluateJavascript("return $('#country').val();");
assertThat(result.toString(), is("Australia"));
}
@Test
public void should_be_able_to_find_an_element_using_a_jquery_expression() {
WebElement link = getPage().getDriver().findElement(ByJQuery.selector("a[title='Click Me']"));
assertThat(link.isDisplayed(), is(true));
}
@Test
public void should_be_able_to_find_multiple_elements_using_a_jquery_expression() {
List<WebElement> links = getPage().getDriver().findElements(ByJQuery.selector("h2"));
assertThat(links.size(), is(2));
}
@Test(expected = WebDriverException.class)
public void should_fail_gracefully_if_no_jquery_element_is_found() {
getPage().getDriver().findElement(ByJQuery.selector("a[title='Does Not Exist']"));
}
@Test(expected = WebDriverException.class)
public void should_fail_gracefully_if_jquery_selector_is_invalid() {
getPage().getDriver().findElement(ByJQuery.selector("a[title='Does Not Exist'"));
}
@Test
public void should_evaluate_javascript_within_browser() {
String result = (String) getPage().evaluateJavascript("return document.title");
assertThat(result, is("Thucydides Test Site"));
}
@Test
public void should_execute_javascript_within_browser() {
getPage().open();
assertThat(getPage().element(getPage().firstName).hasFocus(), is(false));
getPage().evaluateJavascript("document.getElementById('firstname').focus()");
assertThat(getPage().element(getPage().firstName).hasFocus(), is(true));
}
@Test
public void a_jquery_selector_should_be_described_by_the_corresponding_jquery_expression() {
ByJQuerySelector jQuerySelector = ByJQuery.selector("a[title='Click Me']");
assertThat(jQuerySelector.toString(), containsString("a[title='Click Me']"));
}
public StaticSitePage getPage() {
try {
page.getTitle();
} catch (UnreachableBrowserException e) {
driver = new PhantomJSDriver();
page = new StaticSitePage(driver, 1000);
}
return page;
}
}