1. Selenium基础


1.1 Selenium简介

Selenium是一系列基于Web的自动化测试工具,它提供了一系列测试函数,用于支持Web自动化测试,它们能够通过多种方式定位界面元素,并将预期结果与系统实际表现进行比较。Selenium具有以下几个特性:

1) 可对多浏览器进行测试,如IE、Firefox、Safari、Chrome、手机浏览器等。

2) 支持多种语言,如Java、C#、Python、Ruby、PHP等。

3) 跨平台,如Windows、Linux、IOS、Android等。

4) 开源免费。


1.2 Selenium工具组

Selenium由以下几个工具组成:

1) Selenium IDE

Selenium IDE是一个用于构建脚本的初级工具,它是一个Firefox插件,拥有一个易于使用的界面,拥有录制功能记录用户操作并导出为可重复使用的脚本。

2) Selenium 1

Selenium 1(Selenium RC)是Selenium最主要的测试工具之一,它能够通过多种语言编写测试代码,同时能支持几乎所有浏览器的测试。

3) Selenium 2

Selenium 2(WebDriver)作为最新版的工具,代表未来Selenium的发展方向,这套全新的自动化测试工具提供了许多功能,包括一套组织性更好、面向对象的API,并克服了在Selenium 1版本中测试的局限性。

4) Selenium Grid

Selenium Grid能够让Selenium 1的测试在多个不同的环境中运行,也能让测试并行执行。也就是说,各个测试能够在同一时间、不同机器上运行。


2. Selenium IDE


2.1 安装IDE

Selenium IDE可以从http://seleniumhq.org/download/下载,如果当前使用的浏览器是Firefox,Firefox会自动将其识别为Firefox附加组件下载,下载结束后,提示安装组件,如下所示:

wKiom1UIFYjxSJllAAHk_iWMw3g983.jpg

安装结束后,重启浏览器,就可以在菜单中看到Selenium IDE项。


2.2 录制测试用例

打开Selenium IDE,默认开启录制,可以单击红色圆形按钮取消录制,如下所示:

wKiom1UOp9myUwZDAAGx6RMlGGo099.jpg

新建用例需要用到“文件”菜单 ,菜单中出现最多的是Test Case和Test Suite。通常,一组相关的Test Case就是一个Test Suite,即一个测试套件由多个测试用例串连组成。在打开Selenium IDE时,IDE已经默认建立了一个名为"Untitled"的测试套件。

以录制百度搜索的动作为例,首先在Base URL中输入百度的地址,然后单击录制按钮,接着在Firefox中打开百度主页,输入搜索关键字"selenium",单击“百度一下”,返回Selenium IDE并停止录制,可以看到Test Suite中测试步骤表格中添加了几行新数据,如下所示:

wKiom1UOqT-yE3mfAAJfCpC1kZo415.jpg

测试步骤表格使用的关键字驱动的测试方式,包含以下3栏:

1) Command: 表示要执行的操作是什么。

2) Target: 表示要操作的界面元素是哪个。

3) Value: 表示操作时使用的值是多少。

在上图中,第一行对目标"/"使用Open命令以打开网页,第二行找到id为kw的元素,然后使用Type命令输入内容,输入的值为selenium,第三行找到id为su的元素,然后执行clickAndWait命令,先执行单击,然后等待页面加载完毕。只需单击操作栏中的播放按钮即可重复执行该测试,使用Fast-Slow滑动条可以控制测试中每个步骤执行的时间间隔。


2.3 编写测试用例

了解了录制的原理后,可以直接通过编写测试步骤表格的方式来编写用例,现在使用Google测试。

在操作步骤表上单击鼠标右键,选择Insert New Command选项,接着进行编辑操作,输入open命令,将Target设置为"http://www.google.com.hk"。接着插入新行,在Command文本框中输入type,在Target文本框中输入id=lst-ib,输入的值为selenium。再插入第3个步骤,编辑click命令,让其单击搜索按钮,如下所示:

wKiom1UOrHfTHikyAAKCD0i7y5U449.jpg


3. Command


3.1 命令集

Command表示要执行的操作是什么,是必需的参数,单击Command下拉列表框,可以看到所有的命令。这些Selenium命令通常称为"selenese",它是一套用于执行测试的命令集,这些命令组合起来就构成了测试脚本。

在selenese中,一部分命令基于HTML标记,用于测试UI元素是否存在、验证指定内容是否正确、检查链接是否可用,并可以输入字段、选择列表的选项、提交表单并操作表格中的数据。而另一部分Selenium命令用于辅助测试,例如验证窗口大小、鼠标位置、警告信息、Ajax功能、弹出窗口、事件处理以及其他各种Web应用程序功能,如下所示:

wKiom1URWOyQS2XFAAIfKMQ_2Qg640.jpg

Selenium命令可以分为3类:Action(操作)、Accessor(存储)以及Assertion(断言)。Action命令一般用于操作应用程序的状态。Accessor命令用于检查应用程序的状态,并将结果存储在变量中。Assertion命令类似Accessor命令,但它们会验证应用程序的状态,并确认这些状态符合预期结果。


3.2 浏览器操作

Action命令一般用于操作应用程序,它们的作用就是执行操作,例如“单击”、“选择”、“输入”等。Action命令运行失败或出现错误,将会使测试中断执行。有些带"...AndWait"后缀的命令,相当于在原命令后面加了一个“waitForPageToLoad”命令,即在某个操作执行后,等待页面刷新完毕,也可以用原命令加上"waitForPageToLoad"的方式。

1) open(url): 打开指定的URL,可以为相对URL或绝对URL。open命令将等待页面加载完毕再执行下一个命令。在IDE中使用open时,如果参数Target为空,将打开BaseURL中的填写的页面,当Target不为空时,将打开BaseURL+Target页面,当Target以http://开头时,将忽略BaseURL,直接打开Target中的网址。

2) goBack(): 该命令相当于单击浏览器上的后退按钮,由于没有参数,Target和Value可以不填。

3) refresh(): 该命令相当于单击浏览器上的刷新按钮,由于没有参数,Target和Value可以不填。

4) windowFocus(): 该命令用于激活当前选中的浏览器窗口,由于没有参数,Target和Value可以不填。

5) windowMaximize(): 该命令用于将当前选中的浏览器窗口最大化,由于没有参数,Target和Value可以不填。

6) close(): 该命令用于关闭当前选中的浏览器窗口,由于没有参数,Target和Value可以不填。


3.3 基本操作

1) type(locator, value) : 该命令用于在input类型的元素中输入值,就像是在用键盘输入。它也可以用于给下拉列表框、复选框赋值。

2) typeKeys(locator, value) : 该命令用于模拟键盘敲击事件,逐个输入字符。相当于调用了keyDown、keyUp、keyPress等事件。

3) click(locator) :  单击链接、复选框或单选框。

4) clickAt(locator, coordString) : 与click命令类似,但需要填写相对坐标。

5) doubleClick(locator) :  双击链接、复选框或单选框。

6) doubleClickAt(locator, coordString) : 与doubleClick类似,区别在于需要填写相对坐标。

7) select(selectLocator, optionLocator) : 该命令用于在下拉列表框中选择指定选项。选项的定位方式和下拉框的定位方式有所不同,"label="基于选项的文本进行匹配,"value="基于选项的真实值进行匹配,"id="基于选项的id进行匹配,"index="基于选项的索引进行匹配。如果没有带前缀,默认以label方式匹配。

8) check(locator) : 勾选复选框或单选框,注意check命令不会触发单击动作。

9) uncheck(locator) : 与check命令的功能相反,其作用为取消勾选。

10) focus(locator) : 将焦点转移到指定的元素上。

除了以上操作,Selenium IDE还提供了一些用于模拟键盘鼠标操作的命令,如下所示:

名称
作用
altKeyDown()摸拟按下Alt键不放,直到调用altKeyUp命令
altKeyUp()松开Alt键
controlKeyDown()模拟按下Ctrl键不放,直到调用controlKeyUp命令
controlKeyUp()
松开Ctrl键
shiftKeyDown()模拟按下Shift键不放,直到调用shiftKeyUp命令
shiftKeyUp()松开Shift键
keyDown(locator, keySequence)模拟按下某个键不放,直到执行keyUp命令
keyPress(locator, keySequence)模拟用户敲击了某个按键
keyUp(locator, KeySequence)模拟松开某个键
mouseDown(locator)模拟用户在指定元素上按下鼠标左键不放
mouseDownAt(locator, coordString)和mouseDown类似,需要填写坐标
mouseDownRight(locator)模拟用户在指定元素上按下鼠标右键不放
mouseDownRightAt(locator, coordString)和mouseDownRight类似,需要填写坐标
mouseUp(locator)松开按下的鼠标左键
mouseUpAt(locator, coordString)和mouseUp类似,需要填写坐标
mouseUpRight(locator)松开按下的鼠标右键
mouseUpRightAt(locator, coordString)和mouseUpRight类似,需要填写坐标
mouseOver(locator)将鼠标光标移动到指定元素内
mouseOut(locator)将鼠标光标移动到指定元素外


3.4 设置和控制类操作

1) setTimeout(timeout) : 指定Selenium在执行某一操作时的最大等待时间,仅适用于open命令、以waitFor开头的命令以及带有AndWait后缀的命令。默认超时时间是30秒,如果测试超过30秒,那么将抛出错误。

2) setSpeed(value) : 设置测试的执行速度,即各个测试步骤之间执行的时间间隔。默认是没有间隔的,间隔时间为0秒。

3) pause(waitTime) : 使测试在指定时间内暂停执行。

4) break() : 暂停正在执行的测试,直到用户手动单击继续按钮。

5) captureEntirePageScreenshot(filename, kwargs) : 将当前窗口进行截图并保存为PNG文件。

6) highlight(locator) : 暂时将指定元素的背景色改为***,并在稍后取消该效果。

7) echo(message) : 将指定信息打印出来,一般用于调试。


3.5 Accessor

Accessor命令用于检查应用程序的状态,并将结果存储在变量中。Accessor命令可用于自动生成Assertion命令,其中变量的值可以用"${name}"来读取。

1) store(expression, variableName) : 这是最基本的存储方式,将指定的值存储在变量中。

2) storeTitle(variableName) : 用于存放当前网页的标题。

3) storeLocation(variableName) : 用于存储当前网页的URL。

4) storeValue(locator, variableName) : 用于存储input元素所存放的值,例如文本框、复选框、单选框中的值。对于复选框或单选框,存放的值会变成"on"或"off"。

5) storeEditable(locator, variableName) : 用于存储input元素的可编辑状态,例如文本框、复选框、单选框的可编辑状态,如果可以编辑,则返回true,否则返回false。

6) storeText(Locator, variableName) : 用于存储某个元素的文本值,例如链接,纯文本等。

7) storeChecked(locator, variableName) : 存储复选框或单选框的勾选情况,返回值为true或false。

8) storeSelectedIndex(selectLocator, variableName) : 获取所选项在例 表中的索引(从0开始)。

9) storeSelectedLabel(selectLocator, variableName) : 获取指定列表中所选项的文本值。

10) storeSelectedValue(selectLocator, variableName) : 获取指定列表中所选项的真实值。

11) storeSelectOptions(selectLocator, variableName) : 获取指定列表中所有选项的文本,以逗号分隔。

12) storeTable(tableCellAddress, variableName) : 获取表格中某个单元格的值,行号和列号都从0开始。

13) storeAttribute(attributeLocator, variableName) : 获取指定属性的值,注意Target应填写属性的定位表达式。

14) storeTextPresent(pattren, variableName) : 验证指定的文本是否在页面中出现,如果是则返回true,否则返回false。

15) storeElementPresent(locator, variableName) : 验证指定元素是否存在于页面中,如果是则返回true,否则返回false。

16) storeVisible(locator, variableName) : 验证指定元素是否存在于页面中,特别是visibility属性为hidden或display属性为none的不可见元素。

17) storeSpeed(variableName) : 获取执行速度,该命令将获取个测试步骤之间的执行间隔时间。


3.6 Assertion

Assertion命令与Accessor命令类似,但它们主要用于验证某个命题是否为真,例如“某元素是否存在”。所有的Assertion命令都可以通过3种模式使用:assert、verify和waitFor,例如assertText、verifyText和waitForText。如果assert失败,测试会中断,而verify失败时,失败将记录下来,但测试依然会继续执行,建议用单个assert来确认当前应用程序是否位于正确的页面,然后使用一系列verify命令来测试表单字段的值、标签值等。waitFor命令用于执行等待,直到等待的条件为真,但如果等待时间超过当前的超时时间设置,等待的条件仍然为假,那么测试就会失败并终止。

1) assertTitle(pattern) / assertNotTitle(pattern) / verifyTitle(pattern) / verifyNotTitle(pattern) / waitForTitle(pattern) / waitForNotTitle(pattern) : 验证网页的标题是否等于或不等于预期值。

2) assertLocation(pattern) / assertNotLocation(pattern) / verifyLocation(pattern) / verifyNotLocation(pattern) / waitForLocation(pattern) / waitForNotLocation(pattern) : 验证网页的URL是否等于或不等于预期值。

3) assertValue(locator, pattern) / assertNotValue(locator, pattern) / verifyValue(locator, pattern) / verifyNotValue(locator, pattern) / waitForValue(locator, pattern) / waitForNotValue(locator, pattern) : 验证input元素的值是否等于或不等于预期值。

4) assertEditable(locator) / assertNotEditable(locator) / verifyEditable(locator) / verifyNotEditable(locator) / waitForEditable(locator) / waitForNotEditable(locator) : 验证input元素的可编辑状态是否为预期状态。

5) assertText(locator, pattern) / assertNotTitle(locator, pattern) / verifyTitle(locator, pattern) / verifyNotTitle(locator, pattern) / waitForTitle(locator, pattern) / waitForNotTitle(locator, pattern) : 验证网页的标题是否等于或不等于预期值。

6) assertChecked(locator) / assertNotChecked(locator) / verifyChecked(locator) / verifyNotChecked(locator) / waitForChecked(locator) / waitForNotChecked(locator) : 验证复选框或单选框的勾选情况是否符合预期。

7) assertSelectedIndex(selectLocator, pattern) / assertNotSelectedIndex(selectLocator, pattern) / verifySelectedIndex(selectLocator, pattern) / verifyNotSelectedIndex(selectLocator, pattern) / waitForSelectedIndex(selectLocator, pattern) / waitForNotSelectedIndex(selectLocator, pattern) : 验证所选项在列表中的索引是否符合预期值。

8) assertSelectedLabel(selectLocator, pattern) / assertNotSelectedLabel(selectLocator, pattern) / verifySelectedLabel(selectLocator, pattern) / verifyNotSelectedLabel(selectLocator, pattern) / waitForSelectedLabel(selectLocator, pattern) / waitForNotSelectedLabel(selectLocator, pattern) : 验证指定列表中所选项的文本值是否符合预期值。

9) assertSelectedValue(selectorLocator, pattern) / assertNotSelectedValue(selectorLocator, pattern) / verifySelectedValue(selectorLocator, pattern) / verifyNotSelectedValue(selectorLocator, pattern) / waitForSelectedValue(selectorLocator, pattern) / waitForNotSelectedValue(selectorLocator, pattern) : 验证指定列表中所选项的真实值是否符合预期值。

10) assertSelectOptions(selectLocator, pattern) / assertNotSelectOptions(selectLocator, pattern) / verifySelectOptions(selectLocator, pattern) / verifyNotSelectOptions(selectLocator, pattern) / waitForSelectOptions(selectLocator, pattern) / waitForNotSelectOptions(selectLocator, pattern) : 验证指定列表中所有选项的文本是否符合预期值。

11) assertTable(tableCellAddress, pattern) / assertNotTable(tableCellAddress, pattern) / verifyTable(tableCellAddress, pattern) / verifyNotTable(tableCellAddress, pattern) / waitForTable(tableCellAddress, pattern) / waitForNotTable(tableCellAddress, pattern) : 验证表格中某个单元格的值是否符合预期值。

12) assertAttribute(attributeLocator, pattern) / assertNotAttribute(attributeLocator, pattern) / verifyAttribute(attributeLocator, pattern) / verifyNotAttribute(attributeLocator, pattern) / waitForAttribute(attributeLocator, pattern) / waitForNotAttribute(attributeLocator, pattern) : 验证指定属性的值是否符合预期值。

13) assertTextPresent(pattern) / assertNotTextPresent(pattern) / verifyTextPresent(pattern) / verifyNotTextPresent(pattern) / waitForTextPresent(pattern) / waitForNotTextPresent(pattern) : 验证指定的文本是否在页面中出现。

14) assertElementPresent(locator) / assertNotElementPresent(locator) / verifyElementPresent(locator) / verifyNotElementPresent(locator) / waitForElementPresent(locator) / waitForNotElementPresent(locator) : 验证指定元素是否存在于页面上。

15) assertVisible(locator) / assertNotVisible(locator) / verifyVisible(locator) / verifyNotVisible(locator) / waitForVisible(locator) / waitForNotVisible(locator) : 验证页面中是否显示指定元素。


4. Target和Value


4.1 identifier定位

对大多数Command来说,Target是必需的,主要用于识别Web页面的元素,其格式为“定位类型=定位值”。许多情况下,定位类型可以省略,而根据使用情景的不同,定位类型也有所不同。

identifier是一种最常用的元素定位方式,如果没有定位类型,那么它将是默认方式。如果使用这种定位方式,IDE会首先寻找首个id属性等于定位值的页面元素,如果没有找到,就会寻找首个name属性等于定位值的页面元素,如果再没有找到,定位就会失败。


4.2 id和name定位

id和name定位比identifier定位方式更精细,更具体。如果已经知道某个元素的id或name,就可以使用这种方式。如果有多个元素的name属性相同,那么可以使用过滤器来进一步细化定位,默认的过滤器类型是value(也就是value属性),比如"name=username value=admin"。


4.3 XPath定位

XPath表达式用于在XML文档中定位节点,而HTML可以看做XML的一种实现。XPath定位比之前使用id或name属性定位方式要丰富,但是更加依赖元素在页面中的位置。


4.4 链接文字定位

通过链接文字定位,只需简单提供链接文本就可以定位到对应的链接,如果有多个链接的文本相同,则会匹配第一个链接,比如"link=Click"。


4.5 DOM定位

DOM用于描述HTML文档,可以通过JavaScript进行访问。该定位方式需要JavaScript来计算出元素在页面上的位置,通过分级符号"."可以轻松定位元素,比如"dom=document.getElementById('username')"。


4.6 CSS定位

CSS是一种描述HTML和XML文档显示方式的语言。CSS使用选择器来为文档中的元素绑定样式属性,这些选择器也可以用在Selenium中,作为一种额外的定位方式,比如"css=#loginForm input:username"。


4.7 隐式定位

在遇到以下情况时,Target表达式中可以省略“定位类型=”的部分。

1) Target表达式没有指定明确定位方式时,将默认使用identifier定位。

2) 如果Target表达式以"//"开头,则会使用XPath定位。

3) 如果Target表达式以"document"开头,则会使用DOM定位。


4.8 带变量的字符串

Value除了纯文本以外,还可以是带变量的字符串或带JavaScript的字符串。比如Value值由两个变量组成:firstName和lastName,那么可以使用"Full name is: $(firstName) $(lastName)"。


4.9 带JavaScript的字符串

同上例,如果Value值仍然由firstName和lastName组成,并且需要把变量转换为大写,那么可以使用"javascript{Full name is: " + storedVars["firstName"].toUpperCase() + " " + storedVars["lastName"].toUpperCase()}


5. 日志和导出 


5.1 日志

在Selenium IDE界面上,还有一个包括Log、Reference、UI-Element、Rollup选项的对话框,如下所示:

wKiom1Ufq06zUsanAAA5N6nofkY303.jpg

其中最常用的是日志和引用选项卡,日志选项卡用于显示执行测试时的信息,这些信息对调试将有帮助,单击Info按钮可以对日志进行过滤,而单击Clear按钮将清楚所有的日志。引用选项卡用于显示当前所用命令的帮助文档,例如在测试步骤选项卡中选择type这个步骤,如下所示:

wKiom1UfrBTDfWfbAADYTmfsC5s669.jpg


5.2 命令导出

在测试步骤列表中,可以对某个命令进行复制,默认是复制为HTML源码,但也可以进行设置,将其复制为其他类型的源码,以便编码时进行参考。只需在菜单中选择"Options->ClipBoardFormat",然后选择对应语言和Selenium版本即可,如下所示:

wKiom1UfrQ3jkbGJAANsgAJHfrU443.jpg

还可以将整个测试用例导出为其他代码,只需在菜单中选择"文件->ExportTest Case As"或"文件->Export Test Suite As",然后选择对应的语言及Selenium版本即可,如下所示:

wKiom1UfrgmAgFi2AANWW-1JVqM443.jpg