2010-08-25 89 views
15

Mi aplicación web carga un pdf en el navegador. He descubierto la manera de comprobar que el PDF se ha cargado correctamente usando:¿Puede Selenium verificar el texto dentro de un PDF cargado por el navegador?

verifyAttribute XPath = // embed/@ src {URL de PDF va aquí}

Sería muy agradable poder verifique el contenido del pdf con Selenium, por ejemplo verifique que haya algún texto presente. ¿Hay alguna manera de hacer esto?

+0

Supongo que usted está hablando de un archivo PDF procesado incrustado en una página a través de un tipo de complemento de terceros, ¿no? –

+0

Hmm, sí, el plugin de Adobe PDF para Firefox, supongo. Aunque no estoy demasiado atada a eso, si hay algo que pueda probar sobre este pdf usando Selenium, entonces estoy interesado. –

Respuesta

16

Aunque no es compatible de forma nativa, he encontrado un par de formas utilizando el controlador Java. Una forma es tener el pdf abierto en su navegador (con Adobe Acrobat instalado) y luego usar las teclas de método abreviado para seleccionar todo el texto (CTRL + A), luego copiarlo en el portapapeles (CTRL + C) y luego verificar el texto en el portapapeles por ejemplo:

protected String getLastWindow() { 
    return session().getEval("var windowId; for(var x in selenium.browserbot.openedWindows){windowId=x;} "); 
} 

@Test 
public void testTextInPDF() { 
    session().click("link=View PDF"); 
    String popupName = getLastWindow(); 
    session().waitForPopUp(popupName, PAGE_LOAD_TIMEOUT); 
    session().selectWindow(popupName); 

    session().windowMaximize(); 
    session().windowFocus(); 
    Thread.sleep(3000); 

    session().keyDownNative("17"); // Stands for CTRL key 
    session().keyPressNative("65"); // Stands for A "ascii code for A" 
    session().keyUpNative("17"); //Releases CTRL key 
    Thread.sleep(1000); 

    session().keyDownNative("17"); // Stands for CTRL key 
    session().keyPressNative("67"); // Stands for C "ascii code for C" 
    session().keyUpNative("17"); //Releases CTRL key 

    TextTransfer textTransfer = new TextTransfer(); 
    assertTrue(textTransfer.getClipboardContents().contains("Some text in my pdf")); 
} 

Otra manera, todavía en java, es descargar el pdf y luego convertir el PDF a texto con PDFBox, ver http://www.prasannatech.net/2009/01/convert-pdf-text-parser-java-api-pdfbox.html para un ejemplo de cómo hacer esto.

0

Lamentablemente no se puede hacer esto en absoluto con selenio

0

puede utilizar Selenium Web Driver y el proyecto Google Match y Diff para leer el contenido de PDF en selenio y hacer una comparación.

Read the article here.

+0

Se necesita suscripción para leer el artículo. – jwg

+0

+1 No sé cómo puede haber cambiado esto, pero puedo leer este artículo sin ninguna suscripción. Y el artículo contiene una descripción completa de cómo hacer el trabajo, especialmente una gran cantidad de código. Por supuesto, hubiera sido aún mejor cuando @Selenium Guru elevó el concepto de esta solución en su respuesta un poco más. –

1

No se puede hacer esto utilizando WebDriver forma nativa. Sin embargo, PDFBox API se puede utilizar aquí para leer el contenido del archivo PDF. En primer lugar, tendrá que cambiar el foco a la ventana del navegador donde se abre el archivo PDF. Luego puede analizar todo el contenido del archivo PDF y buscar la cadena de texto deseada.

Here es un código para usar PDFBox API para buscar dentro de un documento PDF.

1
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.PrintWriter; 
import org.pdfbox.cos.COSDocument; 
import org.pdfbox.pdfparser.PDFParser; 
import org.pdfbox.pdmodel.PDDocument; 
import org.pdfbox.util.PDFTextStripper; 

public class pdfToTextConverter { 

public static void pdfToText(String path_to_PDF_file, String Path_to_output_text_file) throws FileNotFoundException, IOException{ 
    //Parse text from a PDF into a string variable 
    File f = new File("path_to_PDF_file"); 

    PDFParser parser = new PDFParser(new FileInputStream(f)); 
    parser.parse(); 

    COSDocument cosDoc = parser.getDocument(); 
    PDDocument pdDoc = new PDDocument(cosDoc); 

    PDFTextStripper pdfStripper = new PDFTextStripper(); 
    String parsedText = pdfStripper.getText(pdDoc); 

    System.out.println(parsedText); 

    //Write parsed text into a file 
    PrintWriter pw = new PrintWriter("Path_to_output_text_file"); 
    pw.print(parsedText); 
    pw.close(); 

} 

} 


JAR Source 
http://sourceforge.net/projects/pdfbox/files/latest/download?source=files 
+4

No solo publique una pared de código. Explica cómo resuelve el problema. – mzjn

+0

de acuerdo con mzjn .. por favor complételo más –

Cuestiones relacionadas