我使用以下几行来模拟Java中的Control_A [select all]键操作,但是剪贴板没有获取文本,为什么?
Robot robot=null;
try { robot=new Robot(); }
catch (AWTException ex) { System.err.println("Can't start Robot: " + ex); }
robot.mouseMove(260,500);
robot.mousePress(InputEvent.BUTTON1_MASK);
// robot.mouseMove(660,700);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
robot.keyPress(KeyEvent.VK_CONTROL); // Select all
robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_CONTROL); // Copy
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_CONTROL);
Transferable t=Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
try
{
if (t!=null && t.isDataFlavorSupported(DataFlavor.stringFlavor))
{
String text=(String)t.getTransferData(DataFlavor.stringFlavor);
System.out.println(text);
}
}
catch (Exception ex) { ex.printStackTrace(); }
我打开一个浏览器,所以在[260,500]屏幕上有该区域的文字。我错过了什么?
编辑:
我刚发现一些奇怪的东西,当我打开浏览器时,浏览器中的文本不是副本,但如果我打开记事本/ wordpad,其中的文本将是副本,那么为什么浏览器没有这样做?
答案 0 :(得分:2)
您的所有代码都应位于try
块中,您实例化Robot
,因为您可能最终尝试使用空引用并获得NullPointerException
。如果您的Robot
永远不会被创建并且从未复制过内容,那么您尝试从剪贴板访问内容也毫无意义。
我不完全确定为什么但是在尝试从剪贴板中读取之前添加一个小延迟修复了一些问题。我猜这可能与Java之间的竞争条件有关,在系统有时间更新它之前抓住剪贴板。
此更新的代码应该有效:
Robot robot = null;
try
{
robot = new Robot();
robot.mouseMove(260, 500);
robot.mousePress(InputEvent.BUTTON1_MASK);
// robot.mouseMove(660,700);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
robot.keyPress(KeyEvent.VK_CONTROL); // Select all
robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_CONTROL); // Copy
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_CONTROL);
try
{
//sleep just a little to let the clipboard contents get updated
Thread.sleep(25);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
try
{
if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor))
{
String text = (String) t.getTransferData(DataFlavor.stringFlavor);
System.out.println(text);
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
catch (AWTException ex)
{
System.err.println("Can't start Robot: " + ex);
}
答案 1 :(得分:1)
不确定您的代码上下文,但是尝试从浏览器上的PDF文档提取文本时遇到了同样的问题。 这是一种误导,因为ctrl-a突出显示了文本,而ctlr-c没有复制任何内容。我的解决方案是首先模拟文档上任何位置的点击,然后模拟ctrl-a和ctrl-c。我的代码:
robot = new Robot();
//Get window size
Dimension d = driver.manage().window().getSize();
System.out.println("Dimension x and y :"+d.getWidth()+" "+d.getHeight());
int x = (d.getWidth()/4)+20;
int y = (d.getHeight()/10)+50;
robot.mouseMove(x,y);
//Clicks Left mouse button
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
Thread.sleep(25);
// Select all
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_CONTROL);
Thread.sleep(100);
// Copy to clipboard
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_CONTROL);
Thread.sleep(100);
希望这会有所帮助。