在我们公司,我们需要对整个网站地图进行截图,手动完成这项工作是一个很大的痛苦。我已经使用 Webdriver API (Selenium 2) 在浏览器上截屏,但我们也有移动网络。谷歌浏览器具有设备尺寸设置,可将网站显示为移动网站。在 Google chrome 中无法调整大小的浏览器屏幕截图。不确定是否可以截取 Iphone、android 手机或两个虚拟设备的屏幕截图。研究后没有找到好的答案。我正在尝试实现一些可以自动截取任何移动网页的屏幕截图并将其保存到基于 URL 的特定目录中。我更喜欢使用任何 JAVA 库来执行此操作,但愿意接受任何建议。希望在这里得到最好的答案。
4 回答
从使用 Robotium 的设备
您可以使用 robotsium 从设备截取屏幕截图。来自 Robotium 项目网站的问答:
我可以从 Robotium 内部截取屏幕截图吗?
是的你可以。使用 takeScreenshot() 将屏幕截图保存在“/sdcard/Robotium-Screenshots/”中。请注意,此功能需要被测应用程序的 AndroidManifest.xml 中的写入权限 (android.permission.WRITE_EXTERNAL_STORAGE)。
从模拟器使用构建服务器
另一种方法是使用像 jenkins/hudson 这样的构建服务器。有一些插件可用于在构建期间启动模拟器并从该模拟器截取屏幕截图。
回顾一下,您需要一个 API 来捕获使用不同视口的某些网站的自动屏幕截图,并且可能还有不同的用户代理标头,因为您希望它在移动设备上看起来是真实的。
我个人对以下两个 API 有很好的体验:
screenshotlayer API - https://screenshotlayer.com
url2png - http://url2png.com
我将快速提示您如何使用 iPhoneviewport
和user-agent
(使用screenshotlayer API,因为它是免费的)捕获屏幕截图:
这是您将使用的 API 请求 URL:
http://api.screenshotlayer.com/api/capture
? access_key = YOUR_ACCESS_KEY
& url = http://www.tumblr.com
& user_agent = Mozilla/5.0 (iPhone; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A366 Safari/600.1.4&viewport=375x667
& viewport = 375x667
现在 API 将返回给定 URL 的 iPhone 6 屏幕截图(在我们的例子中tumblr.com)。
对于 url2png 它非常相似。希望这可以帮助!
编辑
我忘了提 - 你可以指定一个 `ftp' 路径来将快照导出到
你可以试试ApiFlash Screenshot API。该 API 基于 Chrome,因此渲染接近像素完美,并且始终保持最新的网络标准。
您可以使用width
和height
参数控制屏幕截图的大小。这是一个完整的 Java 示例,您可以根据自己的特定问题进行调整。
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
public class Main {
public static void main(String[] args) throws Exception {
String accessKey = "YOUR_ACCESS_KEY";
String apiUrl = "https://api.apiflash.com/v1/urltoimage";
URL url = new URL(String.format("%s?access_key=%s&url=google.com&width=800&height=600", apiUrl, accessKey));
InputStream inputStream = url.openStream();
OutputStream outputStream = new FileOutputStream("screenshot.jpeg");
byte[] b = new byte[2048];
int length;
while ((length = inputStream.read(b)) != -1) {
outputStream.write(b, 0, length);
}
inputStream.close();
outputStream.close();
}
}