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附加组件下载,下载结束后,提示安装组件,如下所示:
安装结束后,重启浏览器,就可以在菜单中看到Selenium IDE项。
2.2 录制测试用例
打开Selenium IDE,默认开启录制,可以单击红色圆形按钮取消录制,如下所示:
新建用例需要用到“文件”菜单 ,菜单中出现最多的是Test Case和Test Suite。通常,一组相关的Test Case就是一个Test Suite,即一个测试套件由多个测试用例串连组成。在打开Selenium IDE时,IDE已经默认建立了一个名为"Untitled"的测试套件。
以录制百度搜索的动作为例,首先在Base URL中输入百度的地址,然后单击录制按钮,接着在Firefox中打开百度主页,输入搜索关键字"selenium",单击“百度一下”,返回Selenium IDE并停止录制,可以看到Test Suite中测试步骤表格中添加了几行新数据,如下所示:
测试步骤表格使用的关键字驱动的测试方式,包含以下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命令,让其单击搜索按钮,如下所示:
3. Command
3.1 命令集
Command表示要执行的操作是什么,是必需的参数,单击Command下拉列表框,可以看到所有的命令。这些Selenium命令通常称为"selenese",它是一套用于执行测试的命令集,这些命令组合起来就构成了测试脚本。
在selenese中,一部分命令基于HTML标记,用于测试UI元素是否存在、验证指定内容是否正确、检查链接是否可用,并可以输入字段、选择列表的选项、提交表单并操作表格中的数据。而另一部分Selenium命令用于辅助测试,例如验证窗口大小、鼠标位置、警告信息、Ajax功能、弹出窗口、事件处理以及其他各种Web应用程序功能,如下所示:
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选项的对话框,如下所示:
其中最常用的是日志和引用选项卡,日志选项卡用于显示执行测试时的信息,这些信息对调试将有帮助,单击Info按钮可以对日志进行过滤,而单击Clear按钮将清楚所有的日志。引用选项卡用于显示当前所用命令的帮助文档,例如在测试步骤选项卡中选择type这个步骤,如下所示:
5.2 命令导出
在测试步骤列表中,可以对某个命令进行复制,默认是复制为HTML源码,但也可以进行设置,将其复制为其他类型的源码,以便编码时进行参考。只需在菜单中选择"Options->ClipBoardFormat",然后选择对应语言和Selenium版本即可,如下所示:
还可以将整个测试用例导出为其他代码,只需在菜单中选择"文件->ExportTest Case As"或"文件->Export Test Suite As",然后选择对应的语言及Selenium版本即可,如下所示: