引用包来自selenium-java-2.23.1.jar
调用以下代码时,需要引入actions类,以java为例: import org.openqa.selenium.interactions.Actions;
鼠标事件-概述
1. 单击 click()、 click(WebElement onElement)
2. 双击 doubleClick() 、 doubleClick(WebElement onElement)
3. 右击 contextClick()、 contextClick(WebElement onElement)
4. 移动/悬浮 moveByOffset(int xOffset, int yOffset)、 moveToElement(WebElement toElement)、 moveToElement(WebElement toElement, int xOffset, int yOffset)
5. 左键按下不释放 clickAndHold()、 clickAndHold(WebElement onElement)
6. 释放 release()、 release(WebElement onElement),经常与clickAndHold相配合
7. 拖动 dragAndDrop(WebElement source, WebElement target)、 dragAndDropBy(WebElement source, int xOffset, int yOffset)
- 以上方法返回值均为Actions, 需要调用perform()后才能真正执行。
键盘事件 -概述
1. 普通键操作 :sendKeys(java.lang.CharSequence... keysToSend)、 sendKeys(WebElement element, java.lang.CharSequence... keysToSend)
2. 修饰键操作 :
按下修饰键: keyDown(Keys theKey)、 keyDown(WebElement element, Keys theKey)、 sendKeys(keysToSend)
松开修饰键:keyUp(Keys theKey)、 keyUp(WebElement element, Keys theKey)、 sendKeys( Keys.NULL )
- 以上方法返回值均为Actions, 需要调用perform()后才能真正执行 。
- keyDown\keyUp 参数只能是修饰键,否则抛出llegalArgumentException 异常
- 执行 keyDown (theKey)和sendKeys(修饰键)后,需要明显释放,否则将一直执行;释放方法分别为 keyUp (theKey), sendKeys(Keys.NULL)
-
区分Actions.sendKeys(keysToSend)和
WebElement.sendKeys(CharSequence...)
执行事件
1.build():组合所有actions,生成新的actions
2.perform():执行actions,参考源码发现该方法包含build()
- 所有Actions事件必须调用perform后才被真正执行
============================================================================================
鼠标事件-案例
1. 单击 click()、 click(WebElement onElement)
Actions action = new Actions(driver);
action.click().perform(); // 鼠标左键在当前停留的位置做单击操作 action.click(driver.findElement(By.***)).perform(); // 鼠标左键点击指定的元素
2. 双击 doubleClick() 、 doubleClick(WebElement onElement)
Actions action = new Actions(driver); action.doubleClick().perform(); // 鼠标在当前停留的位置做双击操作 action.doubleClick(driver.findElement(By.***)).perform(); // 鼠标双击指定的元素
3. 右击 contextClick()、 contextClick(WebElement onElement)
Actions action = new Actions(driver); action.contextClick().perform(); // 鼠标右键在当前停留的位置做单击操作 action.contextClick(driver.findElement(By.***)).perform(); // 鼠标右键点击指定的元素
4. 移动/悬浮 moveByOffset(int xOffset, int yOffset)、 moveToElement(WebElement toElement)、 moveToElement(WebElement toElement, int xOffset, int yOffset)
Actions action = new Actions(driver); action.moveToElement(toElement).perform(); // 将鼠标移到 toElement 元素中心点
action.moveToElement(toElement,xOffset,yOffset).perform(); // 将鼠标移到元素 toElement 的 (xOffset, yOffset) 位置,
// 这里的 (xOffset, yOffset) 是以元素 toElement 的左上角为 (0,0) 开始的 (x, y) 坐标轴。 action.moveByOffset(xOffset,yOffset).perform(); // 以鼠标当前位置或者 (0,0) 为中心开始移动到 (xOffset, yOffset) 坐标轴
action.moveByOffset(xOffset,yOffset) 这里需要注意,如果 xOffset为负数,表示横坐标向左移动,yOffset 为负数表示纵坐标向上移动。而且如果这两个值大于当前屏幕的大小,鼠标只能移到屏幕最边界的位置同时抛出MoveTargetOutOfBoundsExecption 的异常。
5. 左键按下不释放 clickAndHold()、 clickAndHold(WebElement onElement)
Actions action = new Actions(driver); action.clickAndHold().perform(); // 鼠标在当前位置点击后不释放 action.clickAndHold(onElement).perform(); // 鼠标在 onElement 元素的位置点击后不释放
6. 释放 release()、 release(WebElement onElement),经常与clickAndHold相配合
Actions action = new Actions(driver); action.release().perform(); // 释放鼠标
7. 拖动 dragAndDrop(WebElement source, WebElement target)、 dragAndDropBy(WebElement source, int xOffset, int yOffset)
Actions action = new
Actions(driver);
action.dragAndDrop(source,target).perform();// 将 source 元素拖放到 target 元素的位置。
action.dragAndDrop(source,xOffset,yOffset).perform();// 将 source 元素拖放到 (xOffset, yOffset) 位置,其中 xOffset 为横坐标,yOffset 为纵坐标。
拖拽动作是组合动作可以拆分实现:
Actions action = new
Actions(driver);
action.clickAndHold(source).moveToElement(target).release().perform(); //选中source元素->移动到target元素位置->释放左键
action.clickAndHold(source).moveByOffset(xOffset,yOffset).release().perform(); //选中source元素->拖放到(xOffset,yOffset)位置->释放左键
键盘事件-案例
键盘的划分:
-
普通键
- 已枚举:Keys.TAB、Keys.SPACE、Keys.F4、Keys.NUMPAD2、Keys.ARROW_DOWN、Keys.BACK_SPACE等;更多枚举键可参考selenium api中的keys类
- 未枚举:的字母键(a、b、c...)和符号键(‘ {}\[]’、‘ \ ’、‘。’、‘ ? ’、‘:’、‘ + ’、‘ – ’、‘ = ’、、‘“”’)等
- 修饰键 Keys.CONTROL、Keys.SHIFT、Keys.ALT等,单独按下修饰键本身一般不会触发任何键盘事件,通常和普通建组合使用。
- 更多信息可参考 Modifier key
Actions action = new Actions(driver); action.sendKeys(Keys.TAB).perform(); // 模拟按下并释放 TAB 键 action.sendKeys(element,Keys.SPACE).perform(); // 对element输入并释放空格键--可拆分为 action.click(element).sendKeys(Keys.SPACE).perform();
action.sendKeys("a").perform();// 模拟输入a
action.sendKeys(",").perform();// 模拟输入,
Actions.sendKeys(keysToSend)和
WebElement.sendKeys(CharSequence...)区别
-
-
Actions.sendKeys(keysToSend) ,操作修饰键时不会释放,等于actions.sendKeys(keysToSend),需要action.sendKeys(keys.NULL) 释放修饰键;
WebElement.sendKeys()直接释放参数
- 其次就是当 Actions 的 sendKeys(keysToSend) 执行完之后,焦点就不在当前元素了。所以我们可以使用 sendKeys(Keys.TAB) 来切换元素的焦点,从而达到选择元素的作用,这个最常用到的场景就是在用户名和密码的输入过程中。
-
Actions.sendKeys(keysToSend) ,操作修饰键时不会释放,等于actions.sendKeys(keysToSend),需要action.sendKeys(keys.NULL) 释放修饰键;
-
WebElement.sendKeys(keysToSend) 可以上传附件,比如element.sendKeys(“C:\\test\\uploadfile\\test.jpg”); 这个操作将 test.jpg上传到服务器;但是使用以下方法不会报错,但是实际上传失败:
Actions action = New Actions(driver); action.sendKeys(element,“C:\\test\\upload\\test.jpg”); 或 action.click(element).sendKeys(“C:\\test\\upload\\test.jpg”);
按下修饰键: keyDown(Keys theKey)、 keyDown(WebElement element, Keys theKey)、 sendKeys(keysToSend)
松开修饰键:keyUp(Keys theKey)、 keyUp(WebElement element, Keys theKey)、 sendKeys( Keys.NULL )
1)修饰键惯用操作:
Actions action = new Actions(driver); action.keyDown(Keys.CONTROL);// 按下 Ctrl 键 action.keyDown(Keys.SHIFT);// 按下 Shift 键 action.keyDown(Key.ALT);// 按下 Alt 键 action.keyUp(Keys.CONTROL);// 释放 Ctrl 键 action.keyUp(Keys.SHIFT);// 释放 Shift 键 action.keyUp(Keys.ALT);// 释放 Alt 键
sendKeys(keysToSend);//按下修饰键
sendKeys(Keys.NULL);//释放修饰键
2) 组合件输入-案例
SHIFT+a 预期输入A
Actions action = new Actions(driver);
action.keyDown(Keys.SHIFT).sendKeys(driver.findElement(By.tagName("input")),"a").keyUp(Keys.SHIFT).perform(); // 按下Shift->输入a->释放Shift,结果输入A
3) 输入修饰键后需要明显释放-案例
WebElement input = driver.findElement(By.tagName("input"));
Actions action = new Actions(driver); action.keyDown(Keys.SHIFT).sendKeys( input,"a").perform(); // 按下Shift->输入a,结果输入A ;未释放Shift
action.sendKeys(input, "b").perform(); // 输入大写B
WebElement input = driver.findElement(By.tagName("input"));
Actions action = new Actions(driver);
action.keyDown(Keys.SHIFT).sendKeys(input ,"a"). keyUp(Keys.SHIFT) .perform(); // 按下Shift->输入a-> 释放Shift ,结果输入A ; 已释放Shift
action.sendKeys(input, "b").perform(); // 输入小写b
同理,使用Actions.sendKeys(修饰键)后,需要使用 sendKeys( Keys.NULL ) 释放修饰键,否则修饰键一直处于被按下状态
3.robot类处理未枚举键:(未验证)
java.awt.Robot robot = new Robot();
robot.keyPress(java.awt.event.KeyEvent.VK_ALT);
robot.keyPress(java.awt.event.KeyEvent.VK_ALT);
===========================================================================================
更多参考资料:
Selenium java api http://selenium.googlecode.com/git/docs/api/java/index.html
Selenium 源码 git clone https://code.google.com/p/selenium/
文中部分案例摘自网络博客,仅用于学习记录。