【问题标题】:Sandboxed JavaScript runtime engine (Chrome/Firefox/Opera/whatever)沙盒化 JavaScript 运行时引擎(Chrome/Firefox/Opera/whatever)
【发布时间】:2018-03-08 23:14:45
【问题描述】:

我有一个用 JS 编写的脚本。我想在沙盒模式下运行它,就好像它是某个浏览器一样,允许 DOM 操作和网络,但没有任何持久性(缓存、cookie、本地存储等)并且具有固定的执行持续时间(比如说 60秒)。

我想用一系列样本捕获 DOM 状态,然后分析其内容。

API 可以是 Java 无法访问的任何东西。

这是一个例子,我想实现的目标:

val myScript = "document.body.appendChild(document.createTextNode('foo'))"
Chrome.SandboxedWindow().execute(myScript, duration = 60, onDomDhanged = {
    snapshots.add(takeSnapsot()) // whatever
})
...
println(snapshots[0].domContents.toString())

有没有现成的解决方案,或者我可以从哪里开始?

【问题讨论】:

  • 可能一个所谓的“无头浏览器”是您想要使用的工具集吗? Here你可以找到很多这样的工具的集合。
  • 应该是的,谢谢
  • 我将此添加为答案,包括此类工具的示例!它看起来与您发布的代码 sn-p 非常相似。

标签: javascript browser


【解决方案1】:

总体

您的需求符合无头浏览器的描述。可以在here 找到其中一种描述。

没有图形用户界面的网络浏览器,以编程方式控制。用于自动化、测试和其他目的。 - Source

还有一个包含许多此类浏览器的列表。在您的情况下,jBrowserDriver 可能是正确的选择。但是列表很大,而且还有其他选择。

jBrowserDriver

以下显示了提供here 的示例。您应该将脚本打包在一个简单的 .html 文件中,之后可以使用 driver.get(); 加载该文件。您也可以为此简单地设置一个本地服务器。你的行println(snapshots[0].domContents.toString()) 已经看起来类似于示例中的行System.out.println(driver.getPageSource());

import org.openqa.selenium.WebDriver;
import com.machinepublishers.jbrowserdriver.Timezone;
import com.machinepublishers.jbrowserdriver.JBrowserDriver;
import com.machinepublishers.jbrowserdriver.Settings;

public class Example {
  public static void main(String[] args) {

    // You can optionally pass a Settings object here,
    // constructed using Settings.Builder
    JBrowserDriver driver = new JBrowserDriver(Settings.builder().
      timezone(Timezone.AMERICA_NEWYORK).build());

    // This will block for the page load and any
    // associated AJAX requests
    driver.get("http://example.com");

    // You can get status code unlike other Selenium drivers.
    // It blocks for AJAX requests and page loads after clicks 
    // and keyboard events.
    System.out.println(driver.getStatusCode());

    // Returns the page source in its current state, including
    // any DOM updates that occurred after page load
    System.out.println(driver.getPageSource());

    // Close the browser. Allows this thread to terminate.
    driver.quit();
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    相关资源
    最近更新 更多