【问题标题】:Capybara - Poltergeist - JavascriptError: Undefined is not a constructorCapybara - Poltergeist - JavascriptError: Undefined is not a constructor
【发布时间】:2017-10-25 15:32:45
【问题描述】:

我在一个新项目中遇到了这个奇怪的错误,我想使用 Angular 并通过虚假数据进行 ajax 搜索。搜索正在工作,但是当我尝试使用 PhantomJS、Capybara、Rspec、Webpack 和 angular 环境创建测试时,会发生错误。 版本:

  • phantomjs: 2.1.1(在控制台中使用phantomjs -v 签入
  • webpacker (3.0.2 3b09f78)
  • websocket 驱动程序 (0.6.5)
  • websocket 扩展 (0.1.2)
  • rspec-core (3.7.0)
  • rspec-rails (3.7.1)
  • 水豚 (2.15.4)

这是我的测试规范/features/product_search_spec.rb:

require 'rails_helper'

feature 'product search' do
  let(:email) {"username@mail.dk"}
  let(:password) {"passwordpassword"}

  before do
    create_test_user(email, password)

    create_product("Christan", "Zebra", "Andersen")
    create_product("Mathias", "Aude", "Zebra")
    create_product("Zebaa", "Zulu", "Hest")
    create_product("Aaaaaaaaa", "Zebra", "Aaaaaaa") # Første produkt, der bliver vis

  end

  scenario "Search by title" do
    visit root_path
    fill_in "Email", with: email
    fill_in "Password", with: password
    click_button "Log in"

    click_link "Gå til produktsøgning"

    sleep 1
    puts page.body
    within ".search-form" do
      fill_in "keywords", with: "Zeb"
    end

    within "section.search-results" do
      expect(page).to have_content("Zebra")
      list_group_items = page.all("ol li.list-group-item")
      expect(list_group_items.count).to eq(4)
      expect(list_group_items[0]).to have_content("Zebaa") # Er det sorteret rigtigt?
    end

  end
end

def create_test_user email, password
  User.create!(
    email: email,
    password: password,
    password_confirmation: password
  )
end

# For at jeg og senere udvikler tydeligt kan se hvilken test-data, som det er vi arbejder med.
def create_product title, subtitle, authors
  title ||= Faker::Internet.username
  subtitle ||= Faker::Internet.domain_name
  authors ||= Faker::FamilyGuy.character

  Product.create!(
    title: title,
    subtitle: subtitle,
    authors: authors
  )
end

当我运行rails spec SPEC=spec/features/product_search_spec.rb

我在终端中收到错误:

product search Search by title
     Failure/Error: click_link "Gå til produktsøgning"

     Capybara::Poltergeist::JavascriptError:
       One or more errors were raised in the Javascript code on the page. If you don't care about these errors, you can ignore them by setting js_errors: false in your Poltergeist configuration (see documentation for details).

       TypeError: undefined is not a constructor (evaluating 'Object.assign({}, merged, opt)')
       TypeError: undefined is not a constructor (evaluating 'Object.assign({}, merged, opt)')

我已经阅读了很多帖子,其中一些是关于 phantomjs 无法与 ES6 一起工作的,但新版本 2.1.1 应该没问题。

我希望有人能指出我正确的方向。

【问题讨论】:

    标签: ruby-on-rails webpack rspec capybara poltergeist


    【解决方案1】:

    2.1.1 版的 PhantomJS 大致相当于 7 年前的 Safari 版。它不支持 ES6,你需要编译和填充所有 JS 代码以兼容 ES5 才能使用它。有一个 PhantomJS 2.5 测试版使其更接近现代浏览器支持,但是如果你想要/需要支持 ES6 的无头测试,它已被放弃,只推荐使用无头 chrome。

    【讨论】:

    • 好的。所以我不应该使用 PhantomJS,而是使用 ChromeDriver 和 Capybara-Selenium 之类的东西?
    • @PeterAndersen 如果您的项目不需要支持旧浏览器,正在编写 ES6 JS,并且不进行转译/polyfilling - 是的。
    • 好的。非常感谢!你会推荐它吗?
    • @PeterAndersen 发布直接 ES6 代码太早了?这完全取决于您项目的目标市场。 selenium w/chrome 的一个缺点是目前它比 Poltergeist/PhantomJS 慢(但它支持更多)。
    • 年轻的技术人员 - 我会同意的 :)!
    【解决方案2】:

    我尝试实现 Selenium,但它需要我的 Mac 才能运行 Xcode。

    我有 El Capitan,所以我通过 Apple 支持论坛安装了旧版本,但它不起作用。 (它最多占用 12.7 GB!) 我尝试使用 PhantomJS 再次寻找答案,并找到了一个 answer here,他们在其中谈论 Babel。

    所以我补充说:

    import "babel-polyfill";

    到顶部操作我的 js 文件,测试成功,现在我可以继续我的工作了!

    【讨论】:

    • Selenium 应该不需要 XCode,你确定你没有尝试安装 capybara-WebKit 而不是 selenium?