我已经将代码重构为更干净的代码,而不会改变你在你的代码中所做的事情,因为你的代码很适合我。我只是想用这个版本作为讨论的基础:
package de.scrum_master.stackoverflow; import java.awt.*; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.event.KeyEvent; import java.io.IOException; import java.util.Arrays; import java.util.List; public class BrowserRemoteControl { private static final Clipboard CLIPBOARD = Toolkit.getDefaultToolkit().getSystemClipboard(); private static final Robot ROBOT = createRobot(); public static void main(String[] args) throws IOException, InterruptedException, AWTException { startChrome(); List<String> sites = Arrays.asList("youtube.com", "facebook.com"); for (String site : sites) { setClipboardContent(site); enterURLFromClipboard(); createNewBrowserTab(); } } private static Robot createRobot() { try { return new Robot(); } catch (AWTException e) { throw new RuntimeException("Cannot create Robot instance", e); } } private static void startChrome() throws IOException, InterruptedException { Process process = Runtime.getRuntime().exec("\"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe\""); process.waitFor(); System.out.println("Google Chrome launched"); } private static void setClipboardContent(String text) { CLIPBOARD.setContents(new StringSelection(text), null); } private static void enterURLFromClipboard() throws InterruptedException { // Ctrl-V ROBOT.keyPress(KeyEvent.VK_CONTROL); ROBOT.keyPress(KeyEvent.VK_V); ROBOT.keyRelease(KeyEvent.VK_V); ROBOT.keyRelease(KeyEvent.VK_CONTROL); // Enter ROBOT.keyPress(KeyEvent.VK_ENTER); ROBOT.keyRelease(KeyEvent.VK_ENTER); // Wait a little while Thread.sleep(250); } private static void createNewBrowserTab() { // Ctrl-T ROBOT.keyPress(KeyEvent.VK_CONTROL); ROBOT.keyPress(KeyEvent.VK_T); ROBOT.keyRelease(KeyEvent.VK_CONTROL); ROBOT.keyRelease(KeyEvent.VK_T); } }
我希望你不介意最后的额外空浏览器选项卡,但我想避免为最后一个网站做一个例外。
因为你的代码对我来说即使没有清理它们之间的剪贴板,我猜你有某种时间问题或竞争条件。
的 更新: 强> 我设法一次(并且只有一次)重现问题。所以我刚加了一个 Thread.sleep() 粘贴URL并按Enter键以显示如何在可能导致问题的所有位置执行相同操作。
Thread.sleep()
随意提出后续问题。