HtmlUnit 下载文件后无法检索页面

2023-12-25

我在 Java 中的 HtmlUnit 中遇到了这个奇怪的问题。我用它从网站下载一些数据,过程是这样的:

1 - 登录

2 - 对于每个元素(汽车)

----- 3 搜索汽车

----- 4 从链接下载 zip 文件

代码:

创建网络客户端:

webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
webClient.setJavaScriptEnabled(true);
webClient.setThrowExceptionOnScriptError(false);
DefaultCredentialsProvider provider = new DefaultCredentialsProvider();
provider.addCredentials(USERNAME, PASSWORD);
webClient.setCredentialsProvider(provider);
webClient.setRefreshHandler(new ImmediateRefreshHandler());

Login:

  public void login() throws IOException
  {
    page = (HtmlPage) webClient.getPage(URL);
    HtmlForm form = page.getFormByName("formLogin");

    String user = USERNAME;
    String password = PASSWORD;

    // Enter login and password
    form.getInputByName("LoginSteps$UserName").setValueAttribute(user);
    form.getInputByName("LoginSteps$Password").setValueAttribute(password);

    // Click Login Button
    page = (HtmlPage) form.getInputByName("LoginSteps$LoginButton").click();

    webClient.waitForBackgroundJavaScript(3000);

    // Click on Campa area
    HtmlAnchor link = (HtmlAnchor) page.getElementById("ctl00_linkCampaNoiH");
    page = (HtmlPage) link.click();

    webClient.waitForBackgroundJavaScript(3000);
    System.out.println(page.asText());
  }

在网站中搜索汽车:

private void searchCar(String _regNumber) throws IOException
 {
// Open search window
page = page.getElementById("search_gridCampaNoi").click();

webClient.waitForBackgroundJavaScript(3000);

// Write plate number
HtmlInput element = (HtmlInput) page.getElementById("jqg1");
element.setValueAttribute(_regNumber);

webClient.waitForBackgroundJavaScript(3000);

// Click on search
HtmlAnchor anchor = (HtmlAnchor) page.getByXPath("//*[@id=\"fbox_gridCampaNoi_search\"]").get(0);
page = anchor.click();

webClient.waitForBackgroundJavaScript(3000);
System.out.println(page.asText());
}

下载pdf:

    try
    {
      InputStream is = _link.click().getWebResponse().getContentAsStream();
      File path = new File(new File(DOWNLOAD_PATH), _regNumber);
      if (!path.exists())
      {
        path.mkdir();
      }
      writeToFile(is, new File(path, _regNumber + "_pdfs.zip"));
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }

问题:

第一辆车工作正常,pdf已下载,但是当我搜索新车时,当我到达这一行时:

page = page.getElementById("search_gridCampaNoi").click();

我得到这个异常:

Exception in thread "main" java.lang.ClassCastException: com.gargoylesoftware.htmlunit.UnexpectedPage cannot be cast to com.gargoylesoftware.htmlunit.html.HtmlPage

经过调试,我意识到在我拨打这个电话的那一刻:

InputStream is = _link.click().getWebResponse().getContentAsStream();

page.getElementById("search_gridCampaNoi").click() 的返回类型从 HtmlPage 更改为 WebResponse,因此我不再收到新页面,而是再次收到已下载的文件。

显示这种情况的调试器的几个屏幕截图:

第一次调用,返回类型OK:

第二次调用,返回类型更改,我不再收到 Html 页面:

提前致谢!


以防万一有人遇到同样的问题,我找到了一个解决方法。更改行:

InputStream is = _link.click().getWebResponse().getContentAsStream();

to

InputStream is = _link.openLinkInNewWindow().getWebResponse().getContentAsStream();

似乎可以解决问题。我现在在进行多次迭代时遇到问题,有时有效,有时无效,但至少我现在有了一些东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HtmlUnit 下载文件后无法检索页面 的相关文章

随机推荐

  • Android 编程断言

    你能在android编程中使用断言吗 如果是这样 你如何在 Eclipse 中启用它 因为问题是是否可能 是的 这是可能的 但我同意 CommonsWare 认为应该避免断言 无论如何看到我可以在 Android 设备上使用断言吗 http
  • Spark 1.6 在 EMR 上写入 S3,因为 Parquet 挂起并失败

    我正在创建一个 uber jar Spark 应用程序 将其提交到 EMR 4 3 集群 我正在配置 4 个 r3 xlarge 实例 其中一个作为主实例 另外三个作为核心 我从控制台预安装了 hadoop 2 7 1 ganglia 3
  • 递归构造函数调用错误找不到解决方案

    我在四个公共金枪鱼部分 部分 可能是一个类或其他东西 处收到递归构造溢出调用错误 它适用于教程 但不适合我 似乎看不到在哪里 public class tuna private int hour private int minute pri
  • 如何检查变量是否是数组?

    我对变量名有一个循环 我需要检查变量的内容是否是数组 for varname in AA BB CC do local val if varname is array then how can I perform this test ech
  • 如何在 Chrome DevTools 网络面板中按文本和属性进行过滤?

    我想通过 URL 中的方法属性和文本过滤 Chrome DevTool 的网络面板 例如 如果我在 URL 中搜索文本 chromequestion 并且仅搜索 HTTP GET 请求 忽略 PUT POST DELETE 等 I am a
  • JOOQ 查询的时间戳精度

    我有一个 PSQL 原始查询 我想将其转换为 JOOQ 查询 SELECT DISTINCT date trunc day ref date AS refdate FROM income WHERE probos id probosId 我
  • 在 python lxml 库中使用西里尔字母的正确方法是什么

    我尝试生成其中包含西里尔字母符号的 xml 文件 但结果却出人意料 避免这种结果的最简单方法是什么 例子 from lxml import etree root etree Element print etree tostring root
  • 监听元素的创建,并在元素出现在 Chrome 扩展程序的页面上时触发事件

    是否可以让 Chrome 扩展监听尚未创建的元素的出现 假设用户单击按钮并且单击事件创建一个元素 div My Div div 并将其添加到页面 DOM 是否可以设置一个侦听器 在该元素出现时自动触发事件 或者我是否必须每隔 X 毫秒轮询页
  • 智能字段注释 - valuehelp 下拉菜单

    我有一个值帮助字段 并且只想在下拉列表中查看说明 而不是代码 选择后 想要将代码存储在另一个处于隐藏模式的字段中 为此 我定义了以下注释
  • 还有比 PHPDoc 更好的吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有人使用其他任何东西来记录他们的PHP代码比PHPDoc 是否有任何工具可以读取相同的文档语法但提
  • 在 PowerShell 中启用本地用户权限分配

    我之前问过类似的问题 以便在某个域用户的 PowerShell 中获得本地用户权限 现在我想启用该权限 我希望启用一些权限 但在本示例中 我将使用登录作为批处理作业 默认情况下 Windows Server 2008 中没有 Ntright
  • Knockout 中 Observable 的设置值未更新

    每天都有大量的问题链接回为什么我不能设置可观察值的值 而不是有这么多不同的答案说同样的事情 我想创建一个问题供每个人参考 Knockout Observable Observable Array 的设置值不会更新 设置我的可观察 obser
  • 使用 OpenXML 将背景图像添加到 Excel

    我正在使用 Open XML 创建 Excel 我想向 Excel 添加背景图像 不要告诉我将图像添加到 Excel 并与 OpenXML Productivity Tool 进行比较 请让我知道执行此操作的提取方法 我已经深入研究使用 O
  • 如何在Flask Sqlalchemy中分离Master Slave(DB读/写)

    我正在尝试通过 Flask Sqlalchemy 分离读取和写入数据库操作 我正在使用绑定来连接到 mysql 数据库 我想在主机中执行写入操作并从从机中读取操作 似乎没有内置的方法来处理这个问题 我是Python新手 很惊讶像这样急需的功
  • 以低优先级启动进程(使用 Runtime.exec / ProcessBuilder.start)

    我需要在低优先级下启动一个 CPU 密集型系统进程 这样它就不会减慢我的服务器速度 我怎样才能在 Linux 上做到这一点 这与这个问题类似 使用 Runtime exec ProcessBuilder start 以低优先级启动 Java
  • Java随机类不是真正随机的?

    我正在尝试模拟我发现的数学难题http blog xkcd com 2010 02 09 math puzzle http blog xkcd com 2010 02 09 math puzzle 然而 java random 类返回奇怪的
  • 退出系统调用的正确常量是什么?

    我正在尝试学习 x86 64 汇编 并使用 GCC 作为我的汇编器 我使用的确切命令是 gcc nostdlib tapydn S D ASSEMBLY 我主要使用 gcc 作为其预处理器 这是tapydn S global start i
  • 在:数字之前右对齐 CSS?

    我想要对段落进行编号 而不需要使用有序列表 我试图通过在 CSS 中使用 content counter paragraph 来实现此目的 以便我创建的每个段落块都会在其左侧生成一个数字 pass counter reset paragra
  • 按日期差异对结果排序

    我们有一个按输入日期的 1 个月的日期范围查询的 solr 结果 如果我输入 2012 12 01 我会得到从 2012 11 01 到 2013 01 01 的结果集 这工作正常 但我们希望在与输入日期的日期差异之后对结果进行排序 例如
  • HtmlUnit 下载文件后无法检索页面

    我在 Java 中的 HtmlUnit 中遇到了这个奇怪的问题 我用它从网站下载一些数据 过程是这样的 1 登录 2 对于每个元素 汽车 3 搜索汽车 4 从链接下载 zip 文件 代码 创建网络客户端 webClient new WebC