首页 > 解决方案 > 如何获取由 Javascript 使用 Java / Webdriver 生成的网页的整个源 html 代码?

问题描述

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

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

标签: javascriptjavahtmlselenium-webdriver

解决方案


现在有很多设置可以在网页上运行 Java 脚本。我认为最有名的可能是Selenium因为我认为它已经存在了一段时间。其他的包括karate, Puppeteer,甚至还有一个叫做Rhino. Puppeteer 是一个使用 Java-Script(服务器端 Java-Script,称为Node.js.

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

在 Google Cloud Platform 上,这两行将启动Splash Proxy Server。如果您在 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()));

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

// 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 可能值得花时间学习/研究 API


推荐阅读