我正在尝试使用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无法打开保存的文件。
如何正确保存文件?
答案 0 :(得分:0)
您可以尝试使用String.getBytes()
将字符重新编码回字节流,但这可能仍然无法正常工作。
基本上,为了将excel文件的二进制数据保存在字符串中,必须使用字符集对数据进行解码。因为excel文件不应该被读作纯文本,所以可能有很多字节序列不是有效的字符编码。解码为String
时,这些字节序列可能只表示为“?” (虽然这取决于实际使用的Charset
)。当您尝试使用String.getBytes()
或任何其他方法重新编码字符时,那些'?'字符不会转换回原始字节,而是转换为unicode问号字符的编码,这几乎肯定对excel文件格式无效。
真正的问题是,为什么需要通过Se下载此文件? Se是关于测试浏览器如何呈现网页的。如果您需要Excel文件,为什么不只是从您使用Se单击的链接中获取href,然后使用简单的HttpUrlConnection
使用标准二进制文件InputStream
下载文件?
答案 1 :(得分: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();
}