2016-10-21 2 views
0

Объекты моей тестовой базы данных не могут быть просмотрены Capybara Selenium WebDriver. Кто-нибудь видит проблему с моей установкой или то, что я могу пропустить?Capybara Selenium WebDriver не видит моих тестовых данных

rails_helper.rb

... 
RSpec.configure do |config| 

    config.use_transactional_fixtures = false 
    ... 
end 

database_clearner.rb

RSpec.configure do |config| 

    config.use_transactional_fixtures = false 

    config.before(:suite) do 
    DatabaseCleaner.clean_with(:truncation) 
    end 

    config.before(:each) do 
    DatabaseCleaner.strategy = :transaction 
    end 

config.before(:all) do 
    DatabaseCleaner.start 
end 

config.before(:each, type: :feature) do 
    # :rack_test driver's Rack app under test shares database connection 
    # with the specs, so continue to use transaction strategy for speed. 
    driver_shares_db_connection_with_specs = Capybara.current_driver == :rack_test 

    if !driver_shares_db_connection_with_specs 
    # Driver is probably for an external browser with an app 
    # under test that does *not* share a database connection with the 
    # specs, so use truncation strategy. 
    DatabaseCleaner.strategy = :truncation 
    end 
end 

config.before(:each, :js => true) do 
    DatabaseCleaner.strategy = :truncation 
end 

config.before(:each) do 
    DatabaseCleaner.start 
end 

config.append_after(:each) do 
    DatabaseCleaner.clean 
end 

config.after(:all) do 
    DatabaseCleaner.clean 
end 

end 

external_user_viewing_resources_sel_spec.rb

require 'rails_helper' 
require 'support/selenium_helper' 

RSpec.feature "External user " do 

before(:all) do 
    get_driver 
    login_user(:external_user) 
end 

after(:all) do 
    #@driver.find_element(:id, "logout").click() 
    #quit_driver 
end 

scenario "can view and click resources (helpful links)", js: true do 
    @d1_inst_resource = create(:d1_inst_resource) 
    puts @d1_inst_resource.inspect 
    @driver.find_element(:id, 'helpful_links_panel') 
    @driver.find_element(:id, "#{@d1_inst_resource.id}").click(); 
end 
end 

selenium_helper.rb

require 'selenium-webdriver' 

def get_driver 
    Capybara.current_driver = Selenium::WebDriver.for :firefox #:chrome 
    @driver = Capybara.current_driver 
end 

def quit_driver 
    @driver.quit 
    Capybara.use_default_driver 
end 

def login_user(user) 
    @user = build_stubbed(user) 
    @driver.get "http://localhost:3000" 
    @driver.find_element(:id, "username").send_keys("#{@user.email}") 
    @driver.find_element(:id, "password").send_keys("#{@user.password}") 
    @driver.find_element(:css, "button[type='submit']").click() 
end 

ошибка

..............#<Resource id: 10534, text: "Text1", url: "MyText", position: 1, d1: true, d2: false, d3: false, conference: false, institution: true, start_date: "2016-10-06", end_date: "2020-10-06", created_at: "2016-10-21 13:28:15", updated_at: "2016-10-21 13:28:15"> 
F...* 

Failures: 

1) External user can view and click resources (helpful links) 
Failure/Error: @driver.find_element(:id, "#{@d1_inst_resource.id}").click(); 

Selenium::WebDriver::Error::NoSuchElementError: 
    Unable to locate element: {"method":"id","selector":"10534"} 

Я видел другие статьи, но они не решают мою проблему. Я понимаю, что они работают в разных потоках, но я чувствую, что вышеописанная конфигурация позаботилась, что ...

Capybara with :js => true causes test to fail

***** ОБНОВЛЕНО КОД *****

selenium_helper.rb

def login_user(user) 
    @user = build_stubbed(user) 
    page.visit "/" 
    page.fill_in "username", with: @user.email 
    page.fill_in "password", with: @user.password 
    page.find("button[type='submit']").click() 

конец

external_user_ viewing_resources_sel_spec.rb

require 'rails_helper' 
require 'support/selenium_helper' 

RSpec.feature "External user " do 

before(:each) do 
    Capybara.current_driver = :selenium 
    @d1_inst_resource = create(:d1_inst_resource) 
    puts Resource.count 
    login_user(:external_user) 
    puts 'test script count' 
    puts Resource.get_resource_by_member_type_and_division(@user).count 
end 

scenario "can view and click resources (helpful links)", js: true do 
    puts page.first('.userName').text 
    expect(page.first('.userName').text).to eq("#{@user.first_name.upcase} #{@user.last_name.upcase}") 
    page.find(:id, "#{@d1_inst_resource.id}") 
    page.find(:id, "#{@d1_inst_resource.id}").click() 
end 
end 

main_controller.rb

def index 
    @resources = Resource.get_resource_by_member_type_and_division(@user) 
    puts 'index query count' 
    puts @resources.count 
    @resources 
end 

ошибка

1 
index query count 
0 
test script count 
1 
REVDIST TUSER1 
F 

Failures: 

1) External user can view and click resources (helpful links) 
Failure/Error: page.find(:id, "#{@d1_inst_resource.id}") 

Capybara::ElementNotFound: 
    Unable to find id "11060" 
# /Users/meffinger1/.rvm/gems/ruby-2.2.5/gems/capybara-2.9.1/lib/capybara/node/finders.rb:44:in `block in find' 
# /Users/meffinger1/.rvm/gems/ruby-2.2.5/gems/capybara-2.9.1/lib/capybara/node/base.rb:85:in `synchronize' 
# /Users/meffinger1/.rvm/gems/ruby-2.2.5/gems/capybara-2.9.1/lib/capybara/node/finders.rb:33:in `find' 
# /Users/meffinger1/.rvm/gems/ruby-2.2.5/gems/capybara-2.9.1/lib/capybara/session.rb:735:in `block (2 levels) in <class:Session>' 
# ./spec/features/selenium/external_user_viewing_resources_sel_spec.rb:28:in `block (2 levels) in <top (required)>' 

Закончено в 56.01 секунд (файлы взял 6,33 секунд для загрузки) 1 пример 1 отказ

+0

Является ли идентификатор элемента на странице на самом деле 10534? а не что-то вроде resource_10534? –

+0

Хороший вопрос, это код вида <%= resource.text %>

ответ

0

Изменение моего database_cleaner .rb, чтобы устранить проблему, они больше не работают в двух разных потоках.

RSpec.configure do |config| 
    config.use_transactional_fixtures = false 

    config.before :each do 
    if Capybara.current_driver == :rack_test 
     DatabaseCleaner.strategy = :transaction 
    else 
     DatabaseCleaner.strategy = :truncation 
    end 
    DatabaseCleaner.start 
    end 

    config.after do 
    DatabaseCleaner.clean 
    end 
end 
0

Вы не видите ресурс, потому что он не создается до тех пор, пока страница не будет загружена, однако вы также не используете Capybara в своих примерах, поскольку вы полностью обходите ее и используете экземпляры селена напрямую ,

В get_driver вы устанавливаете Capybara.current_driver на экземпляр Selenium :: WebDriver, когда он ожидает символ, соответствующий одному из драйверов, зарегистрированных в Capybara. В `login_user 'вы создаете заштрихованный объект (т. Е. Не реальный/сохраненный в базе данных), а затем используете его для входа в систему, который не будет работать, поскольку в базе данных для потока приложения не загружается пользователь.Я не могу быть понять, что именно вы пытаетесь сделать, но я бы ожидать, что ваши файлы больше похожи на

external_user_viewing_resources_sel_spec.rb

require 'rails_helper' 
require 'support/selenium_helper' 

RSpec.feature "External user " do 

before(:each) do 
    login_user(:external_user) 
end 

scenario "can view and click resources (helpful links)", js: true do 
    @d1_inst_resource = create(:d1_inst_resource) 
    page.visit("whatever page should should show the record") 
    page.find(:id, @d1_inst_resource.id").click(); 
    # some check for what should happen based on the click 
end 
end 

selenium_helper.rb

def login_user(user) 
    @user = create(user) 
    page.visit "http://localhost:3000" #Is this meant to be a different system than the app under test? if not it should just be page.visit '/' 
    page.fill_in("username", with: @user.email) 
    page.fill_in("password", with: @user.password) 
    page.find(:css, "button[type='submit']").click() 
    #some check for whatever happens on the page to show the user has logge in 
end 
+0

Ваш ответ прояснил много путаницы Капибары Селен, спасибо. Я очистил код и разместил обновления. Я использую subbed user b/c, таблица находится в другой схеме, и пользователь на самом деле уже существует. –

+0

Однако я все еще не вижу ресурса. Я вижу, что его созданный (после того, как он ставит «test script count») в тесте, но его не видно в методе индекса при запуске браузера. Я все еще думаю, что у меня что-то не хватает в конфигурации. –

+0

Добавление проверки на что-либо на странице, как указано в моем ответе в конце login_user, чтобы убедиться, что пользователь действительно вошел в систему, и проверьте ваш test.log, чтобы подтвердить, что вход в систему происходит. Кроме того, каждый сценарий является раздельным, поэтому ваш login_user должен находиться в файле before (: each) not before (: all) - также почему вы отменили метаданные 'js: true' от сценария? –

Смежные вопросы