【问题标题】:How the get the whole source html code of a webpage that is generated by Javascript using Java / Webdriver?如何获取由 Javascript 使用 Java / Webdriver 生成的网页的整个源 html 代码?
【发布时间】:2020-07-31 20:41:07
【问题描述】:

我是编程新手,我有一个任务需要解决。我正在尝试使用 Java / Webdriver 方法getPageSource() 获取网页的 html 源代码。问题是,该页面是以某种方式生成的,可能是由 javascript 生成的,所以我得到的结果是只包含页面骨架的 html 代码 - 一个空的表,没有被数据填充。但是,在该 html 代码的最底部有一个像 <script type="text/javascript" src="/x/js/main.c0e805a3.js"></script> 这样的标签。 问题是,我怎样才能强制 Webdriver 运行该 Javascript 并给我结果 - 带有数据的整个源 html。在调用getPageSource() 之前,我已经尝试使用这个(js.executeScript("window.location = '/x/js/main.c0e805a3.js'");),但没有成功。

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: javascript java html selenium-webdriver


    【解决方案1】:

    现在有很多设置可以在网页上运行 Java 脚本。我认为最著名的可能是Selenium,因为我认为它已经存在了一段时间。其他包括karatePuppeteer,甚至还有一个叫做Rhino的旧工具。 Puppeteer 是 Google, Inc. 的一个项目,它使用 Java-Script(服务器端 Java-Script,称为 Node.js。他们不喜欢我们在这里比较、对比库。

    我还没有时间接触 Selenium,但我一直在编写 HTML 解析器、搜索和更新代码。如果您的唯一目标是加载一个其内容是动态“由 AJAX 调用填充”的页面 - 我的意思是,您只需要在您访问网站网页时通常会看到的 HTML 内容,而且你不关心按钮按下那么我一直使用的那个叫做 Splash 这个工具确实可以让您调用 Java 脚本,但如果您只想查看页面上的 JS 动态加载表格,那么从字面上看,您所要做的就是启动工具,然后添加一个一行到你的程序。

    在 Google Cloud Platform 上,这两行代码将启动 Splash 代理服务器。如果您在 AWS (Amazon) 或 Azure (Microsoft) 上编写代码,它可能是相似的。如果您在办公室的本地机器上运行代码,则必须研究如何启动它。

    安装 Docker。确保已安装 Docker 版本 >= 17。

    拉取图片:

     $ sudo docker pull scrapinghub/splash
    

    启动容器:

    $ sudo docker run -it -p 8050:8050 --rm scrapinghub/splash
    

    然后,在您的代码中,您所要做的就是:

    // If your original code looked like this:
    URL url = new URL("https://en.wikipedia.org/wiki/Christopher_Columbus");
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    con.setRequestMethod("GET");
    con.setRequestProperty("User-Agent", USER_AGENT);
    return new BufferedReader(new InputStreamReader(con.getInputStream()));
    

    将此示例中的第一行代码更改为此,并且(理论上)动态加载的 HTML 表格将在返回 HTML 页面之前自动加载,这些表格使用 onload 页面事件完成。

    // Add this line to your methods
    String splashProxy = "http://localhost:8050/render.html?url=";
    URL url = new URL(splashProxy + "https://en.wikipedia.org/wiki/Christopher_Columbus");
    

    对于大多数网站,任何由 JS/jQuery/AJAX 填充的初始表格都会被填充。如果您愿意学习Lua Programming Language,您也可以开始调用那里的方法。这对我的目的来说非常方便,因为我不是在编写网页测试代码(模拟用户按钮按下的代码)。如果您正在这样做,那么 Selenium 可能值得花时间学习/研究 A.P.I.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      相关资源
      最近更新 更多