RSpec Capybara 在尝试单击浏览器确认按钮时抛出 Selenium 错误

问题描述 投票:0回答:1

我在 Rails 应用程序中遇到了端到端 Capybara 规范错误。

以下是我观点的相关部分:

#show.html.erb
...
<%= button_to 'Cancel',
  cancel_subscription_path,
  class: 'button button--danger',
  data: {
    turbo_confirm: 'Are you sure you want to cancel?',
    turbo_method: 'post'
  }
%>
<div id="cancel_message"></div>
...
# cancel_subscription_spec.rb

require 'rails_helper'

RSpec.describe 'CancelSubscriptions', js: true do
  it 'cancels an active subscription' do
    email = sign_up_and_subscribe

    visit subscription_path

    accept_confirm do
      click_button 'Cancel'
    end

    subscription = User.find_by(email:).current_subscription

    expect(subscription.cancelled?).to be(true)
  end
end

sign_up_and_subscribe
只是一个简单的帮助方法,它注册应用程序并填写 Stripe 表单来创建订阅 - 它在其他测试中有效,我还看到在 Stripe 仪表板中创建的订阅,这不是问题.

当规格达到

visit subscription_path
并尝试单击取消按钮时,我收到以下错误:

Selenium::WebDriver::Error::UnexpectedAlertOpenError:  
  unexpected alert open: {Alert text : }
    (Session info: chrome-headless-shell=123.0.6312.87)

我认为我误用了

accept_confirm
方法,但从我在文档中发现的内容来看,这是正确的用法。

我发现奇怪的是,注释掉规范中的

accept_confirm
和视图中的
turbo_confirm
实际上并没有改变错误消息。 Capybara 是否在测试运行之间缓存页面?

我会考虑改变行为以使规范通过,我更喜欢有一个经过充分测试的用户流程,即使这意味着用户体验的微小变化,但我什至不能这样做,问题仍然存在一样的。

如果有帮助,

rails_helper.rb
的相关部分是:

Capybara.register_driver :chrome do |app|
  Capybara::Selenium::Driver.new app, browser: :chrome,
                                      options: Selenium::WebDriver::Chrome::Options.new(args: %w[headless disable-gpu])
end

Capybara.javascript_driver = :chrome

如果其余部分有用,我可以发布它,但据我所知,它大多无关。

我的

cancel
控制器中的操作如下所示:

def cancel
  @subscription = current_user.current_subscription
  SubscriptionCanceller.new(subscription_id: @subscription.provider_id).call
rescue SubscriptionCancellationError => _e
  render :cancellation_error
end

我有

turbo_stream
cancellation_error
本身的
cancel
视图,当我手动测试它们时,这两个视图都可以在浏览器中工作。

以防万一影响它,这是

cancel.turbo_stream.erb

<%= turbo_stream.replace 'cancel_message' do %>
  <div>We are cancelling your subscription.</div>
<% end %>

如果需要任何进一步的细节/代码,请告诉我,我会发布它。

javascript ruby-on-rails ruby selenium-webdriver capybara
1个回答
0
投票

我已经解决了这个问题,尽管该行为是意外的,但这不是相关规范的问题。

被测试页面所依赖的底层数据不存在。这是因为在其他规范中,我测试了相同的 Stripe 表单填写功能,并且在这些测试中做出的断言使应用程序等到它们为真。然而,在此测试中,在保存 Stripe API 的结果之前,页面已通过

visit subscription_path
重定向,从而导致错误。

测试中出现的错误让我感到困惑,因为它让我相信有一个不应该打开的对话框,而实际问题是没有对话框打开,即使它期望有一个对话框 。页面上没有取消按钮,因为订阅页面显示为空。

要点:在使用 Capybara/Selenium 进行接受确认或提示对话框的断言之前,请确保页面按预期呈现。不这样做可能会导致意外错误。

© www.soinside.com 2019 - 2024. All rights reserved.