Запуск JSDOM в Нашорне

Я хочу сделать d3 диаграммы на сервере. У меня было 3 варианта: Node, Phantom и Nashorn.

Я предпочитаю Nashorn, потому что мой API - это Scala Play, и я не хочу управлять другим процессом. (развертывание, загрузка, очередь и т. д. и т. д.)

Так что теперь мне нужно, чтобы JSDom работал в Nashorn, чтобы у D3 было что визуализировать.

Это работает до сих пор, но я не могу понять, как добавить JSDOM

class Application @Inject() (val messagesApi: MessagesApi) extends api.ApiController {

  def test = ApiAction { implicit request =>
    ok("The API is ready")
  }

  def pptx = Action { implicit request =>
    val manager: ScriptEngineManager = new ScriptEngineManager
    val engine: ScriptEngine = manager.getEngineByName("nashorn")
    engine.eval(new FileReader(Play.getFile("/ext/lodash.js")))
    val output = engine.eval("function hello(){return _.join('Hello world nashorn does this thing'.split(' '), '-');} hello();")
    Ok(output.toString)
  }
}

1 ответ

Решение

Я загружаю вилку домино в nashorn для запуска d3. Domino - это реализация DOM на стороне сервера, основанная на dom.js. в Mozilla. Я загрузил его, используя r.js из require.js. Вы можете использовать эту полезную функцию, которая отсутствует в nashorn, чтобы заставить require.js работать.

Вы можете использовать драйвер Chrome Selenium без браузера.

public class Test {
    public static void main(String args[]) {
        System.setProperty("webdriver.chrome.driver", "D:\\Program-Files\\chromedriver_win32\\chromedriver.exe");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--headless");

        WebDriver driver = new ChromeDriver(options);
        try {
           // String html_content = "<html><head></head><body><div>Hello World</div></body></html>";
            //driver.get("data:text/html;charset=utf-8," + html_content);
            driver.get("D:\\Projects\\Selenium1\\inputfile.html");
            JavascriptExecutor js = (JavascriptExecutor) driver;
            String html1 = (String) js.executeScript("return document.head.innerHTML;");
            System.out.println(html1);
            String html = (String) js.executeScript("return document.body.innerHTML;");
            System.out.println(html);
        } finally {
            driver.quit();
        }
    }
}
Другие вопросы по тегам