2016-12-05 35 views
2

我使用的是poltergeist有驅動程序,並且必須遷移到硒,但是當瀏覽器(Mozilla Firefox 50.0.02)打開並開始執行測試用例時,它會在第一個點擊事件無法進入下一頁。水豚的點擊方法不適用於硒webdriver

測試案例(停止,因爲沒有發現添加,顯然是因爲Click方法不工作)

require 'rails_helper' 

feature 'creation of advices' do 
    scenario'Sucessfully create an advice' do 
    do_brand_login 
    # find('a[href="/clients/advice_requests"]') 
    page.click_link 'Requests' 
    # find(:xpath,'//a[@href="/clients/advice_requests"]').trigger('click') 
    click_link 'Add' 

    #Primeiro passo 
    find('input[id="clients_advice_request_request_type_id-selectized"]').click 
    find('div[data-value="1"]').click 

    find('input[id="clients_advice_request_contact_ids-selectized"]').click 
    first('div[class^="option"]').click 

    find('input[id="clients_advice_request_po_id-selectized"]').click 
    find('div[data-value="3"]').click 

    find('input[id="clients_advice_request_lead_contact_id-selectized"]').click 
    first('div[class^="option"]').click 

    fill_in 'Your reference', with: 'Valkyre' 
    fill_in 'Campaign name', with: 'Mjolnir for everyone' 
    fill_in 'Advertised product/service', with: 'Mjolnir' 

    click_button 'Next' 
    #Segundo passo 
    expect(page).to have_content "Details" 
    # find('textarea[id="clients_advice_request_instructions"]').send_keys('Put yout hammer here') 

    fill_in 'Instructions', with: 'Put yout hammer here' 

    first('.icheckbox_flat').click 
    # click 'Do you require an estimate?' 
    find('.bootstrap-switch').click 
    fill_in 'By when do you require the estimate?', with: 2.days.from_now 
    fill_in 'By when do you require the advice?', with: 2.days.from_now 
    find('input[id="clients_advice_request_trademark_search_id-selectized"]').click 
    page.find('div[class="option"]', text: 'No').click 
    find('input[id="clients_advice_request_country_ids-selectized"]').click 
    find('div[data-value="1"]').click 
    find('div[data-value="2"]', text: 'Austria').click 

    click_button 'Next' 

    #Terceiro passo 
    drop_in_dropzone Rails.root.join('public/favicon.ico') 


    # wait_for_ajax 
    # click_button 'Next' 
    # wait_for_ajax 
    expect(page).to have_content "Review materials can't be blank" 
    find('button[class="btn btn-primary btn-icon icon-right"]').click 
    # drop_in_dropzone Rails.root.join('public/favicon.ico') 

    puts current_url 
    require 'pry'; binding.pry 
    expect(page).to have_content "Ovewview" 
    #Quarto passo 
    click_button 'Submit' 
    end 
end 

Rails的助手

# This file is copied to spec/ when you run 'rails generate rspec:install' 
ENV['RAILS_ENV'] ||= 'test' 
require File.expand_path('../../config/environment', __FILE__) 
# Prevent database truncation if the environment is production 
abort("The Rails environment is running in production mode!") if Rails.env.production? 
require 'spec_helper' 
require 'rspec/rails' 
require 'capybara/rails' 
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} 
# Add additional requires below this line. Rails is not loaded until this point! 
require "selenium-webdriver" 

# Requires supporting ruby files with custom matchers and macros, etc, in 
# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are 
# run as spec files by default. This means that files in spec/support that end 
# in _spec.rb will both be required and run as specs, causing the specs to be 
# run twice. It is recommended that you do not name files matching this glob to 
# end with _spec.rb. You can configure this pattern with the --pattern 
# option on the command line or in ~/.rspec, .rspec or `.rspec-local`. 
# 
# The following line is provided for convenience purposes. It has the downside 
# of increasing the boot-up time by auto-requiring all files in the support 
# directory. Alternatively, in the individual `*_spec.rb` files, manually 
# require only the support files necessary. 
# 
# Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } 

# Checks for pending migration and applies them before tests are run. 
# If you are not using ActiveRecord, you can remove this line. 
ActiveRecord::Migration.maintain_test_schema! 

RSpec.configure do |config| 
    # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures 
    config.fixture_path = "#{::Rails.root}/spec/fixtures" 
    config.include LoginHelper 
    config.include DropZoneHelper 

    # If you're not using ActiveRecord, or you'd prefer not to run each of your 
    # examples within a transaction, remove the following line or assign false 
    # instead of true. 
    config.use_transactional_fixtures = true 

    # RSpec Rails can automatically mix in different behaviours to your tests 
    # based on their file location, for example enabling you to call `get` and 
    # `post` in specs under `spec/controllers`. 
    # 
    # You can disable this behaviour by removing the line below, and instead 
    # explicitly tag your specs with their type, e.g.: 
    # 
    #  RSpec.describe UsersController, :type => :controller do 
    #  # ... 
    #  end 
    # 
    # The different available types are documented in the features, such as in 
    # https://relishapp.com/rspec/rspec-rails/docs 
    config.infer_spec_type_from_file_location! 

    # Filter lines from Rails gems in backtraces. 
    config.filter_rails_from_backtrace! 
    # arbitrary gems may also be filtered via: 
    # config.filter_gems_from_backtrace("gem name") 
end 

spec_helper

require 'capybara/rspec' 
require 'capybara/dsl' 
# require 'capybara/poltergeist' 
Capybara.default_max_wait_time = 30 
Capybara.configure do |c| 
    c.javascript_driver = :selenium 
    c.default_driver = :selenium 
    c.app_host = "http://www.192.168.0.25.xip.io:3001" 
end 

# This file was generated by the `rails generate rspec:install` command. Conventionally, all 
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. 
# The generated `.rspec` file contains `--require spec_helper` which will cause 
# this file to always be loaded, without a need to explicitly require it in any 
# files. 
# 
# Given that it is always loaded, you are encouraged to keep this file as 
# light-weight as possible. Requiring heavyweight dependencies from this file 
# will add to the boot time of your test suite on EVERY test run, even for an 
# individual file that may not need all of that loaded. Instead, consider making 
# a separate helper file that requires the additional dependencies and performs 
# the additional setup, and require it from the spec files that actually need 
# it. 
# 
# The `.rspec` file also contains a few flags that are not defaults but that 
# users commonly want. 
# 
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration 
RSpec.configure do |config| 
    # rspec-expectations config goes here. You can use an alternate 
    # assertion/expectation library such as wrong or the stdlib/minitest 
    # assertions if you prefer. 

    config.expect_with :rspec do |expectations| 
    # This option will default to `true` in RSpec 4. It makes the `description` 
    # and `failure_message` of custom matchers include text for helper methods 
    # defined using `chain`, e.g.: 
    #  be_bigger_than(2).and_smaller_than(4).description 
    #  # => "be bigger than 2 and smaller than 4" 
    # ...rather than: 
    #  # => "be bigger than 2" 
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true 
    end 

    # rspec-mocks config goes here. You can use an alternate test double 
    # library (such as bogus or mocha) by changing the `mock_with` option here. 
    config.mock_with :rspec do |mocks| 
    # Prevents you from mocking or stubbing a method that does not exist on 
    # a real object. This is generally recommended, and will default to 
    # `true` in RSpec 4. 
    mocks.verify_partial_doubles = true 
    end 

    # This option will default to `:apply_to_host_groups` in RSpec 4 (and will 
    # have no way to turn it off -- the option exists only for backwards 
    # compatibility in RSpec 3). It causes shared context metadata to be 
    # inherited by the metadata hash of host groups and examples, rather than 
    # triggering implicit auto-inclusion in groups with matching metadata. 
    config.shared_context_metadata_behavior = :apply_to_host_groups 

# The settings below are suggested to provide a good initial experience 
# with RSpec, but feel free to customize to your heart's content. 
=begin 
    # This allows you to limit a spec run to individual examples or groups 
    # you care about by tagging them with `:focus` metadata. When nothing 
    # is tagged with `:focus`, all examples get run. RSpec also provides 
    # aliases for `it`, `describe`, and `context` that include `:focus` 
    # metadata: `fit`, `fdescribe` and `fcontext`, respectively. 
    config.filter_run_when_matching :focus 

    # Allows RSpec to persist some state between runs in order to support 
    # the `--only-failures` and `--next-failure` CLI options. We recommend 
    # you configure your source control system to ignore this file. 
    config.example_status_persistence_file_path = "spec/examples.txt" 

    # Limits the available syntax to the non-monkey patched syntax that is 
    # recommended. For more details, see: 
    # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ 
    # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ 
    # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode 
    config.disable_monkey_patching! 

    # Many RSpec users commonly either run the entire suite or an individual 
    # file, and it's useful to allow more verbose output when running an 
    # individual spec file. 
    if config.files_to_run.one? 
    # Use the documentation formatter for detailed output, 
    # unless a formatter has already been configured 
    # (e.g. via a command-line flag). 
    config.default_formatter = 'doc' 
    end 

    # Print the 10 slowest examples and example groups at the 
    # end of the spec run, to help surface which specs are running 
    # particularly slow. 
    config.profile_examples = 10 

    # Run specs in random order to surface order dependencies. If you find an 
    # order dependency and want to debug it, you can fix the order by providing 
    # the seed, which is printed after each run. 
    #  --seed 1234 
    config.order = :random 

    # Seed global randomization in this process using the `--seed` CLI option. 
    # Setting this allows you to use `--seed` to deterministically reproduce 
    # test failures related to randomization by passing the same `--seed` value 
    # as the one that triggered the failure. 
    Kernel.srand config.seed 
=end 
end 

登錄幫手

module LoginHelper 
    def do_brand_login 
    visit 'http://yggdrasil.192.168.0.25.xip.io:3001/users/sign_in' 
    fill_in 'user_email', with: '[email protected]' 
    fill_in 'user_password', with: '3dfosfey' 
    click_button 'Log in' 
    end 
end 
+0

到底是什麼,你得到的錯誤? –

+0

1)創建的建議成功地創建一個建議 故障/錯誤:click_link「添加」 水豚:: ElementNotFound: 無法找到鏈接「添加」 –

+0

你肯定有是的「添加」上的文字鏈接頁?加入睡眠3;在請求點擊後放置page.html',並確保頁面是你期望的頁面 –

回答

1

無法保證click_button/click_link/click等會等待點擊觸發完成的操作。因爲你需要在觸發動作完成後等待水豚等待,通過預期動作觸發的任何可見變化。如果第一次點擊後的第二次點擊會在第一次點擊後立即嘗試點擊,如果匹配的元素已經存在於第一頁上。這可能會導致取消第一次點擊,中斷其操作,或者隨機導致點擊看起來像被忽略。在你的情況你登錄助手do_brand_login應指示登錄已完成年底特別期待的東西 - 像

expect(page).to have_content("You are now logged in!") # Or whatever content is shown