package com.brucezee.jspider.selenium;
import com.google.common.collect.ImmutableMap;
import com.brucezee.jspider.selenium.common.enums.DriverType;
import org.apache.commons.lang3.StringUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.remote.CommandExecutor;
import org.openqa.selenium.remote.DriverCommand;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.Response;
import org.openqa.selenium.remote.service.DriverService;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.net.URL;
import java.util.Date;
import java.util.List;
/**
* Created by brucezee on 2017/1/11.
*/
public class WebDriverEx extends RemoteWebDriver {
private DriverService driverService;
private DriverType driverType;
private Date createdTime;
public WebDriverEx() {
super();
}
public WebDriverEx(CommandExecutor executor, Capabilities desiredCapabilities, Capabilities requiredCapabilities) {
super(executor, desiredCapabilities, requiredCapabilities);
}
public WebDriverEx(CommandExecutor executor, Capabilities desiredCapabilities) {
super(executor, desiredCapabilities);
}
public WebDriverEx(Capabilities desiredCapabilities) {
super(desiredCapabilities);
}
public WebDriverEx(URL remoteAddress, Capabilities desiredCapabilities, Capabilities requiredCapabilities) {
super(remoteAddress, desiredCapabilities, requiredCapabilities);
}
public WebDriverEx(URL remoteAddress, Capabilities desiredCapabilities) {
super(remoteAddress, desiredCapabilities);
}
public DriverService getDriverService() {
return driverService;
}
public void setDriverService(DriverService driverService) {
this.driverService = driverService;
}
public DriverType getDriverType() {
return driverType;
}
public void setDriverType(DriverType driverType) {
this.driverType = driverType;
}
public Date getCreatedTime() {
return createdTime;
}
public void setCreatedTime(Date createdTime) {
this.createdTime = createdTime;
}
public void shutdown() {
this.quit();
if (driverService != null) {
driverService.stop();
}
}
/**
* 等待超时毫秒数
*/
private static final int DEFAULT_TIME_OUT_IN_MILLIS = 45*1000;
/**
* 请求返回后默认延迟毫秒数
*/
private static final int DEFAULT_DELAYED_MILLIS = 1*1000;
/**
* 根据标题中包含某个子串来等待
* @param title 标题子串
*/
public void waitWithTitle(final String title) {
waitWithTitle(title, DEFAULT_TIME_OUT_IN_MILLIS);
}
/**
* 根据标题中包含某个子串来等待
* @param title 标题子串
* @param timeOutInMillis 超时时间毫秒数
*/
public void waitWithTitle(final String title, int timeOutInMillis) {
(new WebDriverWait(this, timeOutInMillis/1000)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
String t = d.getTitle();
if (StringUtils.isEmpty(title)) {
//等到有title就停止
return StringUtils.isNotBlank(t);
}
return t != null && t.contains(title);
}
});
}
/**
* 根据标题中包含某个子串来等待并且延迟一段时间
* @param title 标题子串
* @param delayedMillis 延迟毫秒数
*/
public void waitWithTitleAndDelayed(final String title, int delayedMillis) {
waitWithTitleAndDelayed(title, DEFAULT_TIME_OUT_IN_MILLIS, delayedMillis);
}
/**
* 根据标题中包含某个子串来等待并且延迟一段时间
* @param title 标题子串
*/
public void waitWithTitleAndDelayed(final String title) {
waitWithTitleAndDelayed(title, DEFAULT_TIME_OUT_IN_MILLIS, DEFAULT_DELAYED_MILLIS);
}
/**
* 根据标题中包含某个子串来等待
* @param title 标题子串
* @param timeOutInMillis 超时时间毫秒数
* @param delayedMillis 延迟毫秒数
*/
public void waitWithTitleAndDelayed(final String title, int timeOutInMillis, int delayedMillis) {
(new WebDriverWait(this, timeOutInMillis/1000)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
String t = d.getTitle();
if (StringUtils.isEmpty(title)) {
//等到有title就停止
return StringUtils.isNotBlank(t);
}
return t != null && t.contains(title);
}
});
if (delayedMillis > 0) {
sleep(delayedMillis);
}
}
/**
* 根据内容中包含某个子串来等待
* @param content 指定的某个子串
*/
public void waitWithContent(final String content) {
waitWithContent(content, DEFAULT_TIME_OUT_IN_MILLIS);
}
/**
* 根据内容中包含某个子串来等待
* @param content 内容子串
* @param timeOutInMillis 超时时间毫秒数
*/
public void waitWithContent(final String content, int timeOutInMillis) {
(new WebDriverWait(this, timeOutInMillis/1000)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
String html = d.getPageSource();
if (StringUtils.isEmpty(content)) {
//等到有内容就停止
return StringUtils.isNotBlank(html);
}
return html != null && html.contains(content);
}
});
}
/**
* 根据内容中包含某个子串来等待并且延迟一段时间
* @param content 指定的某个子串
*/
public void waitWithContentAndDelayed(final String content) {
waitWithContentAndDelayed(content, DEFAULT_TIME_OUT_IN_MILLIS, DEFAULT_DELAYED_MILLIS);
}
/**
* 根据内容中包含某个子串来等待并且延迟一段时间
* @param content 指定的某个子串
* @param delayedMillis 延迟毫秒数
*/
public void waitWithContentAndDelayed(final String content, int delayedMillis) {
waitWithContentAndDelayed(content, DEFAULT_TIME_OUT_IN_MILLIS, delayedMillis);
}
/**
* 根据内容中包含某个子串来等待
* @param content 内容子串
* @param timeOutInMillis 超时时间毫秒数
* @param delayedMillis 延迟毫秒数
*/
public void waitWithContentAndDelayed(final String content, int timeOutInMillis, int delayedMillis) {
(new WebDriverWait(this, timeOutInMillis/1000)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
String html = d.getPageSource();
if (StringUtils.isEmpty(content)) {
//等到有内容就停止
return StringUtils.isNotBlank(html);
}
return html != null && html.contains(content);
}
});
if (delayedMillis > 0) {
sleep(delayedMillis);
}
}
public void getWithTitle(String url, String title) {
getWithTitle(url, title, DEFAULT_TIME_OUT_IN_MILLIS);
}
public void getWithTitle(String url, String title, int timeOutInMillis) {
super.get(url);
waitWithTitle(title, timeOutInMillis);
}
public void getWithTitleAndDelayed(String url, String title, int delayedMillis) {
getWithTitleAndDelayed(url, title, DEFAULT_TIME_OUT_IN_MILLIS, delayedMillis);
}
public void getWithTitleAndDelayed(String url, String title) {
getWithTitleAndDelayed(url, title, DEFAULT_TIME_OUT_IN_MILLIS, DEFAULT_DELAYED_MILLIS);
}
public void getWithTitleAndDelayed(String url, String title, int timeOutInMillis, int delayedMillis) {
super.get(url);
waitWithTitleAndDelayed(title, timeOutInMillis, delayedMillis);
}
public void getWithContent(String url, String content) {
getWithContent(url, content, DEFAULT_TIME_OUT_IN_MILLIS);
}
public void getWithContent(String url, String content, int timeOutInMillis) {
super.get(url);
waitWithContent(content, timeOutInMillis);
}
public void getWithContentAndDelayed(String url, String content) {
getWithContentAndDelayed(url, content, DEFAULT_TIME_OUT_IN_MILLIS, DEFAULT_TIME_OUT_IN_MILLIS);
}
public void getWithContentAndDelayed(String url, String content, int delayedMillis) {
getWithContentAndDelayed(url, content, DEFAULT_TIME_OUT_IN_MILLIS, delayedMillis);
}
public void getWithContentAndDelayed(String url, String content, int timeOutInMillis, int delayedMillis) {
super.get(url);
waitWithContentAndDelayed(content, timeOutInMillis, delayedMillis);
}
public void waitUntil(int timeOutInMillis, ExpectedCondition expectedCondition) {
waitUntil(timeOutInMillis, 0, expectedCondition);
}
public void waitUntil(int timeOutInMillis, int delayedMillis, ExpectedCondition expectedCondition) {
(new WebDriverWait(this, timeOutInMillis/1000)).until(expectedCondition);
if (delayedMillis > 0) {
sleep(delayedMillis);
}
}
@Override
public WebElement findElement(By by) {
try {
return super.findElement(by);
} catch (NoSuchElementException e) {
e.printStackTrace();
}
return null;
}
@Override
public List<WebElement> findElements(By by) {
try {
return super.findElements(by);
} catch (NoSuchElementException e) {
e.printStackTrace();
}
return null;
}
@Override
protected WebElement findElement(String by, String using) {
try {
return super.findElement(by, using);
} catch (NoSuchElementException e) {
e.printStackTrace();
}
return null;
}
@Override
protected List<WebElement> findElements(String by, String using) {
try {
return super.findElements(by, using);
} catch (NoSuchElementException e) {
e.printStackTrace();
}
return null;
}
public void sleep(long millis) {
try {
Thread.sleep(millis);
} catch (Exception e) {
}
}
public Response sendGet(String url) {
return execute(DriverCommand.GET, ImmutableMap.of("url", url));
}
public Response sendPost(String url) {
return execute("post", ImmutableMap.of("url", url));
}
}