Estou usando Selenium e Java juntos para aprender automação. Para esse problema específico, estou tentando usar Selenium para ir para um link do Google Drive que contém um PDF e, em seguida, tirar uma captura de tela de cada página do PDF e, em seguida, salvar cada captura de tela em um arquivo que o usuário pode nomear. O problema é que ele está tirando capturas de tela da primeira página e não rolando para baixo para cada página individual do PDF. Aqui está o link de teste com o qual estou trabalhando ( https://drive.google.com/file/d/1optp32jv20rvyiSBcCdI_a7C1jRR1UT4/view ).
Abaixo está o código que estou usando:
package googleDriveScreenshotTest;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.io.FileHandler;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.io.File;
import java.io.IOException;
import java.time.Duration;
import java.util.Scanner;
public class PdfScreenShotTest2{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Get user inputs with validation
String pdfUrl = getUserInput(scanner, "Enter Google Drive PDF link: ");
String folderName = getUserInput(scanner, "Enter folder name to save images: ");
int totalPages = getValidPageCount(scanner);
// Setup WebDriver
WebDriver driver = new ChromeDriver();
try {
// Create directory with error handling
File screenshotDir = createScreenshotDirectory(folderName);
// Navigate to PDF
driver.get(pdfUrl);
driver.manage().window().maximize();
// Wait for document to load
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15));
WebElement body = wait.until(ExpectedConditions.elementToBeClickable(By.tagName("body")));
// Click anywhere on page
body.click();
// Take screenshots of each page
for (int pageNumber = 1; pageNumber <= totalPages; pageNumber++) {
File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
File destination = new File(screenshotDir + "/page_" + pageNumber + ".png");
try {
FileHandler.copy(screenshot, destination);
System.out.println("Saved: " + destination.getAbsolutePath());
if (pageNumber < totalPages) {
body.sendKeys(Keys.PAGE_DOWN);
Thread.sleep(2000); // Allow time for scrolling
}
} catch (IOException e) {
System.err.println("Error saving screenshot for page " + pageNumber + ": " + e.getMessage());
}
}
} catch (Exception e) {
System.err.println("An error occurred: " + e.getMessage());
} finally {
driver.quit();
scanner.close();
}
}
private static String getUserInput(Scanner scanner, String prompt) {
while (true) {
System.out.print(prompt);
String input = scanner.nextLine().trim();
if (!input.isEmpty()) {
return input;
}
System.out.println("Input cannot be empty. Please try again.");
}
}
private static int getValidPageCount(Scanner scanner) {
while (true) {
try {
System.out.print("Enter number of pages in PDF: ");
int count = scanner.nextInt();
scanner.nextLine(); // Consume newline
if (count > 0) {
return count;
}
System.out.println("Please enter a positive number.");
} catch (Exception e) {
System.err.println("Invalid input. Please enter a valid number.");
scanner.nextLine(); // Clear invalid input
}
}
}
private static File createScreenshotDirectory(String folderName) throws IOException {
String downloadPath = System.getProperty("user.home") + "/Downloads/" + folderName;
File folder = new File(downloadPath);
if (!folder.exists()) {
if (!folder.mkdirs()) {
throw new IOException("Failed to create directory: " + downloadPath);
}
}
return folder;
}
}
Seu problema provavelmente decorre do visualizador de PDF do Google Drive usar um sistema de renderização baseado em tela , o que impede o Selenium de interagir corretamente com páginas individuais.
A
Keys.PAGE_DOWN
abordagem não é confiável porque o Google Drive pode não registrá-lo corretamente, ou o PDF pode não carregar completamente antes da próxima captura de tela ser feita.Existem vários "Visualizadores" que "Descrevem" a si mesmos muito vagamente como um pré-visualizador de "PDF". O que eles querem dizer é que eles baixam texto e imagens que são reproduções emulando partes de um PDF ARMAZENADO/SEGURO NA NUVEM.
PDF.JS como usado no Firefox é o exemplo primário. No entanto, Google, Microsoft e muitos outros visualizadores servidos na nuvem fazem algo parecido.
Podemos ver que não é um PDF, pois durante a inspeção o conteúdo é claramente PNG, que é redimensionado em diferentes escalas ao aumentar ou diminuir o zoom.
Portanto, para um documento de 62 páginas, é necessário que todo o documento seja rolado e os pontos salvos como imagens do inspetor, no maior tamanho de tela possível para obter qualidade.
Quando você tiver todos os 62 blobs, será necessário salvar a página HTML que contém o texto e o posicionamento dos números aleatórios ou renumerá-la manualmente por inspeção visual.
Portanto, é possível reconstruir o pretend.pdf, mas realmente não vale a pena o esforço, a menos que a fonte tenha sido excluída.
Isso não foi tão fácil quanto eu pensei que seria. Descobri que nenhum dos métodos de rolagem JS funciona nesta página. Em vez de tirar uma captura de tela da página, tirei capturas de tela de cada tag IMG que corresponde a um slide. Isso também rolou a página, então...
O código abaixo funciona... ele tira uma captura de tela de cada slide. Primeiro, ele analisa o controle que exibe o número de páginas no PDF e, em seguida, faz um loop por cada tag IMG e tira uma captura de tela dela. Você provavelmente vai querer alterar o caminho de saída.