如何在 PhantomJS 中使用 DOMParser?
How to use DOMParser in PhantomJS?
以下代码段可以正常工作,returns Firefox、Chrome 和 Safari Web 控制台中的文档节点。但是,它 returns 在 PhantomJS 1.9.8 中为 null。
(new DOMParser()).parseFromString("<div></div>", "text/html");
知道为什么会返回 null 吗?
您可能已经注意到 parseFromString()
接受第二个参数,表示预期的类型。 HTML 根本不支持 PhantomJS(当前版本 2.0.0):
As this page notes, PhantomJS 2 is based on WebKit 538.1 (October/November 2013) and the above table shows that HTML support was added into Chrome with version 30 which came out on 1. Oktober 2013 已经是 Blink(是的,德语 WikiPedia 页面比英语页面好)。根据开发周期,它可能出现在更高版本的 WebKit 中。
其他方式
PhantomJS 可以从 "text/xml" 创建文档。所以如果你有xhtml,你可以这样解析。
您还可以查看其他解析方式 HTML。这篇 MDN 文章在这方面很广泛:HTML to DOM.
如果还是不行,你可以试试看有没有node.js模块能不能充分解析HTML。 PhantomJS 和 node.js 具有不同的执行环境,但是几乎没有依赖关系的模块往往可以在两者中工作。
你可以使用像这样的 polyfill:
https://gist.github.com/eligrey/1129031
如果您将其复制到 vendor/assets/javascripts
,您可以让它只在测试中加载:
# config/initializers/assets.rb
Rails.application.config.assets.precompile += %w(html-domparser.js)
# app/views/layouts/application.html.erb
<%= javascript_include_tag 'html-domparser' if Rails.env.test? =>
或者,如果您有兴趣支持旧版浏览器,您可以像加载任何其他 js 一样在所有环境中加载它。
建立在@schpet 写的内容之上。
如果您对 application.html.erb 中的 if Rails.env.test?
感到奇怪。
这对我有用:
在 rails_helper.rb:
Capybara.register_driver :poltergeist do |app|
options = {
phantomjs: "/usr/local/bin/phantomjs",
extensions: [
Rails.root.join("vendor", "assets", "javascripts", "html-domparser.js"),
],
}
Capybara::Poltergeist::Driver.new(app, options)
end
以下代码段可以正常工作,returns Firefox、Chrome 和 Safari Web 控制台中的文档节点。但是,它 returns 在 PhantomJS 1.9.8 中为 null。
(new DOMParser()).parseFromString("<div></div>", "text/html");
知道为什么会返回 null 吗?
您可能已经注意到 parseFromString()
接受第二个参数,表示预期的类型。 HTML 根本不支持 PhantomJS(当前版本 2.0.0):
As this page notes, PhantomJS 2 is based on WebKit 538.1 (October/November 2013) and the above table shows that HTML support was added into Chrome with version 30 which came out on 1. Oktober 2013 已经是 Blink(是的,德语 WikiPedia 页面比英语页面好)。根据开发周期,它可能出现在更高版本的 WebKit 中。
其他方式
PhantomJS 可以从 "text/xml" 创建文档。所以如果你有xhtml,你可以这样解析。
您还可以查看其他解析方式 HTML。这篇 MDN 文章在这方面很广泛:HTML to DOM.
如果还是不行,你可以试试看有没有node.js模块能不能充分解析HTML。 PhantomJS 和 node.js 具有不同的执行环境,但是几乎没有依赖关系的模块往往可以在两者中工作。
你可以使用像这样的 polyfill:
https://gist.github.com/eligrey/1129031
如果您将其复制到 vendor/assets/javascripts
,您可以让它只在测试中加载:
# config/initializers/assets.rb
Rails.application.config.assets.precompile += %w(html-domparser.js)
# app/views/layouts/application.html.erb
<%= javascript_include_tag 'html-domparser' if Rails.env.test? =>
或者,如果您有兴趣支持旧版浏览器,您可以像加载任何其他 js 一样在所有环境中加载它。
建立在@schpet 写的内容之上。
如果您对 application.html.erb 中的 if Rails.env.test?
感到奇怪。
这对我有用: 在 rails_helper.rb:
Capybara.register_driver :poltergeist do |app|
options = {
phantomjs: "/usr/local/bin/phantomjs",
extensions: [
Rails.root.join("vendor", "assets", "javascripts", "html-domparser.js"),
],
}
Capybara::Poltergeist::Driver.new(app, options)
end