到目前为止,我已使用Selenium Actions库在自动化项目中执行鼠标/键盘操作。
最近,我发现了Java AWT Robot类。它与Selenium Actions库相比如何?其中一个中有一些角落案例是另一个解决了吗?限制吗?稳定性?性能考虑?
答案 0 :(得分:9)
这些工具的工作方式存在巨大差异。 Selenium
使用WebDriver API并向浏览器发送命令以执行操作(通过" JSON有线协议")。
Java AWT Robot使用本机系统事件来控制鼠标和键盘。
如果您正在进行浏览器自动化,理想情况下,您不会使用Robot
之类的东西,因为通常硒提供的功能绰绰有余。虽然,有些情况下打开了浏览器或本机操作系统弹出窗口,例如上传/下载文件 - 这可以通过机器人解决 - 虽然通常有硒 - 有助于避免使用Robot
的特定解决方案/解决方法。这些解决方法的关键思想是"因为我们无法控制弹出窗口,所以不要让它们被打开"。
例如,当您在Firefox中下载文件时,您将获得一个文件浏览器弹出窗口,建议您选择位置和文件名。这是使用selenium
无法操纵的内容。但是,你可以做的是让Firefox知道哪些文件类型以及你想在哪里自动保存下载,而不显示弹出窗口。请参阅Access to file download dialog in Firefox。
相关主题:
答案 1 :(得分:0)
Robot Class在java.awt模块中的java.desktop包中定义。此类用于处理与 Test Automation 关联的本机系统输入事件,其中需要控制鼠标和键盘。 Robot Class 的主要目的是促进Java平台实现的自动化测试。使用 Robot Class 生成输入事件不同于将事件发布到 Java AWT事件队列或 AWT组件,如使用 Robot Class 事件在平台的本机输入队列中生成。例如,Robot.mouseMove
实际上会移动鼠标光标而不是仅生成鼠标移动事件。
此时值得一提的是,某些平台需要特殊权限或扩展才能访问低级输入控件。如果当前平台配置不允许输入控制,则在尝试构造Robot对象时将抛出AWTException。例如,如果 X服务器不支持(或未启用) XTEST 2.2标准扩展, X-Window系统将抛出异常
一个例子:
Robot robot = new Robot();
// Press keys using robot with a gap of of 500 mili seconds is added after every key press
robot.keyPress(KeyEvent.VK_S);
Thread.sleep(500);
robot.keyPress(KeyEvent.VK_T);
Thread.sleep(500);
robot.keyPress(KeyEvent.VK_A);
Thread.sleep(500);
robot.keyPress(KeyEvent.VK_S);
Thread.sleep(500);
robot.keyPress(KeyEvent.VK_I);
Actions Class在org.openqa.selenium.interactions包中定义,是用户面向API ,用于在使用 Selenium 时模拟复杂的用户手势。 Actions类允许您构建操作链并在W3C Specification之后执行基于 WebDriver API 的操作。通过 Selenium 测试自动化时,您可以使用此类而不是直接使用键盘或鼠标。 Actions类实现 Builder Pattern ,它可以构建一个 CompositeAction ,其中包含下面提到的方法调用指定的所有操作:
build()
click(WebElement target)
clickAndHold(WebElement target)
contextClick(WebElement target)
doubleClick(WebElement target)
dragAndDrop(WebElement source, WebElement target)
moveToElement(WebElement target, int xOffset, int yOffset)
perform()
sendKeys(WebElement target, java.lang.CharSequence... keys)
一个例子:
Actions act = new Actions(driver);
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement electronics = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//li/a[@href='/electronics']")));
act.moveToElement(electronics).perform();
答案 2 :(得分:0)
我个人更喜欢actions类来执行任何鼠标或键盘事件。 如果在某些环境中使用动作类存在技术故障,那么我们可以使用机器人类。