和我一塊兒學 Selenium WebDriver(1)——入門篇

    zTree 東西很少,我也一直使用着原始的人工測試手段,隨着內容的不斷增多,測試起來就愈加的繁雜,並且常常犯懶,這樣就會忽略不少本該發現的問題,並且也容易出現舊的bug 反覆出現的狀況,這都是測試不規範形成的。要作好東西就要更加規範和嚴格,因而乎決定要學習一下 Selenium WebDriver,也就是原先的  Selenium v2 了,這方面總體的文章並很少,因此一邊學着,本身一邊整理吧。

    對於這個能夠自動化測試的工具( Selenium WebDriver)我就不作過多描述了,去 google、baidu 搜索一下便可。 我這裏只記錄學習  Selenium WebDriver 的過程,尤爲是運行時可能出現的問題,固然了,我是作java的,我只學習 java 與  Selenium WebDriver 配合的方法。

1、下載文件

先要去官網(http://seleniumhq.org/download/)下載必需的文件:

  • Selenium IDE (專門用於 FireFox 測試的獨立界面,能夠錄製測試步驟,但我更傾向於寫代碼作標準的功能測試)
  • Selenium Server (能夠輸入指令控制、能夠解決跨域的 js 問題,等到後面學到了再講吧)
  • The Internet Explorer Driver Server (專門用於IE測試的)
  • Selenium Client Drivers (能夠找到你熟悉的語言,例如我選擇的 Java)
  • Third Party Browser Drivers NOT SUPPORTED/DEVELOPED by seleniumhq(第三方開發的 Selenium 插件,第一個就是 Chrome 的,不然你就沒辦法測試 Chrome 了)
  • 其餘的,就根據你本身的須要尋找吧,目前這些足夠我用了。

2、安裝 & 運行

貌似擺弄新東西時,只有 「Hello World」 蹦出來之後,咱們這些初學者纔會感到情緒穩定,那就趕忙開始吧。

對於初期打算直接用編程方式製做測試用例的狀況來講,Selenium IDE、Selenium Server 均可以不用安裝執行。
英語好的朋友能夠直接看官網的文檔(http://seleniumhq.org/documentation/)就可以開始使用了。
看中文的,就繼續聽我嘮叨:

【1. 創建 Maven 工程】
Selenium 支持 maven 工程,這會讓你的工做更加簡便。

用 Eclipse 建個 Maven 的工程,建成後,直接修改 pom.xml,(參考:http://seleniumhq.org/docs/03_webdriver.html#setting-up-a-selenium-webdriver-project html

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>Selenium2Test</groupId>
	<artifactId>Selenium2Test</artifactId>
	<version>1.0</version>
	<dependencies>
		<dependency>
			<groupId>org.seleniumhq.selenium</groupId>
			<artifactId>selenium-java</artifactId>
			<version>2.25.0</version>
		</dependency>
		<dependency>
			<groupId>com.opera</groupId>
			<artifactId>operadriver</artifactId>
		</dependency>
	</dependencies>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>com.opera</groupId>
				<artifactId>operadriver</artifactId>
				<version>0.16</version>
				<exclusions>
					<exclusion>
						<groupId>org.seleniumhq.selenium</groupId>
						<artifactId>selenium-remote-driver</artifactId>
					</exclusion>
				</exclusions>
			</dependency>
		</dependencies>
	</dependencyManagement>
</project>


pom.xml 修改保存後,eclipse 會自動把須要的 jar 包下載完成。 前端


【2. 測試 FireFox】
Selenium 最初就是在 FireFox 上作起來的插件,因此咱們先來搭建 FireFox 的環境。
確保你正確安裝了 FireFox 後,就能夠直接編寫 java 代碼測試嘍。

在 lesson1 目錄下創建 ExampleForFireFox.java
(由於國內很多朋友訪問 google 的時候會出問題,因此我就把代碼中的 google 變成 baidu 了)

package lesson1;

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;

public class ExampleForFireFox  {
    public static void main(String[] args) {
    	// 若是你的 FireFox 沒有安裝在默認目錄,那麼必須在程序中設置
//    	System.setProperty("webdriver.firefox.bin", "D:\\Program Files\\Mozilla Firefox\\firefox.exe");
    	// 建立一個 FireFox 的瀏覽器實例
        WebDriver driver = new FirefoxDriver();

        // 讓瀏覽器訪問 Baidu
        driver.get("http://www.baidu.com");
        // 用下面代碼也能夠實現
        // driver.navigate().to("http://www.baidu.com");

        // 獲取 網頁的 title
        System.out.println("1 Page title is: " + driver.getTitle());

        // 經過 id 找到 input 的 DOM
        WebElement element = driver.findElement(By.id("kw"));

        // 輸入關鍵字
        element.sendKeys("zTree");

        // 提交 input 所在的  form
        element.submit();
        
        // 經過判斷 title 內容等待搜索頁面加載完畢,Timeout 設置10秒
        (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                return d.getTitle().toLowerCase().endsWith("ztree");
            }
        });

        // 顯示搜索結果頁面的 title
        System.out.println("2 Page title is: " + driver.getTitle());
        
        //關閉瀏覽器
        driver.quit();
    }
}

普通狀況下,直接運行代碼就能夠看到會自動彈出 FireFox 窗口,訪問 baidu.com,而後輸入關鍵字並查詢,一切都是自動完成的。

錯誤提醒:
1)Exception in thread "main" org.openqa.selenium.WebDriverException: Cannot find firefox binary in PATH. Make sure firefox is installed.
出現這個錯誤,是說明你的 FireFox 文件並無安裝在默認目錄下,這時候須要在最開始執行:System.setProperty 設置環境變量  "webdriver.firefox.bin" 將本身機器上 FireFox 的正確路徑設置完畢後便可。

2)Exception in thread "main" org.openqa.selenium.UnsupportedCommandException: Bad request

出現這個錯誤,頗有意思。 查了一下 有人說應該是 hosts 出現了問題,加上一個 127.0.0.1  localhost 就好了,但個人 hosts 上確定有這個玩意,爲啥也會出現這個問題呢?  java

通過調試,發現 127.0.0.1 localhost 的設置必需要在 hosts 文件的最開始,並且若是後面有其餘設置後,也不要再出現一樣的 127.0.0.1 localhost ,只要有就會出錯。(由於我爲了方便訪問 google 的網站,專門加入了 smarthosts 的內容,致使了 localhost 的重複) web

【3. 測試 Chrome】
Chrome 雖然不是 Selenium 的原配,可是沒辦法,她太火辣了,絕對不能拋下她無論的。
把 ExampleForFireFox.java 稍微修改就能夠製做出一個 ExampleForChrome.java ,直接把 new FireFoxDriver() 修改成 new ChromeDriver() 你會發現仍是行不通。

錯誤以下:
1)Exception in thread "main" java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.chrome.driver system property; for more information, see http://code.google.com/p/selenium/wiki/ChromeDriver. The latest version can be downloaded from http://code.google.com/p/chromedriver/downloads/list
這應該是找不到 chrome 的文件,好吧,利用 System.setProperty 方法添加路徑,這裏要注意,是 「webdriver.chrome.driver」 可不是「webdriver.chrome.bin

設置路徑後仍是會報錯:
2)[6416:4580:1204/173852:ERROR:gpu_info_collector_win.cc(91)] Can't retrieve a valid WinSAT assessment.
這個貌似是由於 Selenium 沒法直接啓動 Chrome 致使的,必需要經過前面我們下載 Chrome 的第三方插件 ChromeDriver,去看第一個錯誤中提示給你的 網址:http://code.google.com/p/selenium/wiki/ChromeDriver
按照人家給的例子來修改咱們的測試代碼吧:

package lesson1;

import java.io.File;
import java.io.IOException;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ExampleForChrome {
	public static void main(String[] args) throws IOException {
		// 設置 chrome 的路徑
		System.setProperty(
				"webdriver.chrome.driver",
				"C:\\Documents and Settings\\sq\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chrome.exe");
		// 建立一個 ChromeDriver 的接口,用於鏈接 Chrome
		@SuppressWarnings("deprecation")
		ChromeDriverService service = new ChromeDriverService.Builder()
				.usingChromeDriverExecutable(
						new File(
								"E:\\Selenium WebDriver\\chromedriver_win_23.0.1240.0\\chromedriver.exe"))
				.usingAnyFreePort().build();
		service.start();
		// 建立一個 Chrome 的瀏覽器實例
		WebDriver driver = new RemoteWebDriver(service.getUrl(),
				DesiredCapabilities.chrome());

		// 讓瀏覽器訪問 Baidu
		driver.get("http://www.baidu.com");
		// 用下面代碼也能夠實現
		// driver.navigate().to("http://www.baidu.com");

		// 獲取 網頁的 title
		System.out.println("1 Page title is: " + driver.getTitle());

		// 經過 id 找到 input 的 DOM
		WebElement element = driver.findElement(By.id("kw"));

		// 輸入關鍵字
		element.sendKeys("zTree");

		// 提交 input 所在的 form
		element.submit();

		// 經過判斷 title 內容等待搜索頁面加載完畢,Timeout 設置10秒
		(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
			public Boolean apply(WebDriver d) {
				return d.getTitle().toLowerCase().endsWith("ztree");
			}
		});

		// 顯示搜索結果頁面的 title
		System.out.println("2 Page title is: " + driver.getTitle());

		// 關閉瀏覽器
		driver.quit();
		// 關閉 ChromeDriver 接口
		service.stop();

	}
}

運行一下看看,是否是一切OK了?

【2012.12.06補充】 chrome

上一個 Demo 中沒法正常使用 new ChromeDriver(),今天在作進一步學習時看到一篇文章(http://qa.blog.163.com/blog/static/19014700220122231779/),恍然大悟,原來只須要把 ‘webdriver.chrome.driver’ 的值設置爲 chromedriver 的路徑就能夠了。 apache

package lesson1;

import java.io.IOException;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ExampleForChrome2 {
	public static void main(String[] args) throws IOException {
		// 設置 chrome 的路徑
		System.setProperty(
				"webdriver.chrome.driver",
				"E:\\Selenium WebDriver\\chromedriver_win_23.0.1240.0\\chromedriver.exe");
		// 建立一個 ChromeDriver 的接口,用於鏈接 Chrome
		// 建立一個 Chrome 的瀏覽器實例
		WebDriver driver = new ChromeDriver();

		// 讓瀏覽器訪問 Baidu
		driver.get("http://www.baidu.com");
		// 用下面代碼也能夠實現
		// driver.navigate().to("http://www.baidu.com");

		// 獲取 網頁的 title
		System.out.println("1 Page title is: " + driver.getTitle());

		// 經過 id 找到 input 的 DOM
		WebElement element = driver.findElement(By.id("kw"));

		// 輸入關鍵字
		element.sendKeys("zTree");

		// 提交 input 所在的 form
		element.submit();

		// 經過判斷 title 內容等待搜索頁面加載完畢,Timeout 設置10秒
		(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
			public Boolean apply(WebDriver d) {
				return d.getTitle().toLowerCase().endsWith("ztree");
			}
		});

		// 顯示搜索結果頁面的 title
		System.out.println("2 Page title is: " + driver.getTitle());

		// 關閉瀏覽器
		driver.quit();

		// element = driver.findElement(By.id("kw"));
		// // element.clear();
		// element.click();
		// element.clear();
		// element.sendKeys("zTree");
		// element.submit();
	}
}

【4. 測試 IE】
想逃避 IE 嗎?? 做爲前端開發,IE 你是必需要面對的,衝吧!
其實你會發現, Selenium 主要也就是針對 FireFox 和 IE 來製做的,因此把 FireFox 的代碼修改成 IE 的,那是至關的容易,只須要簡單地兩步:
1)把 ExampleForFireFox.java 另存爲 ExampleForIE.java 
2)把 WebDriver driver = new FirefoxDriver(); 修改成 WebDriver driver = new InternetExplorerDriver();
3)通常你們的 IE都是默認路徑吧,因此也就不用設置 property 了

package lesson1;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ExampleForIE {
	public static void main(String[] args) {
		// 若是你的 FireFox 沒有安裝在默認目錄,那麼必須在程序中設置
		// System.setProperty("webdriver.firefox.bin", "D:\\Program Files\\Mozilla Firefox\\firefox.exe");
		// 建立一個 FireFox 的瀏覽器實例
		WebDriver driver = new InternetExplorerDriver();

		// 讓瀏覽器訪問 Baidu
		driver.get("http://www.baidu.com");
		// 用下面代碼也能夠實現
		// driver.navigate().to("http://www.baidu.com");

		// 獲取 網頁的 title
		System.out.println("1 Page title is: " + driver.getTitle());

		// 經過 id 找到 input 的 DOM
		WebElement element = driver.findElement(By.id("kw"));

		// 輸入關鍵字
		element.sendKeys("zTree");

		// 提交 input 所在的 form
		element.submit();

		// 經過判斷 title 內容等待搜索頁面加載完畢,Timeout 設置10秒
		(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
			public Boolean apply(WebDriver d) {
				return d.getTitle().toLowerCase().endsWith("ztree");
			}
		});

		// 顯示搜索結果頁面的 title
		System.out.println("2 Page title is: " + driver.getTitle());

		// 關閉瀏覽器
		driver.quit();
	}
}

運行一下,是否是 so easy?

入門工做完成,如今徹底能夠利用 java 代碼,讓 Selenium 自動執行咱們設置好的測試用例了,不過.....這僅僅是個開始。
相關文章
相關標籤/搜索