我将如何以编程方式单击一个Swing JButton,以便注册所有相关的动作/鼠标事件并对用户可见(即他们看到按钮被按下就像他们实际点击它一样)?
该按钮与我正在运行的应用程序相同; 我不是想控制另一个应用程序中的按钮.我想我可以直接将事件注入队列,但是如果可能的话我宁愿避免使用这种方法,这样做也不会显示可见的点击.
我看到java.awt.Robot类提供了移动鼠标并单击鼠标的方法,但没有让它单击特定按钮.
我想将一个String转换为KeyEvent来做这样的事情:
writeKeyboard(myBot,"abcd");
public void writeKeyboard(Robot bot, String st){
char[] arr = arr.toCharArray();
int i = arr.length();
int j = 0;
int keycode;
while (j<i) {
keycode = arr[j].something;
bot.keyPress(keycode);
bot.keyRelease(keycode);
j++;
}
}
Run Code Online (Sandbox Code Playgroud) 我已经知道如何使用java.awt.Robot
键入单个字符keyPress
,如下所示.如何在文本框中一次输入一个完整的预定义String
值?
robot.keyPress(KeyEvent.VK_1);
robot.keyPress(KeyEvent.VK_1);
robot.keyPress(KeyEvent.VK_1);
// instead, enter String x = "111"
Run Code Online (Sandbox Code Playgroud) 什么是mac上的命令键的VK_ [key]代码(如果存在)?我试图让机器人(java机器人)按下命令键.我使用命令keyPress(),我需要知道mac上命令键的整数键代码.
我正在使用Selenium WebDriver和Java,我需要自动化文件上传功能.我尝试了很多,但是当点击"浏览"按钮并打开一个新窗口时,脚本会停止执行,而不是卡住.我试过FireFox和IE驱动程序,但无济于事.
我也尝试通过调用autoit exe文件,但是当单击Browse按钮时打开新窗口,特定语句
Runtime.getRuntime().exec("C:\\Selenium\\ImageUpload_FF.exe")
Run Code Online (Sandbox Code Playgroud)
无法实现.请帮助
机器人是AWT库的一部分,但它似乎与大多数库的其他部分完全不同.我正在创建一个Swing GUI,它将Swing与Java Native Access(JNA)和Robot混合在一起,以允许Java驱动某些MS Windows/Citrix工作程序.我的直觉是,因为Robot会在"平台的本机输入队列"上排队事件,我想做的最后一件事就是在EDT上运行它,但另一方面,AWT和Swing库中的大多数类都是如此.应该在Swing事件线程上运行.因此,为了让我在脑海中澄清这一点,请让我尽可能具体地问一个问题:
机器人方法(特别是按键和释放,鼠标移动,鼠标按下和释放)是否应该在Swing事件调度线程(EDT)上运行?
java程序应该做的是它应该在某些条件下触发键盘按下而无需人按键盘键.因此,任何需要键盘输入的窗口和焦点运行的程序都可以在没有人实际按下键盘的情况下获得输入.
我想知道在Java中是否有任何方法可以做到这一点.
我们有一个Mac os服务器(10.10.3),我们用它来运行Jenkins的功能测试.
我们想(在我们的测试中)使用一个工具/库(sikulix作为信息),它使用了引擎java.awt.Robot类-java.awt.GraphicsEnvironment-.问题是:我们不能在无头环境中使用这个java类,因为它需要访问GUI.
所以我想知道是否有解决方案/黑客使这个工具与jenkins一起工作.
考虑到我们有一个USB-HDMI模拟器(mac无头加速器)模拟附加的显示器.
我们还安装了Xquartz,X11,xauth,所以我认为它会绕过这个java无头限制,强制将java.awt.headless属性设置为false,并使用X窗口,但事实并非如此.
如果我错了,请纠正我:我们不需要有真正的屏幕来做到这一点,这是显示模拟器/模拟器的目标; 不是吗?
我在我们的测试中成功尝试使用此lib:
在桌面上使用它(带监视器,它可以工作)
使用远程mac服务器 机器A和本地mac桌面 机器B之间的屏幕共享(通过执行此屏幕共享终端中的脚本)vnc?
在我的linux计算机(客户端)上使用ssh -Y,它也是X Window System(X11)应用程序的服务器:它在没有任何ssh配置更改(-Y标志)的情况下进行了X11转发.java.awt.headless = false在这里很有用
但我无法确定最后的解决方案是否有用.虽然我已经通过ssh执行了脚本,但我连接了一个屏幕:它可能会影响某些东西.
(请记住,最终目标是使用jenkins执行测试).
它引导我尝试:通过带有-Y标志的 ssh执行脚本,或者通过修改ssh_config/sshd_config文件(访问mac -remote服务器 - )并激活屏幕共享,但它不会自动识别X-window :(
在这里我的问题:
xvfb插件(jenkins)是否足以满足我们的需求?我不知道如何配置它.
是不是可以从mac服务器执行X11转发(用jenkins执行的脚本作为守护进程/代理;包括可能是ssh -Y连接,我还不知道如何让它工作)到共享的屏幕? - 这是服务器....不知道为什么它不能识别它 - .
是的,我知道,这个问题很奇怪,但我的大脑正在燃烧,我感到困惑......
顺便说一句,我宁愿做一切真无头,但如果不可能,我必须使用屏幕共享,我很好.
目前我真的很想知道是否有可能在无头环境中启动需要X11 -on mac的GUI应用程序...我认为正确的安装答案是肯定的,但显然它不是那么简单......或者我一定不能正确理解.
对于X11转发,我有$ DISPLAY var设置,但我仍然得到
错误:无法打开显示'地址'
即使我将显示设置为本地,远程或地址,我仍然被具有GUI访问权限的lib阻止.
另一个解决方案可能是附加终端会话(屏幕共享终端/终端启动脚本),我将在明天尝试使用tmux.我仍然觉得奇怪,服务器无法检测到它的共享会话(我想再说一遍!)....有一个打开的屏幕花花公子:s
使用xvfb:
export DISPLAY=:1
Xvfb :1 &
Run Code Online (Sandbox Code Playgroud)
然后mvn命令,但它仍然无法正常工作.
编辑:如果任何人还有任何其他建议,以提高屏幕捕获性能,请随意分享,因为它可能完全解决我的问题!
你好开发者,
我正在为自己制作一些基本的屏幕捕获软件.截至目前,我已经获得了一些概念/修补代码的证明,它使用java.awt.Robot将屏幕捕获为BufferedImage.然后我执行此捕获指定的时间,然后将所有图片转储到磁盘.从我的测试中我得到大约每秒17帧.
时长:15秒拍摄的图像:255
时长:15秒图像捕获:229
显然,这对于真正的屏幕捕获应用程序来说还不够好.特别是因为这些捕获只是在我的IDE中选择一些文本而没有任何图形密集的文本.
我现在有两个班级是Main类和一个"Monitor"类.Monitor类包含捕获屏幕的方法.我的Main类有一个基于时间的循环,它调用Monitor类并将它返回的BufferedImage存储到BufferedImages的ArrayList中.如果我修改我的主类来生成几个执行该循环的线程,并且还收集有关捕获图像的系统时间的信息,我可以提高性能吗?我的想法是使用一个共享数据结构,它将在插入时基于捕获时间自动对帧进行排序,而不是将连续图像插入到arraylist中的单个循环.
码:
public class Monitor {
/**
* Returns a BufferedImage
* @return
*/
public BufferedImage captureScreen() {
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage capture = null;
try {
capture = new Robot().createScreenCapture(screenRect);
} catch (AWTException e) {
e.printStackTrace();
}
return capture;
}
}
Run Code Online (Sandbox Code Playgroud)
public class Main {
public static void main(String[] args) throws InterruptedException {
String outputLocation = "C:\\Users\\ewillis\\Pictures\\screenstreamer\\";
String namingScheme = "image";
String mediaFormat = "jpeg";
DiscreteOutput output …
Run Code Online (Sandbox Code Playgroud) 如何在Python中控制鼠标和键盘?
我们的想法与Java中的Robot()类相同.能够说:将鼠标从这里移动到这里,点击那里,写出屏幕上的任何内容.
对于Windows,有win32api,但我主要使用的是Linux.
对于Linux有Xlib,但它也适用于键盘吗?(仅发现鼠标的参考)
有跨平台的解决方案吗?(Linux,Windows甚至OS X都会很棒.)