Selenium Webdriver 中的 Robot 类

Selenium 中的 Robot 类是什么?

Selenium 中的 Robot 类 用于实现 Java 平台的自动化测试。它在本地系统中生成输入事件,用于测试自动化、自运行演示以及需要用户控制鼠标和键盘的其他应用程序。Robot 类易于实现,并且可以轻松地与自动化框架集成。

为什么使用 Robot 类?

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

Robot 类文档

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

要在本地机器上创建文档,请按照以下步骤操作:

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

Robot Class Documentation

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

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

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

Robot Class Documentation

等待系统处理一会儿,完成后您将在 awt 文件夹中看到一些 HTML 文件。

步骤 5) 打开 index.html

Robot Class Documentation

步骤 6) 这里有 awt 包的完整文档,从左侧导航栏点击“Robot”超链接(参见下图中标注 1 的地方)。

Robot Class Documentation

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

Selenium 中的 Robot 类方法和用法

Robot 类方法可用于在浏览器自动化过程中与键盘/鼠标事件进行交互。另外,可以使用 AutoIT,但它的缺点是会生成一个可执行文件(exe),该文件只能在 Windows 上运行,因此不是一个好的选择。

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

方法 1: keyPress()

robot.keyPress(KeyEvent.VK_DOWN): 此方法将按下键盘的向下箭头键

方法 2: mousePress()

robot.mousePress(InputEvent.BUTTON3_DOWN_MASK): 此方法将按下鼠标右键。

方法 3: mouseMove()

robot.mouseMove(point.getX(), point.getY()): 这会将鼠标指针移动到指定的 X 和 Y 坐标。

方法 4: keyRelease()

robot.keyRelease(KeyEvent.VK_DOWN): 此方法将释放键盘的向下箭头键

方法 5: mouseRelease()

robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK): 此方法将释放鼠标右键

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

  • 我们以网站 http://spreadsheetpage.com/index.php/file/C35/P10/ 为例,在该网站中,当您点击一个网页元素(.//a[@href=contains(text(),'yearly-calendar.xls'])后,会弹出一个操作系统下载窗口。
  • 为了处理这种情况,我们使用 Robot 类(在您的代码中创建一个 Robot 类实例,例如 Robot robot = new Robot())。Robot 类存在于 JDK 的 AWT 包中。
键盘按键 方法
按下向下箭头键 我们使用 (robot.keyPress(KeyEvent.VK_DOWN))
按下 TAB 键 我们使用 (robot.keyPress(KeyEvent.VK_TAB))
按下 Enter 键 我们使用 (robot.keyPress(KeyEvent.VK_ENTER))

Selenium 中 Robot 类的示例

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 类的基本方法,那么让我们来理解一些更复杂的方法——

假设您不想使用 click 方法 来点击网页元素。

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

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

步骤 2) 接下来,我们需要按下鼠标按钮。我们可以使用 mousePress 方法,例如 robot.mousePress(InputEvent.BUTTON1_DOWN_MASK)

步骤 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 文件后。您需要导入 TestNG 的 Test 注解。完成所有操作后,只需右键单击程序代码,然后单击“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 类的优点

  1. Robot 类可以模拟键盘和鼠标事件
  2. 在使用 Selenium WebDriver 时,Robot 类可以帮助上传/下载文件
  3. Robot 类可以轻松集成到当前的自动化框架中(关键字驱动、数据驱动或混合驱动)

Robot 类的缺点

Robot 框架有一些缺点,如下所述

  1. 键盘/鼠标事件仅在当前窗口实例上有效。例如,假设代码正在执行任何 Robot 类事件,并且在代码执行期间用户已移动到其他屏幕,那么键盘/鼠标事件将发生在该屏幕上。
  2. 大多数方法(如 mouseMove)都依赖于屏幕分辨率,因此一台机器上可以运行的代码可能无法在另一台机器上运行。

摘要

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

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