Java Selenium封裝--RemoteWebDriver

上帝De助手發表於2013-10-24
package com.selenium.driver;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.Augmenter;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.RemoteWebElement;
public class JSWebDriver{
	private RemoteWebDriver wd = null;
	private JavascriptExecutor jse = null;
	
	public JSWebDriver(URL remoteAddress, Capabilities desiredCapabilities) {
		wd = new RemoteWebDriver(remoteAddress, desiredCapabilities);
	}
	
	///
	///瀏覽器url導航
	///
	public void goTo(String url){
		wd.get(url);
	}	
	
	///
	///瀏覽器退出
	///
	public void quit(){
		wd.quit();
	}

	///
	///瀏覽器後退
	///
	public void back(){
		wd.navigate().back();
	}

	///
	///瀏覽器前進
	///
	public void forward(){
		wd.navigate().forward();
	}
	
	///
	///瀏覽器重新整理
	///
	public void refresh(){
		wd.navigate().refresh();
	}
	
	///
	///切換到新瀏覽器視窗;按照title、url、index;支援正則匹配
	///
	public void switchToWindow(String by, String value, String...match) throws Exception{
		String currenthandle = wd.getWindowHandle();
		Set<String> handles = wd.getWindowHandles();
		int currentIndex = -1;
		String searchString = "";
		for(String handle : handles){
			currentIndex += 1;
			if(handle.equals(currenthandle)){
				continue;
			}else{				
				wd.switchTo().window(handle);
				if (match.length == 1 && match[0].equals("regex")){					
					if (by.equals("title")){
						searchString = wd.getTitle();
					}else if (by.equals("url")){
						searchString = wd.getCurrentUrl();
					}	
					Pattern pattern = Pattern.compile(value);
					Matcher matcher = pattern.matcher(searchString);
					if(matcher.find()){
						return;
					}
				}else{
					if (by.equals("title")){
						searchString = wd.getTitle();
					}else if (by.equals("url")){
						searchString = wd.getCurrentUrl();
					}else if (by.equals("index")){
						searchString = Integer.toString(currentIndex);
					}
					if(searchString.equals(value)){
						return;
					}
				}
			}
		}
		Exception e = new Exception("Swtich Window Failed, Please Make Sure The Locator Was Right.");
		throw e;
	}
	
	///
	///JS彈框確認
	///
	public void clickAlertSure(){
		Alert alert = wd.switchTo().alert();
		alert.accept();
	}
	
	///
	///JS彈框取消
	///
	public void clickAlertDismiss()
	{
		Alert alert = wd.switchTo().alert();
		alert.dismiss();
	}
	
	///
	///設定prompt彈框內容
	///
	public void setPromptMessage(String parameter){
		Alert alert = wd.switchTo().alert();
		alert.sendKeys(parameter);
	}
	
	///
	///獲取JS彈框內容
	///
	public String getPromptMessage(){
		Alert alert = wd.switchTo().alert();
		return alert.getText();
	}	
	
	///
	///切換到Frame視窗;先定位到iframe元素
	///
	public void switchToFrame(JSWebElement jselement){		
		wd.switchTo().frame(jselement.getNativeWebElement());
	}

	///
	///執行JS指令碼
	///
	public void executeScript(String parameter){
		JavascriptExecutor js = getJSE();
		js.executeScript(parameter);
	}

	///
	///獲取指定cookie
	///
	public String getCookie(String name){
		Cookie cookie=wd.manage().getCookieNamed(name);
		if (cookie == null){ return "null"; }
		return cookie.getValue();
	}
	
	///
	///獲取所有cookie
	///
	public Map<String, String> getCookies(){
		Map<String, String> newCookies = new HashMap<String, String>();
		Set<Cookie> cookies= wd.manage().getCookies();
		for (Cookie cookie : cookies){
			newCookies.put(cookie.getName(), cookie.getValue());
		}
		return newCookies;
	}
	
	///
	///擷取螢幕
	///
	public void getScreen(String filepath){
		WebDriver augmentedDriver = new Augmenter().augment(this.wd); 
		TakesScreenshot ts = (TakesScreenshot) augmentedDriver;
		File screenShotFile = ts.getScreenshotAs(OutputType.FILE); 
		try { 
			FileUtils.copyFile (screenShotFile, new File(filepath)); 
		}catch (IOException e){ 
			e.printStackTrace(); 
		} 
	}

	///
	///獲取title
	///
	public String getTitle(){
		return wd.getTitle();
	}	

	///
	///獲取url
	///
	public String getUrl(){
		return wd.getCurrentUrl();
	}
	
	///
	///獲取HTML原始碼
	///
	public String getSource(){
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return wd.getPageSource();
	}
	
	///
	///滾動頁面到指定位置
	///
	public void scroll(String x, String y){
		if (x.equals("left")){
			x = "0";
		}else if (x.equals("right")){
			x = "document.body.scrollWidth";
		}else if (x.equals("middle")){
			x = "document.body.scrollWidth/2";
		}
		if (y.equals("top")){
			y = "0";
		}else if (y.equals("buttom")){
			y = "document.body.scrollHeight";
		}else if (y.equals("middle")){
			y = "document.body.scrollHeight/2";
		}
		this.executeScript(String.format("scroll(%s,%s);", x, y));
	}
	
	///
	///最大化瀏覽器
	///
	public void maximize(){
		wd.manage().window().maximize();
	}
	
	public JSWebElement findElementById(String using) {
		try {
			return new JSWebElement((RemoteWebElement)wd.findElementById(using));
		}catch (NoSuchElementException e){
			return new JSWebElement();
		}
	}
	
	public JSWebElement findElementByCssSelector(String using) {
		try {
			return new JSWebElement((RemoteWebElement)wd.findElementByCssSelector(using));
		}catch (NoSuchElementException e){
			return new JSWebElement();
		}
	}
	
	public JSWebElement findElementByXPath(String using) {
		try {
			return new JSWebElement((RemoteWebElement)wd.findElementByXPath(using));
		}catch (NoSuchElementException e){
			return new JSWebElement();
		}
	}

	public JSWebElement findElementByLinkText(String using) {
		try {
			return new JSWebElement((RemoteWebElement)wd.findElementByLinkText(using));
		}catch (NoSuchElementException e){
			return new JSWebElement();
		}
	}
	
	public JSWebElement findElementByDom(String using) {
		try {
			JavascriptExecutor js = this.getJSE();
			WebElement we = (WebElement)js.executeScript(String.format("return %s", using));			
			return new JSWebElement((RemoteWebElement)we);
		}catch (NoSuchElementException e){
			return new JSWebElement();
		}
	}
	
	///
	///獲取原生的RemoteWebdriver物件
	///
	public RemoteWebDriver getNativeWebDriver(){
		return this.wd;
	}
	
	private JavascriptExecutor getJSE(){
		if (this.jse == null){
			this.jse = (JavascriptExecutor) this.wd;				
		}		
		return jse;
	}
}

相關文章