我有一个用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())
是否有现成的解决方案,或者我可以从哪里开始?
答案 0 :(得分:1)
您的需求符合无头浏览器的描述。其中一个描述可以找到here。
没有图形用户界面的Web浏览器,以编程方式控制。用于自动化,测试和其他目的。 - Source
还有一个包含大量此类浏览器的列表。在您的情况下,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();
}
}