-
本文将总结
Selenium
WebDriver
中的一些鼠标和键盘事件的使用,以及组合键的使用,
并且将介绍
WebDriver
中没有实现的键盘事件(
Keys
枚
举中没有列举的按键)的扩展。
举例说明扩展
Alt+PrtSc
组合键来截取当前活动窗口并将剪切板图像保存到文件。
在使用
Selenium
WebDriver
做自动化测试的时候,会经常模拟鼠标和键盘的一些行为。
比如使用鼠标单击、双击、右击、拖拽等动作;或者键盘输入、快捷键使用、组合键使用等
p>
模拟键盘的操作。在
WebDeriver
中,有一个专门的类来负责实现这些测试场景,那就是
Actions
类,在使用该类的过程中会配合使用到
Keys
枚举以及
Mouse
、
Keyboard
、
CompositeAction
等类。
其次,在实际测试过程中,可能会遇到某些按键没办法使用
Actions
、
Keys
等类来实现的
情况。
比如通过使用
Alt+PrtSc
组合键来实现截取屏幕当前活动窗口的图像,
在
Keys
枚
举中,因为没有枚举出
PrtSc
键,所以没办法通过
Action
的
KeyDown(Keys)
来模拟按
下这个动作。
再次是在自动化测试中,
可能会遇到一些附件、文件上传的场景,
或者是多文件上传,
这些
在
Selenium2.0
之后,可以直接使用
WebElement
类的
sendKeys()
方法来实现。
下面就分别介绍这些情况的具体使用。
鼠标点击操作
鼠标点击事件有以下几种类型:
清单
1.
鼠标左键点击
Actions
action = new Actions(driver);();//
鼠标左键在当前停留的位置做
单击操作
(ement((element)))//
鼠标左键点击指定的元素
清单
2.
鼠标右键点击
Actions
action = new Actions(driver);
tClick();//
鼠标右键在当前停留的位置做单击操作
tClick(ement((element)))//
鼠标右键点击指定的元
素
清单
3.
鼠标双击操作
Actions
action = new Actions(driver);
Click();//
鼠标在当前停留的位置做双击操作
Click(ement((element)))//
鼠标双击指定的元素
清单
4.
鼠标拖拽动作
Actions
action = new Actions(driver);
//
鼠标拖拽动作,将
source
元素拖放到
target
元素的位置。
dDrop(source,target);
//
鼠标拖拽动作,将
source
元素拖放到
(xOffset, yOffset)
位置,其中
xOffset
为横坐标,
yOffset
为纵坐标。
dDrop(source,xOffset,yOffset);
< br>在这个拖拽的过程中,已经使用到了鼠标的组合动作,首先是鼠标点击并按住
(click-and-hold) source
元素,然后执行鼠标移动动作
(mouse move)
,移动到
target
元
素位置或者是
(xOffset, yOffset)
位置,再执行鼠标的释放动作
(mouse release)
。所以上
面的方法也可以拆分成以下的几个执行动作来完成:
nd
Hold(source).moveToElement(target).perform();
e();
清单
5.
鼠标悬停操作
Actions action = new Actions(driver);
ndHold();//
鼠标悬停在当前位置,既点击并且不释放
ndHold(onElement);//
鼠标悬停在
onElement
元素的位置
ndHold(onElement)
这个方法实际上是执行
了两个动作,
首先是鼠标移动到元
素
onElement
,然后再
clickAndHold,
所以这个方法也可以写成
Eleme
nt(onElement).clickAndHold()
。
清单
6.
鼠标移动操作
Actions
action = new Actions(driver);
Element(toElement);//
将鼠标移到
toElement
元素中点
//
将鼠标移到元素
toElement
的
(xOffset, yOffset)
位置,
//
这里的
(xOffset,
yOffset)
是以元素
toElement
的左上角为
(0,0)
开始的
(x,
y)
坐标轴。
Element(toElement,xOffset,yOffset)
//
以鼠标当前位置或者
(0,0)
为中心开始移动到
(xOffset, yOffset)
坐标轴
Offset(xOffset,yOffset);
Offset(xOffset,yOffset)
这里需要注意,如果
xOffset
为负数,表示横坐标
向左移动,
yOf
fset
为负数表示纵坐标向上移动。而且如果这两个值大于当前屏幕的大小,
鼠标只能移到屏幕最边界的位置同时抛出
MoveTargetOutOfBoundsExecption
的异常。
鼠标移动操作在测试环境中
比较常用到的场景是需要获取某元素的
flyover/ti
ps
,实际应用
中很多
flyover
只有当鼠标移动到这个元素之后才出现,所以这个时候通过执行
moveToElement(toElement)
操作,
就能达到预期的效果。
但是根据我个人的经验,
这个方
法对于某些特定产品的图标,图像之类的
flyover/tips
也不起作用,
虽然在手动操作的时候
移动鼠标到这些图标上面可以出现
flyover,
但是当使用
WebDriver
来模拟这一移动操作
时,虽然方法成功执行了,但是
flyover
却出不来。所以在实际应用中,还需要对具体的产
品页面做相应的处理
。
清单
7.
鼠标释放操
Actions action = new Actions(driver);
e();//
释放鼠标
键盘模拟操作
对于键盘的模拟操作,
Actions
类中有提供
keyUp(theKe
y)
、
keyDown(theKey)
、
sendKeys(keysToSend)
等方法来实
现。
键盘的操作有普通键盘和修饰键盘
(
Modifier Keys,
下面的章节将讲到修饰键的概念)两种
:
1.
对于普通键盘,
使用
sendKeys(keysToSend)
就可以实现,
比如按键
TAB
、
Backspace
等。
清单
8.
普通键盘模拟
sendKeys(keysToSend)
Actions action = new Actions(driver);
ys();//
模拟按下并释放
TAB
键
ys();//
模拟按下并释放空格键
/***
针对某个元素发出某个键盘的按键操作,或者是输入操作,
比如在
input
框中输入某个字
符也可以使用这个方法。这个方法也可以拆分成
:
(elem
ent).sendKeys(keysToSend)
。
*/
ys(element,keysToSend);
注意除了
Actions
类有
sendKeys
(
keysToSend
)方法外,
WebElement
类也有一个
sendKeys
(
keysToSend
)方法,这两个方法对于一般的输入操作基本上相同,不同点在于
以下几点
:
?
Actions
中的
sendKeys(keysToSend)
对于修饰键
(Modifier
Keys)
的调用并不会释放,
也就是说当调用
ys(); ys(L);
ys();
的时候,相当于调用
n(keysT
oSend)
,而
如果在现实的应用中想要模拟按下并且释放这
些修饰键,应该再调用
ys()
来完成这个动作。
?
其次就是当
Actions
的
sendKeys(keysToSend)
执行完之后,<
/p>
焦点就不在当前元素了。
所
以我们可以使
用
sendKeys()
来切换元
素的焦点,从而达到选择元素的作用,这
个最常用到的场景就是在用户名和密码的输入过
程中。
?
第三点,
在
WebDriver
中,
我们可以使用
WebElement
类的
sendKeys(keysToSend)
来
上传附件,
比如
ys(“
C:
testuploadfilet
”);
这个操作将
上
传到
服务器
,但是使用:
Actions action = New
Actions(driver);
ys(elemen
t,“C
:
testupload
”)
;
(element).sendKeys(“C
:
testupload
”);
这种方式是上传不成功的,虽然
WebDriver
在执行这条语句的时候不会出错,但是实
际上
并没有将文件上传。所以要上传文件,还是应该使用前面一种方式。
2.
对于修饰键(
Modifier
keys
),一般都是跟普通键组合使用的。比如
Ctrl+a
、
Alt+F4
、
Shift+Ctrl+F
等等。
?
这里先解释一下修饰键的概念,
修饰键是键盘上的一个或者一组
特别的键,
当它与一般按键
同时使用的时候,
< br>用来临时改变一般键盘的普通行为。
对于单独按下修饰键本身一般不会触
发任何键盘事件。
在个人计算机上的键盘上,
有
以下几个修饰键:
Shift
、
Ctr
l
、
Alt(Option)
、
AltGr
、
Windows logo
p>
、
Command
、
FN(Function)
。但是在
WebDriver
中,一般的修饰键
指前面三个。你可以点击下面的
Wiki
链接去了解更多有关修饰键的信息,
Modifier
key
。
?
回到上面的话题,在
WebDriver
中对于修饰键的使用需要用到
Key
Down(theKey)
、
keyUp(theKey)
方法来操作。
清单
9.
修饰键方法
KeyDown(the
Key)
、
keyUp(theKey)
Actions action = new Actions(driver);
n(L);//
按下
Ctrl
键
n();//
按下
Shift
键
n();//
按下
Alt
键
(L);//
释放
Ctrl
键
();//
释放
Shift
键
();//
释放
Alt
键
所以要通过
Alt+F4
来关闭当前的活动窗口,可以通过下面语句来实现:
n().keyDo
wn(Keys.F4).keyUp().perform();
而如果是对于像键盘上面的字母键
a,b,c,d...
等的组合使用,可以通过以下语句实
现
:n(L).sednKeys(“a”).perform();
在
WebDriver
API
中,
KeyDown(Keys
theKey)
、
KeyUp(Keys theKey) <
/p>
方法的参数只能是
修饰键:
、
、
L,
否者将抛出
IllegalArgumentException
异常。
其次对于
n(theKey)
方法的调用,如果没有显示的调用
(theKey)
或者
ys()
来释放的话,这个按键将一直
保持按住状态。
使用
Robot
类来操作
Keys
没有枚举出来的按键操作
1.
在
WebDriver
中,
Keys
枚举出了键盘上大多数的非字母类按键,从
F1
到
F10
,
NUMPAD0
到
NUMPAD9
< br>、
ALTTABCTRLSHIFT
等等,
你可以通过以下链接查看
Keys
枚举出来的所有按键,
Enum
Keys
。
但是并没有列出键盘上的所有按键,比如字母键
a
、
b
、
< br>c
、
d …
z
,一些符号键比如:
?
{}
[]
?
、
?
?
、
?
。
?
p>
、
? ? ?
、
?
:
?
、
? +
?
、
?
-
?
、
? = ?
、、
?“”?
,还
有一些不常用到的
功能键如
PrtSc
、
ScrLk/NmLk
。对于字母键和符号键,前面我们已经提
到可以直接使用
sendKeys(“a”)
p>
,
sendKeys(“/”)
的方式来
触发这些键盘事件。而对于一些
功能组合键,如
Fn + NmLk
来关闭或者打开数字键,或者
Alt+PrtSC
来抓取当前屏幕的
活动窗口并保存到图片,通过
WebDriver
的
Keys
是没办法操作的。
这个时候我们就需
要用到
Java
的
Robot
类来实现对这类组合键的操作了。
2.
下面就以对
Alt+PrtSc
为例介绍一下
Robot
对键盘的操作。如代码清单
10
。
清单
10.
通过
Robot
发出组合键动作
/**
*
* @Description:
这个方法用来模拟发送组合键
Alt + PrtSc, <
/p>
当组合键盘事件执行之后,屏幕上
的活动窗口
*
就被截取并且存储在剪切板了。
接下来就是通过读取剪切板数据转换成
Image
图像对象并保存到本
地。
* @param filename
:
要保存的图像的名称
*/
public static void
sendComposeKeys(String fileName) throws Exception
{
虚拟键码
ss(_ALT);
//
按下
PrtSC
键
ss(_PRINTSCREEN);
//
释放键盘动作,当这个动作完成之后,模拟组合键
Alt +
PrtSC
的过程就
//
构建
Robot
对象,用来操作键盘
Robot
robot = new Robot();
//
模拟按下键盘动作,这里通过使用
KeyEvent
类来获取对应键盘(
ALT
)的
已经完成,
//
此时屏幕
活动窗口就一被截取并存入到剪切板
ease(_ALT);
//
获取系统剪切板实例
Clipboard sysc =
aultToolkit().getSystemClipboard();