【问题标题】:Simulating a remote website locally for testing在本地模拟远程网站进行测试
【发布时间】:2013-04-29 05:10:36
【问题描述】:

我正在开发一个浏览器扩展。该扩展程序适用于我们无法控制的外部网站。

我希望能够测试扩展程序。我面临的主要问题之一是在本地“按原样”显示网站。

是否可以在本地“按原样”显示网站?

我希望能够完全在本地为网站提供服务以进行测试。这意味着我想模拟完全相同的 HTTP 数据,包括 iframe 广告等。

  • 有没有简单的方法可以做到这一点?

更多信息:

我希望我的系统尽可能接近远程网站。例如,我想运行命令fetch,这将允许我在浏览器中访问该站点(没有打开互联网)并获得与其他情况完全相同的内容(包括不是来自单个域的信息,谷歌广告等)。

如果这有帮助,我不介意使用虚拟机。

我认为这在测试中非常有用。尤其是当我遇到错误时,我需要在具有许多随机因素(广告展示等)的网站中可靠地重现。

【问题讨论】:

    标签: http web browser-extension


    【解决方案1】:

    正如已经提到的,缓存代理应该可以为您解决问题(顺便说一句,这是最简单的解决方案)。有很多不同的实现,所以你只需要花一些时间选择一个合适的(根据我的经验 squid 是一个很好的解决方案)。无论如何,我想强调另外两个有趣的选项:

    选项 1:Betamax

    Betamax 是一个用于在测试中模拟外部 HTTP 资源(例如 Web 服务和 REST API)的工具。该项目的灵感来自 Ruby 的 VCR 库。 Betamax 旨在通过拦截您的应用程序发起的 HTTP 连接并重放之前记录的响应来解决这些问题。

    Betamax 有两种形式。第一个是 HTTP 和 HTTPS 代理,它可以拦截以尊重 Java 的 http.proxyHost 和 http.proxyPort 系统属性的任何方式产生的流量。第二个是 Apache HttpClient 的简单包装器。

    顺便说一句,Betamax 为您提供了一个非常有趣的功能:

    Betamax 是一种测试工具,而不是符合规范的 HTTP 代理。它会忽略通常用于防止代理缓存或存储 HTTP 流量的任何和所有标头。

    选项 2:Wireshark 和重播代理

    使用Wireshark 获取您感兴趣的所有流量并重播。我想说实现所需的回放工具并不难,但您可以使用名为replayproxy的可用解决方案@

    Replayproxy 解析来自 .pcap 文件的 HTTP 流 在端口 3128 上打开一个 TCP 套接字并作为 HTTP 代理进行侦听,使用提取的 HTTP 响应作为缓存,同时拒绝所有对未知 URL 的请求。

    这种方法为您提供完全控制和逐位精确模拟。

    【讨论】:

    • Replayproxy 听起来和我需要的完全一样,而且只有 200 行代码。我确信我将能够使用它的代码和wire-shark 来获得我需要的行为。这解决了我的问题,谢谢。
    【解决方案2】:

    我不知道有没有简单的方法,但是有方法的。

    您可以设置本地网络服务器,例如 IIS、Apache 或 minihttpd

    然后您可以使用wget 抓取网站内容。 (它有一个镜像选项)。许多浏览器都有“保存整个网页”选项,可以抓取所有内容,例如图像。

    广告很可能来自远程站点,因此您可能必须手动编辑 HTML 中的这些行以不引用实际的广告服务器,或者自己设置模拟广告(如横幅图片)。

    然后您可以将浏览器导航到http://localhost 以访问您的本地网站,假设端口为默认端口 80。

    希望这会有所帮助!

    【讨论】:

    • 谢谢。不过,我真的需要在我的电脑上获取这些广告。我希望测试环境尽可能接近真实环境。
    • 理论上您可以像主网站一样镜像广告,但在某些时候您可能会遇到这样一个事实,即许多广告/网站都是动态提供的,而不仅仅是通过静态内容.
    【解决方案3】:

    我假设您想为不受您控制的远程站点提供服务。在这种情况下,您可以使用代理服务器并让该服务器积极缓存每个响应。然而,这有它的局限性。首先,您必须通过此代理访问您打算使用的每个站点(例如使用浏览器),其次您将无法模拟表单处理。

    或者,您可以使用蜘蛛下载某个网站的所有内容。根据蜘蛛软件的不同,它甚至可以下载 JavaScript 构建的链接。然后,您可以使用网络服务器来提供该内容。

    【讨论】:

    • 代理服务器听起来是一个正确的idea,但是我如何在不必自己编写代理服务器的情况下继续实现这种事情呢?
    • 我不知道哪个代理可以做这种激进的缓存,但你可能想看看 squid,它相当流行。您使用的是什么操作系统?
    • 操作系统不是问题,我不介意为此使用 Windows 或 Linux。我们是一家资金充足的公司。
    • 好的,我认为你可以用 squid 做到这一点。如果我是正确的,您将需要使用 reply_header_access、*_ttl 和 minimum_expiry_time 指令,但我没有尝试过。
    【解决方案4】:

    此服务http://www.json-gen.com 通过 rest 为 html、json 和 xml 提供模拟。通过这种方式,您可以将前端与后端分开测试。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效,导致您的答案无用并因此被删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多