package detective.core.task.webdriver;
import static org.junit.Assert.*;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.io.FileUtils;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
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.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.ScreenshotException;
public class WebDriverTest {
@Before
public void setupEnv(){
System.setProperty("webdriver.chrome.driver", "/Users/bglcorp/git/detective/core/src/main/resources/chromedrivers/mac/chromedriver");
System.setProperty(org.openqa.selenium.phantomjs.PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, "/Users/bglcorp/git/detective/core/src/main/resources/phantomjs/phantomjs-1.9.7-macosx/bin/phantomjs");
}
public String extractScreenShot(WebDriverException e) {
Throwable cause = e.getCause();
if (cause instanceof ScreenshotException) {
return ((ScreenshotException) cause).getBase64EncodedScreenshot();
}
return null;
}
protected File takeScreenShot(WebDriver webdriver) throws IOException{
File scrFile = ((TakesScreenshot)webdriver).getScreenshotAs(OutputType.FILE);
// Now you can do whatever you need to do with it, for example copy somewhere
File destFile = new File("/Users/bglcorp/git/detective/core/target/classes/" + scrFile.getName());
FileUtils.copyFile(scrFile, destFile);
return destFile;
}
//@Test
public void testGoogleWithFirefoxDriver() {
// The Firefox driver supports javascript
WebDriver driver = new FirefoxDriver();
test(driver);
driver.quit();
}
private AtomicInteger threadRunns = new AtomicInteger(0);
/**
* 20 max
* @throws InterruptedException
*/
//@Test
public void testLocalChromeDriver() throws InterruptedException {
runMultipleThread(20, new WebDriverFactory(){
public WebDriver getDriver() {
return new ChromeDriver();
}
});
}
//@Test
public void testRemoteChrome() throws InterruptedException {
runMultipleThread(1, new WebDriverFactory(){
public WebDriver getDriver() {
return new RemoteWebDriver(DesiredCapabilities.chrome());
}
});
}
//@Test
public void testRemotePhantomjs() throws InterruptedException {
runMultipleThread(30, new WebDriverFactory(){
public WebDriver getDriver() {
RemoteWebDriver driver;
try {
driver = new RemoteWebDriver(new URL("http://localhost:8081/wd"), DesiredCapabilities.phantomjs());
return driver;
} catch (MalformedURLException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
});
}
/**
* 60 Max
* 40 looks stable
* @throws InterruptedException
*/
//@Test
public void testLocalPhantomjs() throws InterruptedException {
runMultipleThread(60, new WebDriverFactory(){
public WebDriver getDriver() {
return new PhantomJSDriver();
}
} );
}
public static interface WebDriverFactory{
WebDriver getDriver();
}
private void runMultipleThread(final int threadCount, final WebDriverFactory driverFactory) throws InterruptedException {
threadRunns = new AtomicInteger(0);
for(int i = 0; i < threadCount; i++){
Thread thread = new Thread(new Runnable(){
public void run() {
try {
WebDriver driver = driverFactory.getDriver();
System.out.println("Startup " + driver.toString() + " - " + threadRunns);
test(driver);
System.out.println("Done " + driver.toString() + " - " + threadRunns);
File file = takeScreenShot(driver);
//Runtime.getRuntime().exec("open " + file.getAbsolutePath());
driver.quit();
} catch (Exception e){
e.printStackTrace();
}finally{
threadRunns.incrementAndGet();
}
}});
thread.start();
}
while(true){
Thread.sleep(2000);
System.out.println("Waiting " + threadRunns);
if (threadRunns.get() >= threadCount )
return;
}
}
//@Test
public void testRemoteFirefox() {
WebDriver driver = new RemoteWebDriver(DesiredCapabilities.firefox());
// Query the driver to find out more information
Capabilities actualCapabilities = ((RemoteWebDriver) driver).getCapabilities();
test(driver);
driver.quit();
}
private void test(WebDriver driver) {
// And now use it
driver.get("http://www.google.com/webhp?complete=1&hl=en");
// Enter the query string "Cheese"
WebElement query = driver.findElement(By.name("q"));
query.sendKeys("Cheese");
// Sleep until the div we want is visible or 5 seconds is over
long end = System.currentTimeMillis() + 5000;
while (System.currentTimeMillis() < end) {
WebElement resultsDiv = driver.findElement(By.className("gssb_e"));
// If results have been returned, the results are displayed in a drop down.
if (resultsDiv.isDisplayed()) {
break;
}
}
// And now list the suggestions
List<WebElement> allSuggestions = driver.findElements(By.xpath("//td[@class='gssb_a gbqfsf']"));
for (WebElement suggestion : allSuggestions) {
System.out.println(suggestion.getText());
}
}
}