和我一块儿学 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 自动执行咱们设置好的测试用例了,不过.....这仅仅是个开始。
相关文章
相关标签/搜索