zoukankan      html  css  js  c++  java
  • 【Selenium专题】鼠标键盘事件

    引用包来自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()后才能真正执行
    • keyDownkeyUp 参数只能是修饰键,否则抛出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

    1.普通键盘操作 

    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) 来切换元素的焦点,从而达到选择元素的作用,这个最常用到的场景就是在用户名和密码的输入过程中。
      • 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 = 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/

    文中部分案例摘自网络博客,仅用于学习记录。

  • 相关阅读:
    Python学习第42天(ftp习题实现day4)
    Python学习第41天(ftp习题实现day3)
    Python学习第40天(ftp习题实现day2)
    Python学习第39天(ftp习题实现day1)
    Python学习第38天(文件处理,os、sys、pickle模块复习)
    Python学习第37天(socketserver继承原理、通讯加密)
    Python学习第36天(socketserver模块导入)
    Python学习第35天(粘包)
    个人读书笔记04—业务用例图
    命令模式
  • 原文地址:https://www.cnblogs.com/sylvia-liu/p/4224409.html
Copyright © 2011-2022 走看看