Selenium WebDriver中的Robot类

Robot类

Selenium中的Robot类用于实现Java平台实现的自动化测试。它在本地系统中生成用于测试自动化的输入事件,Robot类易于实现,并且可以很容易地与自动化框架集成。

为什么要上Robot类?

在Selenium中使用Robot类是因为,在某些Selenium自动化测试中,用户需要控制键盘或鼠标来与操作系统窗口交互,如下载弹出窗口、打印弹出窗口等。Selenium Webdriver无法处理这些弹出窗口/应用程序,因此在Java版本1.3中引入了Robot类,它可以处理操作系统弹出窗口/应用程序。

在本教程中,将了解

  • Robot类的好处
  • Robot类的文档编制
  • 了解Robot类的内部方法和用法
  • 如何使用TestNG执行机器人类代码
  • 机器人课的弊端

机器人班的好处

  1. Robot类可以模拟键盘和鼠标事件
  2. 在使用Selenium Web驱动程序时,Robot类可以帮助上传/下载文件
  3. Robot类可以很容易地与当前自动化框架(关键字、数据驱动或混合)集成

什么是机器人类文档?

Selenium中的Robot Class文档帮助用户理解Java AWT包中Robot类中可用的所有方法和函数的基本定义、语法和用法。用户可以在Oracle官方网站上查看文档。用户还可以自己在本地计算机上创建文档。

要在本地计算机上创建文档,执行以下步骤-

步骤1)将在JDK文件夹中找到src.zip文件。复制src.zip并解压缩到其他文件夹或目录(比如D:或E:)

Robot Class in Selenium Webdriver
Robot Class in Selenium Webdriver

步骤2)解压缩src文件夹并导航到(到src文件夹的路径)/src/java/awt

步骤3)复制AWT文件夹当前位置,打开命令提示符。

步骤4)在cmd中,将当前目录位置更改为awt文件夹,然后键入‘javadoc*.java’,如下所示

Robot Class in Selenium Webdriver
Robot Class in Selenium Webdriver

等待系统处理,一旦完成,将在AWT文件夹中看到很少的HTML文件。

步骤5)打开index.html

Robot Class in Selenium Webdriver
Robot Class in Selenium Webdriver

步骤6)这里有AWT包的完整文档,从左边的导航栏点击‘Robot’超链接(见下图中标记的1)。

Robot Class in Selenium Webdriver
Robot Class in Selenium Webdriver

在这里,还可以看到Robot Class的所有方法和接口(参见上图中标记的2)。

了解Robot类的内部方法和用法

Robot类方法可用于在执行浏览器自动化时与键盘/鼠标事件交互。或者,也可以使用AutoIT,但它的缺点是它生成的可执行文件(Exe)只能在Windows上运行,因此它不是一个好的选择。

Web自动化过程中一些常用的Robot类方法:

  • KeyPress():示例: robot.keyPress(KeyEvent.VK_DOWN) :此方法使用键盘的向下箭头键
  • MousePress():示例: robot.mousePress(InputEvent.BUTTON3_DOWN_MASK) :此方法将按鼠标右键。
  • MouseMove():示例: robot.mouseMove(point.getX() ,point.getY()):这会将鼠标指针移动到指定的X和Y坐标。
  • KeyRelease():示例: robot.keyRelease(KeyEvent.VK_DOWN) :此方法使用键盘的松开向下箭头键
  • MouseRelease():示例: robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK) :此方法将释放鼠标右键单击

使用Robot类自动化常见用例的示例代码

  • 让我们以网站http://spreadsheetpage.com/index.php/file/C35/P10/为例,在点击某个Web元素(.//a [@HREF= contains(text() ,‘Year-calendar.xls’] )之后,会出现一个OS下载弹出窗口。

  • 为了处理这个问题,我们使用Robot类(通过在代码中创建Robot类的实例,比如Robot bot=new Robot() )。出现在JDK的AWT包中的Robot类。

  • 要按下我们使用的键盘的向下箭头键( robot.keyPress(KeyEvent.VK_DOWN) )
  • 按键盘的Tab键(我们使用 robot.keyPress(KeyEvent.VK_TAB) )
  • 要按Enter键,我们使用( robot.keyPress(KeyEvent.VK_ENTER) )。

以下是示例代码

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
class Excercise1 {
    public static void main(String[] args) throws AWTException, InterruptedException {
        WebDriver driver = new FirefoxDriver();
        driver.get("http://spreadsheetpage.com/index.php/file/C35/P10/"); // sample url
        driver.findElement(By.xpath(".//a[@href=contains(text(),'yearly-calendar.xls')]")).click();
        Robot robot = new Robot();  // Robot class throws AWT Exception
        Thread.sleep(2000); // Thread.sleep throws InterruptedException
        robot.keyPress(KeyEvent.VK_DOWN);  // press arrow down key of keyboard to navigate and select Save radio button
        Thread.sleep(2000);  // sleep has only been used to showcase each event separately
        robot.keyPress(KeyEvent.VK_TAB);
        Thread.sleep(2000);
        robot.keyPress(KeyEvent.VK_TAB);
        Thread.sleep(2000);
        robot.keyPress(KeyEvent.VK_TAB);
        Thread.sleep(2000);
        robot.keyPress(KeyEvent.VK_ENTER);
        // press enter key of keyboard to perform above selected action
    }
}

查看此视频以了解其运行情况

如何使用TestNG执行Robot类代码

因为,现在了解了Robot类的基本方法,所以让我们了解几个更复杂的方法-

假设不想使用单击方法来单击Web元素。

在这种情况下,可以使用Robot类的MouseMove方法。

步骤1)MouseMove方法以x和y坐标作为参数,如 robot.mouseMove(630, 420) ,其中630表示x轴,420表示y轴。因此,此方法会将鼠标指针从当前位置移动到提到的x和y交叉点。

步骤2)下一步,我们需要按下鼠标按钮。我们可以使用像 robot.mousePress(InputEvent.BUTTON1_DOWN_MASK) 一样的MousePress方法。

步骤3)按下后,需要松开鼠标。我们可以使用 robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK ) 来释放鼠标的左击。

使用TestNG运行代码:

使用TestNG运行代码需要TestNG的maven依赖或TestNG JAR文件的引用库。

TestNG Maven依赖关系:

<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.1.1</version>
</dependency>

在添加maven依赖项或JAR文件之后。一旦全部完成,只需右键单击程序代码,然后单击Run As,然后单击TestNG…会发现代码将使用TestNG API开始执行。

代码

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;
public class Excersise1 {
    @Test
    public static void  execution() throws InterruptedException, AWTException {
        WebDriver driver = new FirefoxDriver();
        driver.manage().window().maximize();
        driver.get("http://spreadsheetpage.com/index.php/file/C35/P10/"); // sample url
        Robot robot = new Robot();
        robot.mouseMove(630, 420); // move mouse point to specific location
        robot.delay(1500);        // delay is to make code wait for mentioned milliseconds before executing next step
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); // press left click
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); // release left click
        robot.delay(1500);
        robot.keyPress(KeyEvent.VK_DOWN); // press keyboard arrow key to select Save radio button
        Thread.sleep(2000);
        robot.keyPress(KeyEvent.VK_ENTER);
        // press enter key of keyboard to perform above selected action
    }
}

Robot类的弊端

Robot框架有以下几个缺点:

  1. 关键字/鼠标事件仅在当前Windows实例上有效。假设代码正在执行任何Robot类事件,并且在代码执行期间,用户已移动到某个其他屏幕,则关键字/鼠标事件将在该屏幕上发生。
  2. 像MouseMove这样的大多数方法都依赖于屏幕分辨率,因此在一台机器上工作的代码可能在另一台机器上不能工作。

总结

AWT包中的Robot类用于生成键盘/鼠标事件,以与操作系统、窗口和本地应用程序交互。

Robot的主要目的是支持在Java平台上构建Selenium自动化测试项目

IT赶路人

专注IT知识分享