1. 程式人生 > >WebDriver自動化測試框架詳解

WebDriver自動化測試框架詳解

webDriver自動化測試框架詳解

一、 簡介

  1. WebDriver API相對於Selenium Remote Control API來說,雖然同樣是控制瀏覽器,但它的程式設計介面更加簡潔
  2. WebDriver可以應對那些網頁本身不重新載入的動態網頁。
  3. Selenium Remote Control是採用向瀏覽器注入javascript指令碼來控制瀏覽器的,但WebDriver與之不同,它是直接使用瀏覽器內建的自動化支援來控制瀏覽器的。
  4. WebDriver實際上就像它的名字一樣,向上遮蔽各廠商瀏覽器的差異,提供了一個統一的程式設計API,方便廣大程式設計師控制瀏覽器的行為。

二、 webDriver 的 driver

  1. 即然要遮蔽各廠商瀏覽器的差異,那麼各廠商自然需要根據WebDriver規範作出各自的實現。WebDriver官方文件就列出各實現:HtmlUnit Driver、Firefox Driver、InternetExplorerDriver、ChromeDriver、Opera Driver、iOS Driver、Android Driver。這些Driver各有優缺點及各自適用的場景,具體可看官方文件說明。其實一看這些名字就知道是什麼意思,要控制哪種瀏覽器就需要下載安裝對應的Driver。比如我這裡是Mac OSX系統,而且想控制該系統上的Chrome瀏覽器,那麼就下載chromedriver_mac32.zip(注意該Driver對你的Chrome瀏覽器有版本要求,要求版本必須是v46-50這個範圍),將該壓縮包裡的可執行檔案放到PATH環境變數目錄中,比如放到/usr/local/bin目錄中
  2. 各個driver 的官方文件說明 https://www.seleniumhq.org/docs/03_webdriver.jsp#selenium-webdriver-s-drivers

三、 webDriver 使用前準備

  1. 官方還很貼心地為WebDriver提供了更主流語言的SDK。支援的語言有Java、C#、Python、Ruby、Perl、PHP、JavaScript。但我感覺這種測試相關的程式語言最好還是用指令碼語言合適一點,改起來很方便,不需要時時編譯。

  2. Js(不用js執行測試 則忽略)

     //前提是先安裝好NodeJS
     mkdir test && cd test
     npm init //這裡根據提示一步步初始化一個新的NodeJS專案
     npm install selenium-webdriver --save //安裝WebDriver JavaScript SDK的npm依賴
    
  3. Java maven 依賴:

     <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
     <dependency>
     	<groupId>org.seleniumhq.selenium</groupId>
     	<artifactId>selenium-java</artifactId>
     	<version>3.141.0</version>
     </dependency>
    

四、 webDriver 使用

  1. 控制瀏覽器

     import org.openqa.selenium.WebDriver;
     import org.openqa.selenium.chrome.ChromeDriver;
     import org.openqa.selenium.firefox.FirefoxDriver;
     import org.openqa.selenium.ie.InternetExplorerDriver;
     
     /**
      * webDriver 開啟各種瀏覽器
      * @author outman
      * @date  2018-11-07
      * */
     public class Demo_02 {
     	public static void main(String[] args) {
     //		openFirFox();
     //		openIE();
     		openChrome();
     	}
     	/**
     	 * 開啟谷歌瀏覽器
     	 * */
     	private static void openChrome() {
     		// chromedriver.exe  下載地址 : http://chromedriver.storage.googleapis.com/index.html
     		// 注意: 下載驅動時驅動版本要與selenium 版本一致
     		System.setProperty("webdriver.chrome.driver","D:\\DevelopSoftware\\chromedriver_win32\\chromedriver.exe");
     		WebDriver driver = new ChromeDriver();
     		// 在執行操作是可能會報錯: Exception in thread "main" org.openqa.selenium.SessionNotCreatedException: session not created: Chrome version must be >= 68.0.3440.0 
     		// 解決:  使chromedriver 版本與chrome 版本相對應   參考chromedriver與chrome 版本對映關係 https://blog.csdn.net/huilan_same/article/details/51896672
     		driver.get("http://www.baidu.com");
     		
     	}
     	/**
     	 * 開啟IE瀏覽器
     	 * */ 
     	private static void openIE() {
     		// IEDriverServer.exe 下載地址   https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver
     		// 注意: 下載驅動時驅動版本要與selenium 版本一致
     		// 可能報錯:Exception in thread "main" org.openqa.selenium.SessionNotCreatedException: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones. Enable Protected Mode must be set to the same value (enabled or disabled) for all zones.
     		// 解決: 設定internet選項  --  安全 -- 把所有的啟動保護模式都關閉
     		System.setProperty("webdriver.ie.driver", "D:\\DevelopSoftware\\IEDriverServer_x64_3.141.0\\IEDriverServer.exe");
     		WebDriver driver = new InternetExplorerDriver();
     		driver.get("http://www.baidu.com");
     		
     	}
     
     	/**
     	 * 開啟火狐瀏覽器
     	 * @throws InterruptedException 
     	 * */
     	private static void openFirFox() throws InterruptedException {
     		// geckodriver 下載地址: https://github.com/mozilla/geckodriver
     		System.setProperty("webdriver.gecko.driver", "D:\\DevelopSoftware\\geckodriver-v0.23.0-win64\\geckodriver.exe");
     		//讀取獲取瀏覽器二進位制檔案
     		System.setProperty("webdriver.firefox.bin", "D:\\應用\\FoxMail\\firefox.exe");
     		WebDriver dirver = new FirefoxDriver();
     		dirver.get("http://www.baidu.com");
     	}
     }
    
  2. 定位dom元素

     import org.openqa.selenium.By;
     import org.openqa.selenium.WebDriver;
     import org.openqa.selenium.WebElement;
     import org.openqa.selenium.firefox.FirefoxDriver;
     
     /**
      * 定位dom元素
      * 
      * @author outman
      * @date 2018-11-07
      */
     public class Demo_03 {
     	public static void main(String[] args) {
     		// 獲取驅動並開啟瀏覽器
     		WebDriver dirver = openFirFox();
     		// 定位dom 元素
     		findElement(dirver);
     
     	}
     
     	/**
     	 * 定位dom 元素
     	 */
     	private static void findElement(WebDriver dirver) {
     		// 開啟百度搜索頁
     		dirver.get("http://www.baidu.com");
     		// 根據ID 定位元素 搜尋框
     		WebElement kw = dirver.findElement(By.id("kw"));
     		System.out.println("搜尋框使用標籤:" + kw.getTagName());
     		// 根據class 類名定位 搜尋框
     		WebElement kw2 = dirver.findElement(By.className("s_ipt"));
     		System.out.println("搜尋框使用標籤:" + kw2.getTagName());
     		// 根據tagName定位 搜尋框
     		WebElement kw3 = dirver.findElement(By.tagName("input"));
     		System.out.println("搜尋框使用標籤:" + kw3.getTagName());
     		// 根據name定位 搜尋框
     		WebElement kw4 = dirver.findElement(By.name("wd"));
     		System.out.println("搜尋框使用標籤:" + kw4.getTagName());
     		// 根據連結文字定位 頁尾連結
     		WebElement kw5 = dirver.findElement(By.linkText("把百度設為主頁"));
     		System.out.println("連結使用標籤:" + kw5.getTagName());
     		// 根據連結部分文字定位 頁尾連結
     		WebElement kw6 = dirver.findElement(By.partialLinkText("百度"));
     		System.out.println("連結使用標籤:" + kw6.getTagName());
     		// 根據css選擇器定位 搜尋框    css選擇器參考: http://www.w3school.com.cn/cssref/css_selectors.asp
     		WebElement kw7 = dirver.findElement(By.cssSelector("#kw"));
     		System.out.println("搜尋框使用標籤:" + kw7.getTagName());
     		// 根據xpath定位 搜尋框    xpath語法參考: http://www.w3school.com.cn/xpath/xpath_syntax.asp
     		WebElement kw8 = dirver.findElement(By.xpath("//input"));
     		System.out.println("搜尋框使用標籤:" + kw8.getTagName());
     
     	}
     
     	/**
     	 * 開啟火狐瀏覽器
     	 */
     	private static WebDriver openFirFox() {
     		// geckodriver 下載地址: https://github.com/mozilla/geckodriver
     		System.setProperty("webdriver.gecko.driver", "D:\\DevelopSoftware\\geckodriver-v0.23.0-win64\\geckodriver.exe");
     		// 讀取獲取瀏覽器二進位制檔案
     		System.setProperty("webdriver.firefox.bin", "D:\\應用\\FoxMail\\firefox.exe");
     		WebDriver dirver = new FirefoxDriver();
     		return dirver;
     	}
     }
    
    1. 這麼多種定位UI元素的辦法,總有一款可以適應你的需求。我個人比較喜歡使用css selector來定位元素。要得到一個元素的css selector也很簡單,只需要使用Chrome的開發者工具檢視這個元素,然後在這個元素上右鍵,點選Copy selector就得到了(當然如有可能最好對得到的css selector簡寫一下)。
  3. 操作dom元素

     import org.openqa.selenium.By;
     import org.openqa.selenium.WebDriver;
     import org.openqa.selenium.WebElement;
     import org.openqa.selenium.firefox.FirefoxDriver;
     
     /**
      * 操作dom
      * 
      * @author outman
      * @date 2018-11-07
      */
     public class Demo_04 {
     	public static void main(String[] args) {
     		// 開啟瀏覽器
     		WebDriver dirver = openFirFox();
     		// 執行操作
     		doExcult(dirver);
     	}
     
     	/**
     	 * 執行操作
     	 */
     	private static void doExcult(WebDriver dirver) {
     		// 開啟百度
     		dirver.get("http://www.baidu.com");
     		
     		// 獲取元素  百度一下按鈕
     		WebElement sbtn = dirver.findElement(By.cssSelector("#su"));
     		// 獲取屬性的值
     		System.out.println("按鈕文字:"+sbtn.getAttribute("value"));
     		
     		// 獲取元素  頁尾連結
     		WebElement linkOne = dirver.findElement(By.cssSelector("#setf"));
     		// 獲取文字內容
     		System.out.println("連結文字:"+linkOne.getText());
     		
     		//連續獲取元素
     		WebElement soutuBtn = dirver.findElement(By.className("fm"));
     		WebElement sInput = soutuBtn.findElement(By.tagName("span")).findElement(By.name("wd"));
     		System.out.println("搜尋框使用標籤:"+sInput.getTagName());
     		
     		//向input輸入文字
     		sInput.sendKeys("百度一下");
     		System.out.println("搜尋框內容:"+sInput.getAttribute("value"));
     		//清空input 元素內容
     		sInput.clear();
     		System.out.println("搜尋框內容:"+sInput.getAttribute("value"));
     		
     		//點選按鈕
     		sInput.sendKeys("百度一下");
     		sbtn.click();
     		
     		//提交表單
     		sInput.clear();
     		sInput.sendKeys("百度兩下");
     		sbtn.submit();
     		
     	}
     
     	/**
     	 * 開啟火狐瀏覽器
     	 */
     	private static WebDriver openFirFox() {
     		// geckodriver 下載地址: https://github.com/mozilla/geckodriver
     		System.setProperty("webdriver.gecko.driver", "D:\\DevelopSoftware\\geckodriver-v0.23.0-win64\\geckodriver.exe");
     		// 讀取獲取瀏覽器二進位制檔案
     		System.setProperty("webdriver.firefox.bin", "D:\\應用\\FoxMail\\firefox.exe");
     		WebDriver dirver = new FirefoxDriver();
     		return dirver;
     	}
     }
    
  4. 操作視窗

     import org.openqa.selenium.Dimension;
     import org.openqa.selenium.JavascriptExecutor;
     import org.openqa.selenium.Point;
     import org.openqa.selenium.WebDriver;
     import org.openqa.selenium.firefox.FirefoxDriver;
     
     /**
      * 操作視窗
      * 
      * @author outman
      * @date 2018-11-07
      */
     public class Demo_05 {
     	public static void main(String[] args) {
     		// 開啟瀏覽器
     		WebDriver dirver = openFirFox();
     		// 執行操作
     		doExcult(dirver);
     	}
     
     	/**
     	 * 執行操作
     	 */
     	private static void doExcult(WebDriver dirver) {
     		// 建立js 執行物件
     		JavascriptExecutor jsExceut = (JavascriptExecutor) dirver;
     		// 導航到百度
     		dirver.get("http://www.baidu.com");
     		
     		// 建立多個視窗
     		String js = "window.open(\"https://www.sogou.com\");";
     		String js2 = "window.open(\"http://www.w3school.com.cn/xpath/xpath_syntax.asp\");";
     		
     		// 當只傳入js指令碼時 , 預設執行該js 的物件時瀏覽器
     		jsExceut.executeScript(js);
     		jsExceut.executeScript(js2);
     		
     		// 設定視窗位置
     		dirver.manage().window().setPosition(new Point(100, 100));
     		// 設定視窗大小
     		dirver.manage().window().setSize(new Dimension(500 , 200));
     		// 最大化視窗
     		dirver.manage().window().maximize();
     		// 全屏
     		dirver.manage().window().fullscreen();
     		
     	}
     
     	/**
     	 * 開啟火狐瀏覽器
     	 */
     	private static WebDriver openFirFox() {
     		// geckodriver 下載地址: https://github.com/mozilla/geckodriver
     		System.setProperty("webdriver.gecko.driver", "D:\\DevelopSoftware\\geckodriver-v0.23.0-win64\\geckodriver.exe");
     		// 讀取獲取瀏覽器二進位制檔案
     		System.setProperty("webdriver.firefox.bin", "D:\\應用\\FoxMail\\firefox.exe");
     		WebDriver dirver = new FirefoxDriver();
     		return dirver;
     	}
     }
    
  5. 在視窗或frame 之間切換

     import java.util.Set;
     
     import org.openqa.selenium.JavascriptExecutor;
     import org.openqa.selenium.WebDriver;
     import org.openqa.selenium.WebElement;
     import org.openqa.selenium.firefox.FirefoxDriver;
     
     /**
      * 在視窗或Frame 之間切換
      * 
      * @author outman
      * @date 2018-11-07
      */
     public class Demo_06 {
     	public static void main(String[] args) {
     		// 開啟瀏覽器
     		WebDriver dirver = openFirFox();
     		// 執行操作
     		doExecute(dirver);
     	}
     	
     	/**
     	 * 執行操作
     	 * */
     	private static void doExecute(WebDriver dirver) {
     		JavascriptExecutor jsExecute = (JavascriptExecutor) dirver;
     		String openWindowPre = "window.open('";
     		String openWindowSuf = "');";
     		String url_1 = "https://www.sogou.com";
     		String url_2 = "http://田傑.wang";
     		// 開啟多個視窗
     		dirver.get("http://www.baidu.com");
     //		jsExecute.executeScript(openWindowPre+url_1+openWindowSuf);
     //		jsExecute.executeScript(openWindowPre+url_2+openWindowSuf);
     	
     		// 獲取當前視窗的handle
     		String windowHandle = dirver.getWindowHandle();
     		System.out.println("當前瀏覽器handle:"+windowHandle);
     		// 列出瀏覽器所有視窗的handle
     		Set<String> windowHandles = dirver.getWindowHandles();
     		System.out.println("所有視窗的handle:"+windowHandles);
     		// 獲取當前頁面標題 
     		String title = dirver.getTitle();
     		System.out.println("當前頁面標題:"+title);
     		// 獲取當前頁面原始碼
     		String pageSource = dirver.getPageSource();
     		//System.out.println("當前頁面原始碼:"+pageSource);
     		// 獲取當前頁面url
     		String currentUrl = dirver.getCurrentUrl();
     		System.out.println("當前頁面url:"+currentUrl);
     		
     		// 聚焦到頂部視窗  或  頂部frame
     		WebDriver defaultContent = dirver.switchTo().defaultContent();
     		// 返回到當前聚焦的元素  如果沒有聚焦的元素  則返回body
     		WebElement activeElement = dirver.switchTo().activeElement();
     		// 切換單當前活躍的提示窗 
     //		Alert alert = dirver.switchTo().alert(); //沒有找到alert會拋異常
     		// 切換到指定視窗
     		WebDriver window = dirver.switchTo().window(windowHandle);// 傳入 name 或者handle
     		// 切換frame
     		WebDriver frame = dirver.switchTo().frame("");
     		// 切換到父frame
     		WebDriver parentFrame = dirver.switchTo().parentFrame();
     	
     	}
     
     	/**
     	 * 開啟火狐瀏覽器
     	 */
     	private static WebDriver openFirFox() {
     		// geckodriver 下載地址: https://github.com/mozilla/geckodriver
     		System.setProperty("webdriver.gecko.driver", "D:\\DevelopSoftware\\geckodriver-v0.23.0-win64\\geckodriver.exe");
     		// 讀取獲取瀏覽器二進位制檔案
     		System.setProperty("webdriver.firefox.bin", "D:\\應用\\FoxMail\\firefox.exe");
     		WebDriver dirver = new FirefoxDriver();
     		return dirver;
     	}
     }
    
  6. 操作alert

     點選Alert視窗中的OK:
     driver.switchTo().alert().accept();
     點選Alert視窗中的Cancel:
     driver.switchTo().alert().dismiss();
     向Alert視窗輸入文字:
     driver.switchTo().alert().sendKeys(‘abcd’);
    
  7. 操作瀏覽器的導航及位址列

     import org.openqa.selenium.WebDriver;
     import org.openqa.selenium.firefox.FirefoxDriver;
     
     /**
      * 操作瀏覽器的導航及位址列
      * 
      * @author outman
      * @date 2018-11-07
      */
     public class Demo_07 {
     	public static void main(String[] args) {
     		// 開啟瀏覽器
     		WebDriver dirver = openFirFox();
     		// 執行操作
     		doExecute(dirver);
     	}
     	
     	/**
     	 * 執行操作
     	 * */
     	private static void doExecute(WebDriver dirver) {
     		//導航到百度
     		dirver.get("http://www.baidu.com");
     		//導航到搜狗
     		dirver.navigate().to("https://www.sogou.com");
     		//導航後退
     		dirver.navigate().back();
     		//導航前進
     		dirver.navigate().forward();
     		//導航重新整理
     		dirver.navigate().refresh();
     	}
     
     	/**
     	 * 開啟火狐瀏覽器
     	 */
     	private static WebDriver openFirFox() {
     		// geckodriver 下載地址: https://github.com/mozilla/geckodriver
     		System.setProperty("webdriver.gecko.driver", "D:\\DevelopSoftware\\geckodriver-v0.23.0-win64\\geckodriver.exe");
     		// 讀取獲取瀏覽器二進位制檔案
     		System.setProperty("webdriver.firefox.bin", "D:\\應用\\FoxMail\\firefox.exe");
     		WebDriver dirver = new FirefoxDriver();
     		return dirver;
     	}
     }
    
  8. 操作cookie

     import java.util.Set;
     
     import org.openqa.selenium.Cookie;
     import org.openqa.selenium.WebDriver;
     import org.openqa.selenium.firefox.FirefoxDriver;
     
     /**
      * 操作cookie
      */
     public class Demo_08 {
     
     	public static void main(String[] args) {
     		// 開啟瀏覽器
     		WebDriver dirver = openFirFox();
     		// 執行操作
     		doExecute(dirver);
     	}
     
     	/**
     	 * 執行操作
     	 */
     	private static void doExecute(WebDriver dirver) {
     		dirver.get("http://www.baidu.com");
     		// 新增cookie
     		Cookie addCookie = new Cookie("outman", "1317361873dfdfv");
     		dirver.manage().addCookie(addCookie);
     		
     		// 得到所有的cookie
     		Set<Cookie> cookies = dirver.manage().getCookies();
     		for(Cookie cookie : cookies) {
     			System.out.println("cookie:"+cookie);
     		}
     		System.out.println("所有cookie:"+cookies);
     		
     		// 根據名字獲取cookie
     		Cookie outman = dirver.manage().getCookieNamed("outman");
     		System.out.println("outman的cookie:"+outman);
     		
     		// 根據name刪除cookie 
     		dirver.manage().deleteCookieNamed("outman");
     		Cookie outman2 = dirver.manage().getCookieNamed("outman");
     		System.out.println("outman的cookie:"+outman2);
     		
     		// 刪除指定的cookie
     		dirver.manage().deleteCookie(new Cookie("outman" , ""));
     		Cookie outman3 = dirver.manage().getCookieNamed("outman");
     		System.out.println("outman的cookie:"+outman3);
     		
     		// 刪除所有cookie
     		dirver.manage().deleteAllCookies();
     		Set<Cookie> cookies2 = dirver.manage().getCookies();
     		System.out.println("所有cookie:"+cookies2);
     		
     
     	}
     
     	/**
     	 * 開啟火狐瀏覽器
     	 */
     	private static WebDriver openFirFox() {
     		// geckodriver 下載地址: https://github.com/mozilla/geckodriver
     		System.setProperty("webdriver.gecko.driver", "D:\\DevelopSoftware\\geckodriver-v0.23.0-win64\\geckodriver.exe");
     		// 讀取獲取瀏覽器二進位制檔案
     		System.setProperty("webdriver.firefox.bin", "D:\\應用\\FoxMail\\firefox.exe");
     		WebDriver dirver = new FirefoxDriver();
     		return dirver;
     	}
     }
    
  9. 高階使用者介面

     import org.openqa.selenium.By;
     import org.openqa.selenium.Keys;
     import org.openqa.selenium.WebDriver;
     import org.openqa.selenium.WebElement;
     import org.openqa.selenium.firefox.FirefoxDriver;
     import org.openqa.selenium.interactions.Actions;
     
     /**
      * 高階使用者介面
      * 
      * @author outman
      * @dete 2018-11-07
      */
     public class Demo_09 {
     	public static void main(String[] args) {
     		// 開啟瀏覽器
     		WebDriver dirver = openFirFox();
     		// 執行操作
     		doExecute(dirver);
     	}
     
     	/**
     	 * 執行操作
     	 */
     	private static void doExecute(WebDriver dirver) {
     		dirver.get("http://www.baidu.com");
     		Actions action = new Actions(dirver);
     		WebElement trnews = dirver.findElement(By.name("tj_trnews"));
     		WebElement trxueshu = dirver.findElement(By.name("tj_trxueshu"));
     		WebElement kw = dirver.findElement(By.id("kw"));
     		// perform() 方法為整個動作完成之後的提交操作
     		
     		// 移動滑鼠至某個dom元素   (選中頁面   新聞)
     //		action.moveToElement(trnews).perform();
     		// 滑鼠點選元素
     //		action.click(trnews).perform();
     		// 滑鼠點選並懸停
     //		action.clickAndHold(trnews).perform();
     		// 在指定元素上點選右鍵
     //		action.contextClick(trnews).perform();
     		// 在指定元素上雙擊
     //		action.doubleClick(trnews).perform();
     		// 點選並拖拽  (將資源拖到 指定元素 , 或指定位置)
     //		action.dragAndDrop(trnews , trxueshu).perform();
     //		action.dragAndDropBy(trnews, 100, 100).perform();;
     		// 鍵盤按下
     //		action.keyDown(Keys.ENTER).perform();
     		// 鍵盤按鍵擡起
     //		action.keyUp(Keys.ENTER).perform();
     		// 將游標移動至指定位置
     //		action.moveByOffset(100, 100).perform();
     		// 暫停指定的時間
     		for(int i = 0 ; i<10 ;i++) {
     			kw.sendKeys(i+"");
     			action.pause(1000).perform();
     		}
     		// 釋放滑鼠
     		action.release().perform();
     
     		
     	}
     
     	/**
     	 * 開啟火狐瀏覽器
     	 */
     	private static WebDriver openFirFox() {
     		// geckodriver 下載地址: https://github.com/mozilla/geckodriver
     		System.setProperty("webdriver.gecko.driver", "D:\\DevelopSoftware\\geckodriver-v0.23.0-win64\\geckodriver.exe");
     		// 讀取獲取瀏覽器二進位制檔案
     		System.setProperty("webdriver.firefox.bin", "D:\\應用\\FoxMail\\firefox.exe");
     		WebDriver dirver = new FirefoxDriver();
     		return dirver;
     	}
     
     }
    
  10. 操作等待

    import java.util.concurrent.TimeUnit;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.support.ui.ExpectedCondition;
    import org.openqa.selenium.support.ui.WebDriverWait;
    
    /**
     * 操作等待
     * @author outman
     * @date 2018-11-07
     * */
    public class Demo_10 {
    	public static void main(String[] args) {
    		// 開啟瀏覽器
    		WebDriver dirver = openFirFox();
    		// 執行操作
    		doExecute(dirver);
    	}
    	
    	/**
    	 * 執行操作
    	 * */
    	private static void doExecute(WebDriver driver) {
    		// 顯式等待
    		driver.get("http://www.baidu.com");
    		WebElement kw = driver.findElement(By.id("kw"));
    		kw.sendKeys("webDriver");
    		
    //		 顯式等待 針對單個元素   隱式等待針對整個頁面
    //		 最大超時時間是10秒
    //		 預設每隔500毫秒掃描一次  如果檢測到結果則返回
    		WebDriverWait wait = new WebDriverWait(driver, 10, 1);
    		//獲取第一條結果
    		WebElement resultOne = wait.until(new ExpectedCondition<WebElement>() {
    			public WebElement apply(WebDriver driver) {
    				return driver.findElement(By.id("1"));
    			}
    		}).findElement(By.tagName("h3")).findElement(By.tagName("a"));
    		
    		System.out.println(resultOne.getText());
    		resultOne.click();
    		
    		
    		
    		
    		
    		//隱式等待
    		//設定頁面載入時間最大為10秒
    //		driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
    //		driver.get("http://www.baidu.com");
    //		
    //		//定位物件設定10秒超時時間  , 10秒還定位不到則丟擲異常
    //		driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    //		WebElement kw = driver.findElement(By.id("kw"));
    //		
    //		//非同步指令碼執行超時時間設定為3秒 
    //		driver.manage().timeouts().setScriptTimeout(1, TimeUnit.SECONDS);
    		
    		
    		
    		
    	}
    	/**
    	 * 開啟火狐瀏覽器
    	 */
    	private static WebDriver openFirFox() {
    		// geckodriver 下載地址: https://github.com/mozilla/geckodriver
    		System.setProperty("webdriver.gecko.driver", "D:\\DevelopSoftware\\geckodriver-v0.23.0-win64\\geckodriver.exe");
    		// 讀取獲取瀏覽器二進位制檔案
    		System.setProperty("webdriver.firefox.bin", "D:\\應用\\FoxMail\\firefox.exe");
    		WebDriver dirver = new FirefoxDriver();
    		return dirver;
    	}
    }
    
  11. 執行js指令碼

    // 建立js 執行物件
    JavascriptExecutor jsExceut = (JavascriptExecutor) dirver;
    // 導航到百度
    dirver.get("http://www.baidu.com");
    
    // 建立多個視窗
    String js = "window.open(\"https://www.sogou.com\");";
    String js2 = "window.open(\"http://www.w3school.com.cn/xpath/xpath_syntax.asp\");";
    
    // 當只傳入js指令碼時 , 預設執行該js 的物件時瀏覽器
    jsExceut.executeScript(js);
    jsExceut.executeScript(js2);
    
  12. 同時啟動多個測試

    1. 主類

       import org.openqa.selenium.By;
       import org.openqa.selenium.WebDriver;
       import org.openqa.selenium.WebElement;
       import org.openqa.selenium.support.ui.ExpectedCondition;
       import org.openqa.selenium.support.ui.WebDriverWait;
       
       /**
        * 同時啟動多個瀏覽器執行測試
        */
       public class Demo_11 {
       	public static void main(String[] args) {
       
       		for (int i = 0; i < 5; i++) {
       			new Thread(new Runnable() {
       
       				public void run() {
       					new Demo_11FirFox().doExecute();
       				}
       			}).start();
       			new Thread(new Runnable() {
       
       				public void run() {
       					new Demo_11IE().doExecute();
       				}
       			}).start();
       			new Thread(new Runnable() {
       
       				public void run() {
       					new Demo_11Chrome().doExecute();
       				}
       			}).start();
       		}
       
       	}
       
       	public void doExecute(WebDriver driver) {
       		driver.get("http://www.baidu.com");
       		WebElement sbtn = driver.findElement(By.id("kw"));
       		sbtn.sendKeys("webDriver");
       		WebDriverWait wait = new WebDriverWait(driver, 10, 1);
       		WebElement resultOne = wait.until(new ExpectedCondition<WebElement>() {
       
       			public WebElement apply(WebDriver input) {
       
       				return input.findElement(By.id("1"));
       			}
       		}).findElement(By.tagName("h3")).findElement(By.tagName("a"));
       
       		// 點選第一條
       		resultOne.click();
       	}
       }
      
    2. 谷歌瀏覽器測試類

       import org.openqa.selenium.WebDriver;
       import org.openqa.selenium.chrome.ChromeDriver;
       
       
       public class Demo_11Chrome extends Demo_11 {
       	public  WebDriver driver = null;
       
       	public Demo_11Chrome() {
       		System.setProperty("webdriver.chrome.driver","D:\\DevelopSoftware\\chromedriver_win32\\chromedriver.exe");
       		driver = new ChromeDriver();
       		
       	}
       
       	public void doExecute() {
       		super.doExecute(driver);
       	}
       
       }
      
    3. 火狐瀏覽器測試類

       import org.openqa.selenium.WebDriver;
       import org.openqa.selenium.firefox.FirefoxDriver;
       
       public class Demo_11FirFox extends Demo_11 {
       	private WebDriver driver = null;
       
       	public Demo_11FirFox() {
       		System.setProperty("webdriver.gecko.driver", "D:\\DevelopSoftware\\geckodriver-v0.23.0-win64\\geckodriver.exe");
       		//讀取獲取瀏覽器二進位制檔案
       		System.setProperty("webdriver.firefox.bin", "D:\\應用\\FoxMail\\firefox.exe");
       		driver = new FirefoxDriver();
       		
       	}
       
       	public void doExecute() {
       		super.doExecute(driver);
       	}
       
       }
      
    4. IE瀏覽器測試類

       import org.openqa.selenium.WebDriver;
       import org.openqa.selenium.ie.InternetExplorerDriver;
       
       public class Demo_11IE extends Demo_11 {
       	private WebDriver driver = null;
       
       	public Demo_11IE() {
       		System.setProperty("webdriver.ie.driver",
       				"D:\\DevelopSoftware\\IEDriverServer_x64_3.141.0\\IEDriverServer.exe");
       		driver = new InternetExplorerDriver();
       		
       	}
       
       	public void doExecute() {
       		super.doExecute(driver);
       	}
       
       }