capybara / rspec在页面上找到角度链接的问题

时间:2016-03-16 18:00:09

标签: javascript ruby-on-rails angularjs rspec capybara

我和一些同学正在构建AirBNB的Rails / Angular克隆,我似乎有一些rspec / capybara问题!

我有以下测试...

context 'users are able to add a space' do scenario 'adding a space' do visit '/' click_link 'Post a space' fill_in 'Name', with: 'my hotel' fill_in 'Location', with: 'London' fill_in 'Price', with: '100' attach_file "Image", "spec/asset_specs/photo/Elephant.jpg" fill_in 'Details', with: 'single bedroom with ensuite' fill_in 'Available from', with: Date.new(2016,03,15) fill_in 'Available to', with: Date.new(2016,03,15) click_button 'Create Space' within 'ul#spaces' do expect(page).to have_content 'Location: London' expect(page.find('.space_thumb')['src']).to have_content 'Elephant.jpg' end end end end

我的观点如下......

 <input id='search' ng-model='query'></br> 
 <section ng-if='spaces == false'>
   <p>no spaces yet...</p>
 </section>

 <a ng-href='/spaces/new' id='post_space'>Post a space</a>

 <section>
   <ul id='spaces' ng-repeat='space in spaces | filter:query'>
     <li>
       <h5>{{space.name}}</h5>
       <img class='space_thumb' ng-src={{space.image_url}}/>
       <p>Location: {{space.location}}</p>
       <p>Price: {{space.price}}</p>
       <p>Details: {{space.details}}</p>
       <p>Available from: {{space.available_from}}</p>
       <p>Available to: {{space.available_to}}</p>
     </li>
   </ul>
 </section>

但是当我使用默认驱动程序运行测试时,我收到以下错误...

Capybara::ElementNotFound:
Unable to find link "Post a space"

然而,当我使用selenium时,它会工作,但是我的测试检查图像src,它失败,因为它返回一个默认的missing.png文件。我猜是因为硒不允许水豚有足够的时间上传图片......

我是否可以使用角度友好的驱动器,或者我应该废弃它并在量角器或类似物中进行测试......

谢谢!

1 个答案:

答案 0 :(得分:0)

默认的rack_test驱动程序根本不处理JS,因此将它与Angular站点一起使用将浪费时间(因为一切都是JS驱动的)。它没有找到链接的原因是链接必须有href属性,你的标记不会,但是一旦它运行就由角度JS添加(因此为什么用rack_test测试角度驱动的站点是无用)

对于图像测试 - 通过查找元素,获取src属性然后比较它,您将禁用等待行为(因为您正在提取无法自动重新加载的字符串)。相反,你应该做类似

的事情
expect(page).to have_selector('.space_thumb[src$="Elephant.jpg"]')

可以重试匹配元素,直到Capybara.default_max_wait_time秒,以便显示匹配元素。你可能需要调整css中属性选择器的类型,具体取决于真实页面中的src是什么样的(例如* =(包含),如果图像src有缓存破坏查询参数或任何东西)