использование робота для сохранения веб-страницы с разными именами

Я использую 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, а во-вторых, как я могу заставить его передавать другое имя или, по крайней мере, не переопределять страницы, когда имя файла такое же?


person lonesome    schedule 24.01.2016    source источник
comment
почему вы используете робота? Разве вы не можете просто использовать driver.getPageSource(), чтобы получить исходный код и сохранить его в виде файла?   -  person Cyril    schedule 24.01.2016
comment
@Cyril Я пробовал все эти способы, и они не работают (по крайней мере) для IEEE xplore, который содержит академические PDF-файлы. Я также пробовал другие способы загрузить ссылку в формате PDF и сохранить страницу, но опять же, для ieee это не работает.   -  person lonesome    schedule 25.01.2016


Ответы (1)


Ты прав. Когда мы используем driver.getPageSource(), css, скрипты и связанные с ними ресурсы не сохраняются и не могут быть правильно просмотрены в автономном режиме.

Я смог сохранить файл, используя тот же код. Это был всего лишь вопрос добавления Thread.sleep() после каждой операции.

Обратите внимание, что когда открывается окно «Сохранить как», фокус находится на имени файла. Таким образом, вы можете использовать класс Robot для ввода имени файла. Что касается вашей проблемы с именем файла, которое не должно перезаписываться, вы можете использовать генератор случайных чисел. Возможно, вам придется создать функцию для облегчения этой задачи.

Пожалуйста, проверьте приведенный ниже код.

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;
    }
}
person Sighil    schedule 27.01.2016
comment
Этот ответ рулит!! Но может ли сон для нити стать короче? - person lonesome; 27.01.2016
comment
Я думаю, что Thread.sleep() после операции Ctrl + S должно оставаться равным 5 секундам, потому что для открытия окна «Сохранить как» требуется некоторое время (это также может быть более 5 секунд в зависимости от загрузки вашей системы). Вы можете уменьшить другой. - person Sighil; 27.01.2016
comment
Есть еще вопрос. Вы уверены, что функция выдает случайные целые числа, скажем, для 1000 экземпляров? - person lonesome; 27.01.2016
comment
В настоящее время выдает только случайные числа в диапазоне 100... Вы можете изменить код для увеличения диапазона - RandomStringUtils.randomNumeric(4). Также соответствующим образом измените код робота. - person Sighil; 27.01.2016
comment
В порядке. извините за еще один вопрос. Мне было интересно, как приказать роботу закрыть окно? может быть полезно использовать mousepress и щелкнуть по нему в правом верхнем углу экрана, но браузер не открывает полноэкранный режим. как разрешить браузеру открываться на весь экран? или есть более простой способ закрыть окно? - person lonesome; 27.01.2016
comment
Используйте селен - driver.quit() - person Sighil; 27.01.2016
comment
но это может закрыть окно на полпути сохранения страницы. - person lonesome; 27.01.2016
comment
В Firefox ctrl + j откроет окно загрузок Firefox. Вы можете использовать робота, чтобы открыть это. Проверьте, закрывает ли driver.quit() и это окно. Если нет, загрузка завершится успешно - person Sighil; 27.01.2016