Search code examples
rubycapybarasite-prism

SitePrism sometimes finds elements, sometimes doesn't, while Capybara can


I am using Capybara and Selenium for testing my website. I also use with Site Prism for Page Object model. I can make every thing work now, however, I don't understand why sometimes actions with page elements donot work, while using "natively" Capybara work.
For example, I have a Page object:

class MyPage < SitePrism::Page
 element :sign_in_link, :css, 'a.signin-link'
 element :join_link, :css, "a.join-link"
end

and its implementation:

@mypage = MyPage.new
@mypage.sign_in_link.click
# It works at first, then after some repeated test round, it doesn't work sometimes, with error: NoMethodError

While I use:

find(:css, 'a.signin-link').click #=> always work, but not Page Object model

So, why it happens? Have anyone experienced this problem?


Solution

  • By default site_prism disables Capybaras implicit waiting behavior while finding elements. This means to have the same behavior as your capybara example you would need to do

    @mypage = MyPage.new
    @mypage.wait_for_sign_in_link
    @mypage.sign_in_link.click
    

    You can read more about this in the site_prism README under "Using Capybara Implicit Waits"

    Another options is to use site prisms "Load Validations" feature to ensure pages are loaded before starting to click on their elements