1

我正在尝试使用 Selenium 从站点下载 Excel 文件。

我这样做的方式:

    WebElement excelList = driver.findElement(By.xpath("..."));

    excelList.click();

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    String pageSource = driver.getPageSource();
    FileOutputStream fos = new FileOutputStream("d:/load.xls");

    for (int i = 0; i < pageSource.length(); i++) {
        char c = pageSource.charAt(i);


        fos.write((byte) c);
    }

    fos.close();

页面源字符串长度等于我从该站点手动下载的文件大小。

问题是我保存数据不正确,MS Excel 无法打开保存的文件。

如何正确保存文件?

4

2 回答 2

0

您可以尝试使用String.getBytes()将字符重新编码回字节流,但这可能仍然行不通。

基本上,为了将您的 excel 文件的二进制数据保存在字符串中,必须使用字符集对数据进行解码。因为不应将 excel 文件作为纯文本读取,所以可能有很多字节序列不是有效的字符编码。这些字节序列在解码String时可能只是表示为“?” (尽管这取决于Charset实际使用的那个)。当您尝试使用或任何其他方法重新编码字符时,String.getBytes()那些“?” 字符不会被转换回它们的原始字节,而是会被转换为 unicode 问号字符的编码,这对于 excel 文件格式几乎肯定是无效的。

真正的问题是,为什么需要通过 Se 下载这个文件?Se 是关于测试浏览器如何呈现网页的。如果您需要 Excel 文件,为什么不直接从您单击 Se 的链接中获取 href,然后使用HttpUrlConnection标准二进制文件简单地下载文件InputStream

于 2012-10-03T15:13:43.977 回答
0

我想到了。

我只需要在单击加载文件按钮后从最后一页获取输入流。但是获取页面对象“lastPage()”的方法具有受保护的访问权限。

这是方法:

 private static void saveExcelFile(HtmlUnitDriver driver)  {
    Method m = driver.getClass().getDeclaredMethod("lastPage", null);
    m.setAccessible(true);
    Object obj = m.invoke(driver, null);

    Page page = (Page) obj;

    InputStream stream = page.getWebResponse().getContentAsStream();

    FileOutputStream fos = new FileOutputStream("d:/load.xls");

    int c;

    while ((c = stream.read()) != -1) {
        fos.write(c);
    }

    fos.close();
}
于 2012-10-03T20:34:14.517 回答