【问题标题】:Can Selenium verify text inside a PDF loaded by the browser?Selenium 可以验证浏览器加载的 PDF 中的文本吗?
【发布时间】:2011-04-03 13:14:18
【问题描述】:

我的网络应用程序在浏览器中加载了一个 pdf。我已经弄清楚如何使用以下方法检查 pdf 是否已正确加载:

验证属性 xpath=//嵌入/@src {此处为 PDF 的网址}

如果能够使用 Selenium 检查 pdf 的内容,那就太好了 - 例如验证是否存在某些文本。有没有办法做到这一点?

【问题讨论】:

  • 我猜你说的是通过某种第三方插件嵌入页面中的 PDF 文件,不是吗?
  • 嗯,我猜是 Firefox 的 Adob​​e PDF 插件。不过,我对此并不太感兴趣-如果有什么我可以使用 Selenium 测试此 pdf 的内容,那么我很感兴趣。

标签: firefox testing pdf selenium selenium-ide


【解决方案1】:

虽然本机不支持,但我找到了几种使用 java 驱动程序的方法。一种方法是在浏览器中打开pdf(安装了adobe acrobat),然后使用键盘快捷键选择所有文本(CTRL+A),然后将其复制到剪贴板(CTRL+C),然后您可以验证剪贴板中的文本。例如:

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"));
}

另一种方法,仍然在 java 中,是下载 pdf,然后使用 PDFBox 将 pdf 转换为文本,有关如何执行此操作的示例,请参阅 http://www.prasannatech.net/2009/01/convert-pdf-text-parser-java-api-pdfbox.html

【讨论】:

    【解决方案2】:

    您无法在本机使用 WebDriver 执行此操作。但是,这里可以使用 PDFBox API 来读取 PDF 文件的内容。您必须首先将焦点转移到打开 PDF 文件的浏览器窗口。然后,您可以解析 PDF 文件的所有内容并搜索所需的文本字符串。

    Here 是使用 PDFBox API 在 PDF 文档中搜索的代码。

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

      • 不要只贴一堵代码墙。解释它是如何解决问题的。
      • 同意mzjn..请详细说明
      【解决方案4】:

      很遗憾,Selenium 根本无法做到这一点

      【讨论】:

        【解决方案5】:

        有办法。

        1. 点击链接前可以获取href值 element.FindElement(By.TagName("href")).Text
        2. 然后在 PDF 加载后,您可以获取 Url driver.GetUrl();
        3. 然后你就可以检查一下url是否包含href。

        这不是最好的,但总比没有好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-02-03
          • 2019-06-26
          • 2016-08-06
          • 2019-12-25
          • 1970-01-01
          • 1970-01-01
          • 2016-04-16
          • 2013-04-04
          相关资源
          最近更新 更多