Capybara doesn't recognize dynamically added DOM elements?

前端 未结 3 409
旧巷少年郎
旧巷少年郎 2021-02-01 22:04

I seem to be having trouble testing the slick javascript things I do with jQuery when using Capybara and Selenium. The expected behavior is for a form to be dynamically generat

3条回答
  •  [愿得一人]
    2021-02-01 22:37

    I use the Webdriver based driver for Capybara in RSpec, which I configure and use like this and it will definitely handle JS and doesn't need a reload of the dom. The key is using a wait_until and a condition that will be true when your AJAX response has finished.

    before(:each) do
      select_driver(example)  
      logout
      login('databanks') 
    end
    
     def select_driver(example)
       if example.metadata[:js]
        Capybara.current_driver = :selenium
      else
        Capybara.use_default_driver
      end
    end
    
    it "should let me delete a scenario", :js=>true do
        select("Mysite Search", :from=>'scenario_id')  
        wait_until{ page.has_content?('mysite_searchterms')}    
        click_on "delete"     
        wait_until{ !page.has_content?('mysite_searchterms')}   
        visit '/databanks'
        page.should_not have_content('Mysite Search')
      end
    

    I also figured out a hack to slow down webdriver last night, like this, if you want to watch things in slo-mo:

       #set a command delay
       require 'selenium-webdriver'
    
       module ::Selenium::WebDriver::Remote
         class Bridge
           def execute(*args)
             res = raw_execute(*args)['value']
             sleep 0.5
             res
           end
         end
       end  
    

    As someone else mentioned, if you are getting a timeout waiting for the element, you could look at upping this:

    Capybara.default_wait_time = 10
    

提交回复
热议问题