blob: 8795771440f9ea0d7e57c424569ca5414356cf80 [file] [log] [blame]
/*
Copyright 2012 Selenium committers
Copyright 2012 Software Freedom Conservancy
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package org.openqa.selenium.chrome;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.remote.DriverCommand;
import org.openqa.selenium.remote.FileDetector;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.service.DriverCommandExecutor;
/**
* A {@link WebDriver} implementation that controls a Chrome browser running on the local machine.
* This class is provided as a convenience for easily testing the Chrome browser. The control server
* which each instance communicates with will live and die with the instance.
*
* <p/>
* To avoid unnecessarily restarting the ChromeDriver server with each instance, use a
* {@link RemoteWebDriver} coupled with the desired {@link ChromeDriverService}, which is managed
* separately. For example: <code><pre>
*
* import static org.junit.Assert.assertEquals;
*
* import org.junit.After;
* import org.junit.AfterClass;
* import org.junit.Before;
* import org.junit.BeforeClass;
* import org.junit.runner.RunWith;
* import org.junit.runners.BlockJUnit4ClassRunner
* import org.openqa.selenium.chrome.ChromeDriverService;
* import org.openqa.selenium.remote.DesiredCapabilities;
* import org.openqa.selenium.remote.RemoteWebDriver;
*
* {@literal @RunWith(BlockJUnit4ClassRunner.class)}
* public class ChromeTest extends TestCase {
*
* private static ChromeDriverService service;
* private WebDriver driver;
*
* {@literal @BeforeClass}
* public static void createAndStartService() {
* service = new ChromeDriverService.Builder()
* .usingChromeDriverExecutable(new File("path/to/my/chromedriver.exe"))
* .usingAnyFreePort()
* .build();
* service.start();
* }
*
* {@literal @AfterClass}
* public static void createAndStopService() {
* service.stop();
* }
*
* {@literal @Before}
* public void createDriver() {
* driver = new RemoteWebDriver(service.getUrl(),
* DesiredCapabilities.chrome());
* }
*
* {@literal @After}
* public void quitDriver() {
* driver.quit();
* }
*
* {@literal @Test}
* public void testGoogleSearch() {
* driver.get("http://www.google.com");
* WebElement searchBox = driver.findElement(By.name("q"));
* searchBox.sendKeys("webdriver");
* searchBox.quit();
* assertEquals("webdriver - Google Search", driver.getTitle());
* }
* }
*
* </pre></code>
*
* @see ChromeDriverService#createDefaultService
*/
public class ChromeDriver extends RemoteWebDriver implements TakesScreenshot {
/**
* Creates a new ChromeDriver using the {@link ChromeDriverService#createDefaultService default}
* server configuration.
*
* @see #ChromeDriver(ChromeDriverService, ChromeOptions)
*/
public ChromeDriver() {
this(ChromeDriverService.createDefaultService(), new ChromeOptions());
}
/**
* Creates a new ChromeDriver instance. The {@code service} will be started along with the driver,
* and shutdown upon calling {@link #quit()}.
*
* @param service The service to use.
* @see #ChromeDriver(ChromeDriverService, ChromeOptions)
*/
public ChromeDriver(ChromeDriverService service) {
this(service, new ChromeOptions());
}
/**
* Creates a new ChromeDriver instance. The {@code capabilities} will be passed to the
* chromedriver service.
*
* @param capabilities The capabilities required from the ChromeDriver.
* @see #ChromeDriver(ChromeDriverService, Capabilities)
*/
public ChromeDriver(Capabilities capabilities) {
this(ChromeDriverService.createDefaultService(), capabilities);
}
/**
* Creates a new ChromeDriver instance with the specified options.
*
* @param options The options to use.
* @see #ChromeDriver(ChromeDriverService, ChromeOptions)
*/
public ChromeDriver(ChromeOptions options) {
this(ChromeDriverService.createDefaultService(), options);
}
/**
* Creates a new ChromeDriver instance. The {@code service} will be started along with the
* driver, and shutdown upon calling {@link #quit()}.
*
* @param service The service to use.
* @param capabilities The capabilities required from the ChromeDriver.
*/
public ChromeDriver(ChromeDriverService service, Capabilities capabilities) {
super(new DriverCommandExecutor(service), capabilities);
}
/**
* Creates a new ChromeDriver instance with the specified options. The {@code service} will be
* started along with the driver, and shutdown upon calling {@link #quit()}.
*
* @param service The service to use.
* @param options The options to use.
*/
public ChromeDriver(ChromeDriverService service, ChromeOptions options) {
super(new DriverCommandExecutor(service), options.toCapabilities());
}
@Override
public void setFileDetector(FileDetector detector) {
throw new WebDriverException(
"Setting the file detector only works on remote webdriver instances obtained " +
"via RemoteWebDriver");
}
public <X> X getScreenshotAs(OutputType<X> target) {
// Get the screenshot as base64.
String base64 = (String) execute(DriverCommand.SCREENSHOT).getValue();
// ... and convert it.
return target.convertFromBase64Png(base64);
}
}