自动化测试时,有些元素不适合直接点击或者进行某些操作时,可以使用Selenium的Actions类来模拟鼠标键盘操作,通过Actions对象可以发起鼠标左键,右键,移动鼠标等操作,最后使用perform方法进行操作。
不带参数的表示针对当前元素操作,带参数的表示针对指定元素操作
1、单击
click()
click(WebElement target)
2、双击
doubleClick()
doubleClick(WebElement target)
3、右击
contextClick()
contextClick(WebElement target)
4、移动
moveByOffset(int xOffset, int yOffset)
moveToElement(WebElement target)
moveToElement(WebElement toElement, int xOffset, int yOffset)
5、左键按下不释放
clickAndHold()
clickAndHold(WebElement target)
6、释放
release()
release(WebElement target)
注意:经常与clickAndHold相配合
7、拖动
dragAndDrop(WebElement source, WebElement target)
dragAndDropBy(WebElement source, int xOffset, int yOffset)
moveToElement:
public static void main(String[] args) throws InterruptedException { WebDriver driver = new ChromeDriver(); driver.get("https://www.baidu.com"); WebDriver.Window window = driver.manage().window(); // 最大化 window.maximize(); // 创建鼠标对象 Actions actions = new Actions(driver); WebElement element = driver.findElement(By.id("s-usersetting-top")); // 移动到设置按钮上去 actions.moveToElement(element).perform(); Thread.sleep(3000); }
案例:http://www.treejs.cn/v3/demo/cn/exedit/drag.html
clickAndHold()&release()&perform():
public static void main(String[] args) throws InterruptedException { WebDriver driver = new ChromeDriver(); driver.get("http://www.treejs.cn/v3/demo/cn/exedit/drag.html"); WebDriver.Window window = driver.manage().window(); // 最大化 window.maximize(); // 随意拖拽 1-1元素 WebElement element = driver.findElement(By.id("treeDemo_2_span")); // 随意拖拽 1-2 WebElement element1 = driver.findElement(By.id("treeDemo_3_span")); // 创建鼠标对象 Actions actions = new Actions(driver); actions.clickAndHold(element).moveToElement(element1).release().perform(); Thread.sleep(3000); }
dragAndDrop:
public static void main(String[] args) throws InterruptedException { WebDriver driver = new ChromeDriver(); driver.get("http://www.treejs.cn/v3/demo/cn/exedit/drag.html"); WebDriver.Window window = driver.manage().window(); // 最大化 window.maximize(); // 随意拖拽 1-1元素 WebElement element = driver.findElement(By.id("treeDemo_2_span")); // 随意拖拽 1-2 WebElement element1 = driver.findElement(By.id("treeDemo_3_span")); // 创建鼠标对象 Actions actions = new Actions(driver); actions.dragAndDrop(element, element1).perform(); Thread.sleep(3000); }
1、普通键操作
sendKeys(java.lang.CharSequence... keysToSend)
sendKeys(WebElement element, java.lang.CharSequence... keysToSend)
2、按下修饰键
keyDown(Keys theKey)
keyDown(WebElement element, Keys theKey)
sendKeys(keysToSend)
3、松开修饰键
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...)
keyDown:
public static void main(String[] args) throws InterruptedException { WebDriver driver = new ChromeDriver(); try { // Navigate to Url driver.get("https://google.com"); // Enter "webdriver" text and perform "ENTER" keyboard action driver.findElement(By.name("q")).sendKeys("webdriver" + Keys.ENTER); Actions actionProvider = new Actions(driver); Action keydown = actionProvider.keyDown(Keys.CONTROL).sendKeys("a").build(); keydown.perform(); } finally { driver.quit(); } }
keyUp:
public static void main(String[] args) { WebDriver driver = new ChromeDriver(); try { // Navigate to Url driver.get("https://google.com"); Actions action = new Actions(driver); // Store google search box WebElement WebElement search = driver.findElement(By.name("q")); // Enters text "qwerty" with keyDown SHIFT key and after keyUp SHIFT key (QWERTYqwerty) action.keyDown(Keys.SHIFT).sendKeys(search,"qwerty").keyUp(Keys.SHIFT).sendKeys("qwerty").perform(); } finally { driver.quit(); } } }
sendKeys:
public static void main(String[] args) throws InterruptedException { WebDriver driver = new ChromeDriver(); try { // Navigate to the url driver.get("https://google.com"); // Create an object of Action class Actions action = new Actions(driver); // Find google search box element WebElement search = driver.findElement(By.name("q")); // Send value by action class to the search box action.sendKeys(search, "Selenium").perform(); // Perform Keyboard action by Action class action.sendKeys(Keys.ENTER).perform(); } finally { driver.quit(); } }
1、build():组合所有actions,生成新的actions
2、perform():执行actions,参考源码发现该方法包含build()
所有Actions事件必须调用perform后才被真正执行
Actions:
在操作一个页面元素的时候需要一连串的动作配合的时候,可以使用Actions来完成
actions.clickAndHold(onElement).moveToElement(toElement).release().build().perform();
键盘事件-案例
键盘的划分:
普通键
已枚举: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等,单独按下修饰键本身一般不会触发任何键盘事件,通常和普通建组合使用。
1、普通键盘操作
Actions action = newActions(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) 来切换元素的焦点,从而达到选择元素的作用,这个最常用到的场景就是在用户名和密码的输入过程中。
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”);
2、修饰键操作:
按下修饰键: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 = newActions(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 =newActions(driver);
action.keyDown(Keys.SHIFT).sendKeys(input,"a").keyUp(Keys.SHIFT).perform();//按下Shift->输入a->释放Shift,结果输入A;已释放Shiftaction.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);
鼠标事件-案例
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 = newActions(driver);
action.doubleClick().perform();//鼠标在当前停留的位置做双击操作
action.doubleClick(driver.findElement(By.***)).perform();//鼠标双击指定的元素
3、右击 contextClick()、 contextClick(WebElement onElement)
Actions action = newActions(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 = newActions(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 = newActions(driver);
action.clickAndHold().perform();//鼠标在当前位置点击后不释放
action.clickAndHold(onElement).perform();//鼠标在 onElement 元素的位置点击后不释放
6、释放release()、release(WebElement onElement),经常与clickAndHold相配合
Actions action = newActions(driver);
action.release().perform();//释放鼠标
7、拖动dragAndDrop(WebElement source, WebElement target)、 dragAndDropBy(WebElement source, int xOffset, int yOffset)
Actions action = newActions(driver);
action.dragAndDrop(source,target).perform();// 将 source 元素拖放到 target 元素的位置。
action.dragAndDrop(source,xOffset,yOffset).perform();// 将 source 元素拖放到 (xOffset, yOffset) 位置,其中 xOffset 为横坐标,yOffset 为纵坐标。
拖拽动作是组合动作可以拆分实现:
Actions action = newActions(driver);
action.clickAndHold(source).moveToElement(target).release().perform(); //选中source元素->移动到target元素位置->释放左键
action.clickAndHold(source).moveByOffset(xOffset,yOffset).release().perform(); //选中source元素->拖放到(xOffset,yOffset)位置->释放左键
注意:文中部分案例摘自网络博客,仅用于学习记录。