Selenium 分 1.0 与 2.0 两个版本,这在本书第一章中已经介绍了,简单区分一下这两个版本工作原理。

m Selenium 1 1 工作原理

Selenium1 中除了使用 Selenium-Core 以外,进行自动化测试时都需要使用 Selenium-RC 来作为代理

(不管是本机还是远程),目的是为了解决同源问题;而造成同源问题的原因是因为 Selenium1.0 中是使

用 JavaScript 来驱动测试执行的(浏览器由于安全问题不允许不同域之间的 JavaScript 调用,即非同源

不可调用;而 selenium1.0 中的工作方式就是在宿主页面注入 JavaScript 并且通过调用 JavaScript 来执

行测试操作的,所以就涉及到同源问题)。所以为了达成目的,其解决方案就有 2 种:

1、使用 Selenium-Core:

Selenium-Core 是一组 JavaScript 库,用来驱动浏览器操作的所有库文件都在这里,整个 selenium1

可以认为核心组件就是这个 Selenium-Core;而使用 Selenium-Core 的方式就是在被测试站点程序的源码

里把 Selenium-Core 中的所有 JavaScript 库直接添加到页面里,这样页面正常加载的同时也会把

Selenium-Core 加载下来,并且天生就是同源的。

2、使用 Selenium-RC:

RC 是一个 http 代理程序,用来注入到浏览器和被测 web 程序之间,这样浏览器所有的请求和接收的

内容都会通过 RC;RC 会把浏览器的请求发送给真实的 web 程序,而在接收到 web 程序的响应内容时,并没有把内容原原本本的返回给浏览器客户端,而是把包含 Selenium-Core 的内容注入到响应内容中去,然

后才发送响应内容给浏览器,这样就通过欺骗的方式让浏览器认为Selenium1.0 的驱动类库同样是同源的。

2 Selenium2 工作原理

Selenium2 中因为使用的 WebDriver,这个技术不是靠 js 驱动的,而是直接调用浏览器的原生态接口

驱动的。所以就没有同源问题,也就不需要使用 RC 来执行本地脚本了(当然缺点就是并不是所有的浏览

器都有提供很好的驱动支持,但 JavaScript 却是所有浏览器都通用的)。所以 Selenium2 中执行本地脚

本的方式是:通过本地 WebDriver 驱动直接调用本地浏览器接口就可以了。

Selenium 1(RC)代码

我们可以通过 Selenium IDE 将录制的脚本导出为“Python2/unittest/Remote Control”格式。通过

编辑器打开导出的脚本。

Selenium 1(RC)代码:

se_rc.py

#coding=utf-8

from selenium import selenium

import unittest, time, re

class serc(unittest.TestCase):

def setUp(self):

self.verificationErrors = []

self.selenium = selenium("localhost", 4444, "*chrome",

"http://www.baidu.com/")

self.selenium.start()

def test_serc(self):

sel = self.selenium

sel.open("/")

sel.type("id=kw", "selenium grid")

sel.click("id=su")

sel.wait_for_page_to_load("30000")

def tearDown(self):

self.selenium.stop()

self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":

unittest.main()

与 WebDrover 最大的不同是 RC 在执行指定代理的主机:

self.selenium = selenium("localhost", 4444, "*chrome", "http://www.baidu.com/")

localhost 表示本机;

4444 表示端口号;

*chrome 表示所运行的浏览器;

http://www.baidu.com 访问的 RUL 地址。

RC 的运行依赖于 Selenium Server;Selenium Server 是由 java 开发的一个 jar 包。所以,要想启动

Selenium Server 必须先安装 java 环境。

Selenium Server 环境配置

前面已经介绍 Selenium Grid2 已经集成到 Selenium Server 中,所以要想使用 Selenium Grid2 必须

启动 Selenium Server。下面我们就来配置 Selenium Server。

双击下载的 JDK ,设置安装路径。这里我们选择默认安装在 C:\Program Files\Java\jdk1.7.0_45\

目录下。

下面设置环境变量:

“我的电脑”右键菜单--->属性--->高级--->环境变量--->系统变量-新建..

变量名:JAVA_HOME

变量值:C:\Program Files\Java\jdk1.7.0_45\

变量名:CALSS_PATH

变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

找到 path 变量名—>“编辑”添加:

变量名:PATH

变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

在 Windows 命令提示符下验证 java 是否成功:

cmd.exe

……

C:\Users\fnngj>java

用法: java [-options] class [args...]

(执行类)

或 java [-options] -jar jarfile [args...]

(执行 jar 文件)

其中选项包括:

-d32 使用 32 位数据模型 (如果可用)

-d64 使用 64 位数据模型 (如果可用)

-server 选择 "server" VM

-hotspot 是 "server" VM 的同义词 [已过时]

默认 VM 是 server.

……

C:\Users\fnngj>javac

用法: javac <options> <source files>

其中, 可能的选项包括:

-g 生成所有调试信息

-g:none 不生成任何调试信息

-g:{lines,vars,source} 只生成某些调试信息

-nowarn 不生成任何警告

-verbose 输出有关编译器正在执行的操作的消息

-deprecation 输出使用已过时的 API 的源位置

-classpath <路径> 指定查找用户类文件和注释处理程序的位置

-cp <路径> 指定查找用户类文件和注释处理程序的位置

……

java 命令可以运行 class 文件字节码。

javac 命令可以将 java 源文件编译为 class 字节码文件

在页面的左侧列表中找到 selenium-server-standalone-XXX.jar 进行下载。下载完成可以放到任意

位置,直接在命令提示符下启动 Selenium Server:

C:\selenium> java -jar selenium-server-standalone-XXX.jar

执行 se_rc.py 脚本,Selenium Server 将会做为代理,执行客户端与服务器端的请求与返回信息。

cmd.exe

……

21:09:55.705 INFO - Checking Resource aliases

21:09:55.705 INFO - Command request: getNewBrowserSession[*chrome,

http://www.baidu.com/, ] on session null

21:09:55.705 INFO - creating new remote session

21:09:55.768 INFO - Allocated session b15d2335a6204d9b96a67996ff94b3ea for http:

//www.baidu.com/, launching...

jar:file:/C:/selenium/selenium-server-standalone-2.39.0.jar!/customProfileDi

rCUS

TFFCHROME

21:09:55.955 INFO - Preparing Firefox profile...

21:09:58.727 INFO - Launching Firefox...

21:10:05.439 INFO - Got result: OK,b15d2335a6204d9b96a67996ff94b3ea on session

b

15d2335a6204d9b96a67996ff94b3ea

21:10:05.439 INFO - Command request: open[/, True] on session b15d2335a6204d9b96

a67996ff94b3ea

21:10:08.098 INFO - Got result: OK on session b15d2335a6204d9b96a67996ff94b3ea

21:10:08.098 INFO - Command request: type[id=kw, selenium grid] on session b15d2

335a6204d9b96a67996ff94b3ea

21:10:08.113 INFO - Got result: OK on session b15d2335a6204d9b96a67996ff94b3ea

21:10:08.129 INFO - Command request: click[id=su, ] on session b15d2335a6204d9b9

6a67996ff94b3ea

21:10:08.145 INFO - Got result: OK on session b15d2335a6204d9b96a67996ff94b3ea

21:10:08.160 INFO - Command request: waitForPageToLoad[30000, ] on session b15d2

335a6204d9b96a67996ff94b3ea

21:10:08.489 INFO - Got result: OK on session b15d2335a6204d9b96a67996ff94b3ea

21:10:08.489 INFO - Command request: testComplete[, ] on session b15d2335a6204d9

b96a67996ff94b3ea

21:10:08.489 INFO - Killing Firefox...

21:10:08.738 INFO - Got result: OK on session b15d2335a6204d9b96a67996ff94b3ea

通过 Selenium Server 运行 Selenium RC ,这就是 Selenium 1 来做自动化的方式。