Robot类
Selenium中的Robot类用于实现Java平台实现的自动化测试。它在本地系统中生成用于测试自动化的输入事件,Robot类易于实现,并且可以很容易地与自动化框架集成。
为什么要上Robot类?
在Selenium中使用Robot类是因为,在某些Selenium自动化测试中,用户需要控制键盘或鼠标来与操作系统窗口交互,如下载弹出窗口、打印弹出窗口等。Selenium Webdriver无法处理这些弹出窗口/应用程序,因此在Java版本1.3中引入了Robot类,它可以处理操作系统弹出窗口/应用程序。
在本教程中,将了解
- Robot类的好处
- Robot类的文档编制
- 了解Robot类的内部方法和用法
- 如何使用TestNG执行机器人类代码
- 机器人课的弊端
机器人班的好处
- Robot类可以模拟键盘和鼠标事件
- 在使用Selenium Web驱动程序时,Robot类可以帮助上传/下载文件
- Robot类可以很容易地与当前自动化框架(关键字、数据驱动或混合)集成
什么是机器人类文档?
Selenium中的Robot Class文档帮助用户理解Java AWT包中Robot类中可用的所有方法和函数的基本定义、语法和用法。用户可以在Oracle官方网站上查看文档。用户还可以自己在本地计算机上创建文档。
要在本地计算机上创建文档,执行以下步骤-
步骤1)将在JDK文件夹中找到src.zip文件。复制src.zip并解压缩到其他文件夹或目录(比如D:或E:)
步骤2)解压缩src文件夹并导航到(到src文件夹的路径)/src/java/awt
步骤3)复制AWT文件夹当前位置,打开命令提示符。
步骤4)在cmd中,将当前目录位置更改为awt文件夹,然后键入‘javadoc*.java’,如下所示
等待系统处理,一旦完成,将在AWT文件夹中看到很少的HTML文件。
步骤5)打开index.html
步骤6)这里有AWT包的完整文档,从左边的导航栏点击‘Robot’超链接(见下图中标记的1)。
在这里,还可以看到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框架有以下几个缺点:
- 关键字/鼠标事件仅在当前Windows实例上有效。假设代码正在执行任何Robot类事件,并且在代码执行期间,用户已移动到某个其他屏幕,则关键字/鼠标事件将在该屏幕上发生。
- 像MouseMove这样的大多数方法都依赖于屏幕分辨率,因此在一台机器上工作的代码可能在另一台机器上不能工作。
总结
AWT包中的Robot类用于生成键盘/鼠标事件,以与操作系统、窗口和本地应用程序交互。
Robot的主要目的是支持在Java平台上构建Selenium自动化测试项目