package net.thucydides.core.webdriver; import net.thucydides.core.steps.StepEventBus; import net.thucydides.core.util.MockEnvironmentVariables; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.openqa.selenium.By; import org.openqa.selenium.Capabilities; import org.openqa.selenium.OutputType; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.htmlunit.HtmlUnitDriver; import java.lang.reflect.InvocationTargetException; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.mockito.Matchers.any; import static org.mockito.Mockito.*; public class WhenUsingAWebDriverProxy { @Mock WebdriverInstanceFactory webdriverInstanceFactory; @Mock FirefoxDriver firefoxDriver; WebdriverManager webdriverManager; WebDriverFactory factory; WebDriverFacade webDriverFacade; class MockFirefoxWebDriverFacade extends WebDriverFacade { MockFirefoxWebDriverFacade() { super(FirefoxDriver.class, factory); } @Override public WebDriver getProxiedDriver() { return firefoxDriver; } } private void initWendriverManager() throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { when(webdriverInstanceFactory.newFirefoxDriver(any(Capabilities.class))).thenReturn(firefoxDriver); MockEnvironmentVariables environmentVariables = new MockEnvironmentVariables(); factory = new WebDriverFactory(webdriverInstanceFactory, environmentVariables); webdriverManager = new ThucydidesWebdriverManager(factory, new SystemPropertiesConfiguration(environmentVariables)); } MockFirefoxWebDriverFacade facade; @Before public void createATestableDriverFactory() throws Exception { MockitoAnnotations.initMocks(this); initWendriverManager(); StepEventBus.getEventBus().clear(); webDriverFacade = (WebDriverFacade) webdriverManager.getWebdriver(); WebdriverProxyFactory.getFactory().clearMockDriver(); webdriverManager.closeAllCurrentDrivers(); facade = new MockFirefoxWebDriverFacade(); } @After public void clearMocks() { WebdriverProxyFactory.getFactory().clearMockDriver(); webdriverManager.closeDriver(); } @Test public void the_webdriver_proxy_should_handle_get() { facade.get("http://www.google.com"); verify(firefoxDriver).get("http://www.google.com"); } @Test public void the_webdriver_proxy_should_ignore_get_when_webdriver_calls_are_disabled() { StepEventBus.getEventBus().temporarilySuspendWebdriverCalls(); facade.get("http://www.google.com"); verify(firefoxDriver,never()).get("http://www.google.com"); StepEventBus.getEventBus().reenableWebdriverCalls(); } @Test public void the_webdriver_proxy_should_quit_driver_when_reset() { webDriverFacade.get("http://www.google.com"); webDriverFacade.reset(); verify(firefoxDriver).quit(); } @Test public void the_webdriver_proxy_should_remove_proxied_driver_when_reset() { webDriverFacade.get("http://www.google.com"); webDriverFacade.reset(); TransparentWebDriverFacade facade = new TransparentWebDriverFacade(webDriverFacade); assertThat(facade.getProxied(), is(nullValue())); } @Test public void the_webdriver_proxy_should_handle_find_element() { facade.findElement(By.id("q")); verify(firefoxDriver).findElement(By.id("q")); } @Test public void the_webdriver_proxy_should_handle_find_elements() { facade.findElements(By.id("q")); verify(firefoxDriver).findElements(By.id("q")); } @Test public void the_webdriver_proxy_should_ignore_find_elements_when_webdriver_calls_are_disabled() { StepEventBus.getEventBus().temporarilySuspendWebdriverCalls(); facade.findElements(By.id("q")); verify(firefoxDriver, never()).findElements(By.id("q")); } @Test public void the_webdriver_proxy_should_handle_get_screenshot() { webDriverFacade.get("http://www.google.com"); webDriverFacade.getScreenshotAs(OutputType.FILE); verify(firefoxDriver).getScreenshotAs(OutputType.FILE); } @Test public void the_webdriver_proxy_should_handle_get_current_url() { facade.getCurrentUrl(); verify(firefoxDriver, atLeast(1)).getCurrentUrl(); } @Test public void the_webdriver_proxy_should_ignore_get_current_when_webdriver_calls_are_disabled() { StepEventBus.getEventBus().temporarilySuspendWebdriverCalls(); facade.getCurrentUrl(); verify(firefoxDriver, never()).getCurrentUrl(); } @Test public void the_webdriver_proxy_should_handle_get_page_source() { facade.getPageSource(); verify(firefoxDriver).getPageSource(); } @Test public void the_webdriver_proxy_should_ignore_get_page_source_when_webdriver_calls_are_disabled() { StepEventBus.getEventBus().temporarilySuspendWebdriverCalls(); facade.getPageSource(); verify(firefoxDriver, never()).getPageSource(); } @Test public void the_webdriver_proxy_should_handle_get_title() { facade.getTitle(); verify(firefoxDriver).getTitle(); } @Test public void the_webdriver_proxy_should_ignore_get_title_when_webdriver_calls_are_disabled() { StepEventBus.getEventBus().temporarilySuspendWebdriverCalls(); facade.getTitle(); verify(firefoxDriver, never()).getTitle(); } @Test public void the_webdriver_proxy_should_handle_get_window_handle() { facade.getWindowHandle(); verify(firefoxDriver).getWindowHandle(); } @Test public void the_webdriver_proxy_should_ignore_get_window_handle_when_webdriver_calls_are_disabled() { StepEventBus.getEventBus().temporarilySuspendWebdriverCalls(); facade.getWindowHandle(); verify(firefoxDriver, never()).getWindowHandle(); } @Test public void the_webdriver_proxy_should_handle_get_window_handles() { facade.getWindowHandles(); verify(firefoxDriver).getWindowHandles(); } @Test public void the_webdriver_proxy_should_ignore_get_window_handles_when_webdriver_calls_are_disabled() { StepEventBus.getEventBus().temporarilySuspendWebdriverCalls(); facade.getWindowHandles(); verify(firefoxDriver, never()).getWindowHandles(); } @Test public void the_webdriver_proxy_should_handle_navigate() { facade.navigate(); verify(firefoxDriver).navigate(); } @Test public void the_webdriver_proxy_should_ignore_navigate_when_webdriver_calls_are_disabled() { StepEventBus.getEventBus().temporarilySuspendWebdriverCalls(); facade.navigate(); verify(firefoxDriver, never()).navigate(); } @Test public void the_webdriver_proxy_should_handle_switchTo() { facade.switchTo(); verify(firefoxDriver).switchTo(); } @Test public void the_webdriver_proxy_should_ignore_switchTo_when_webdriver_calls_are_disabled() { StepEventBus.getEventBus().temporarilySuspendWebdriverCalls(); facade.switchTo(); verify(firefoxDriver, never()).switchTo(); } @Test public void the_webdriver_proxy_should_handle_quit_if_a_proxied_driver_exists() { webDriverFacade.get("http://www.google.com"); webDriverFacade.quit(); verify(firefoxDriver).quit(); } @Test public void the_webdriver_proxy_should_handle_close_if_a_proxied_driver_exists() { webDriverFacade.get("http://www.google.com"); webDriverFacade.close(); verify(firefoxDriver).close(); } @Test public void the_webdriver_proxy_should_handle_manage() { facade.manage(); verify(firefoxDriver, atLeast(1)).manage(); } @Test public void the_webdriver_proxy_should_ignore_managed_when_webdriver_calls_are_disabled() { StepEventBus.getEventBus().temporarilySuspendWebdriverCalls(); facade.manage(); verify(firefoxDriver, never()).manage(); } @Test public void the_webdriver_proxy_should_not_call_quit_if_a_proxied_driver_doesnt_exist() { facade.quit(); verify(firefoxDriver, never()).quit(); } @Test public void the_webdriver_proxy_should_not_call_close_if_a_proxied_driver_doesnt_exist() { facade.close(); verify(firefoxDriver, never()).close(); } @Test public void the_webdriver_proxy_should_not_instanciate_the_webdriver_instance_until_a_method_is_invoked() { webDriverFacade.get("http://www.google.com"); webDriverFacade.findElement(By.id("q")); webDriverFacade.getScreenshotAs(OutputType.FILE); verify(firefoxDriver).get("http://www.google.com"); verify(firefoxDriver).findElement(By.id("q")); verify(firefoxDriver).getScreenshotAs(OutputType.FILE); } @Mock ThucydidesWebDriverEventListener eventListener; @Test public void when_a_listener_is_registered_the_webdriver_proxy_should_notify_the_listener_when_the_browser_is_opened() { WebdriverProxyFactory.getFactory().registerListener(eventListener); webDriverFacade.get("http://www.google.com"); verify(eventListener).driverCreatedIn(any(WebDriver.class)); } @Test public void the_webdriver_proxy_looks_and_feels_like_a_webdriver() { WebDriver driver = WebdriverProxyFactory.getFactory().proxyFor(HtmlUnitDriver.class); assertThat(driver, is(notNullValue())); assertThat(WebDriver.class.isAssignableFrom(driver.getClass()), is(true)); } @Test public void the_proxied_webdriver_should_be_accessible_if_required() { WebDriver driver = WebdriverProxyFactory.getFactory().proxyFor(HtmlUnitDriver.class); HtmlUnitDriver proxiedDriver = (HtmlUnitDriver) ((WebDriverFacade) driver).getProxiedDriver(); assertThat(proxiedDriver, is(notNullValue())); assertThat(HtmlUnitDriver.class.isAssignableFrom(proxiedDriver.getClass()), is(true)); } }