使用机器人保存具有不同名称的网页
using a robot to save a web page with different names
我正在使用selenium
创建一个打开页面并自动保存的机器人,如下:
WebDriver driver = new FirefoxDriver();
driver.get("http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7043856");
Robot robot = new Robot();
robot.delay(20000);
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_S);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_S);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
有两个问题,首先,它实际上不按回车键,只打开 save as
window,其次,我怎样才能让它传递一个不同的名称或至少, 文件名相同时不覆盖页面?
你是对的。当我们使用 driver.getPageSource() 时 css,脚本和相关资源不会被保存并且无法正常离线查看。
我能够使用相同的代码保存文件。只是在每次操作后加一个Thread.sleep()
而已。
请注意,当另存为 window 打开时,焦点位于文件名上。所以你可以使用机器人 class 输入文件名。关于您的文件名问题不应被覆盖,您可以使用随机数生成器。您可能需要创建一个函数来简化此任务。
请检查下面的代码。
public static void main(String[] args) throws AWTException, InterruptedException {
WebDriver driver = new FirefoxDriver();
driver.get("http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7043856");
// Added this line to let the page load completely
String pageSource = driver.getPageSource();
Robot robot = new Robot();
// Press Ctrl+S
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_S);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_S);
Thread.sleep(5000);
// Generate a 2 digit random number and split it into two separate chars
String random = RandomStringUtils.randomNumeric(2);
System.out.println(random);
char charOne = random.charAt(0);
char charTwo = random.charAt(1);
// Save As window has opened and the focus is on the file name field.
// Click right arrow key to go to the last of the already present name
robot.keyPress(KeyEvent.VK_RIGHT);
robot.keyRelease(KeyEvent.VK_RIGHT);
// Append the generated random number to the name
robot.keyPress(getKeyEvent(charOne));
robot.keyRelease(getKeyEvent(charOne));
robot.keyPress(getKeyEvent(charTwo));
robot.keyRelease(getKeyEvent(charTwo));
Thread.sleep(5000);
// Press enter
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
}
public static int getKeyEvent(char key) {
switch (key) {
case '1':
return KeyEvent.VK_1;
case '2':
return KeyEvent.VK_2;
case '3':
return KeyEvent.VK_3;
case '4':
return KeyEvent.VK_4;
case '5':
return KeyEvent.VK_5;
case '6':
return KeyEvent.VK_6;
case '7':
return KeyEvent.VK_7;
case '8':
return KeyEvent.VK_8;
case '9':
return KeyEvent.VK_9;
default:
return KeyEvent.VK_0;
}
}
我正在使用selenium
创建一个打开页面并自动保存的机器人,如下:
WebDriver driver = new FirefoxDriver();
driver.get("http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7043856");
Robot robot = new Robot();
robot.delay(20000);
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_S);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_S);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
有两个问题,首先,它实际上不按回车键,只打开 save as
window,其次,我怎样才能让它传递一个不同的名称或至少, 文件名相同时不覆盖页面?
你是对的。当我们使用 driver.getPageSource() 时 css,脚本和相关资源不会被保存并且无法正常离线查看。
我能够使用相同的代码保存文件。只是在每次操作后加一个Thread.sleep()
而已。
请注意,当另存为 window 打开时,焦点位于文件名上。所以你可以使用机器人 class 输入文件名。关于您的文件名问题不应被覆盖,您可以使用随机数生成器。您可能需要创建一个函数来简化此任务。
请检查下面的代码。
public static void main(String[] args) throws AWTException, InterruptedException {
WebDriver driver = new FirefoxDriver();
driver.get("http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7043856");
// Added this line to let the page load completely
String pageSource = driver.getPageSource();
Robot robot = new Robot();
// Press Ctrl+S
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_S);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_S);
Thread.sleep(5000);
// Generate a 2 digit random number and split it into two separate chars
String random = RandomStringUtils.randomNumeric(2);
System.out.println(random);
char charOne = random.charAt(0);
char charTwo = random.charAt(1);
// Save As window has opened and the focus is on the file name field.
// Click right arrow key to go to the last of the already present name
robot.keyPress(KeyEvent.VK_RIGHT);
robot.keyRelease(KeyEvent.VK_RIGHT);
// Append the generated random number to the name
robot.keyPress(getKeyEvent(charOne));
robot.keyRelease(getKeyEvent(charOne));
robot.keyPress(getKeyEvent(charTwo));
robot.keyRelease(getKeyEvent(charTwo));
Thread.sleep(5000);
// Press enter
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
}
public static int getKeyEvent(char key) {
switch (key) {
case '1':
return KeyEvent.VK_1;
case '2':
return KeyEvent.VK_2;
case '3':
return KeyEvent.VK_3;
case '4':
return KeyEvent.VK_4;
case '5':
return KeyEvent.VK_5;
case '6':
return KeyEvent.VK_6;
case '7':
return KeyEvent.VK_7;
case '8':
return KeyEvent.VK_8;
case '9':
return KeyEvent.VK_9;
default:
return KeyEvent.VK_0;
}
}