如何查找具有特定标记的CSS元素

时间:2014-08-24 20:14:55

标签: ruby-on-rails-4 rspec css-selectors capybara integration-testing

这是我的inspect元素片段:

<div>
  <map>
    <area href="javascript:void(0)" log="miw" ... shape="poly" title="lender_marker test@example.com">
    <area href="javascript:void(0)" log="miw" ... shape="poly" title="lender_marker othertest@example.com">
  </map>
</div>

...表示我不会包含的一堆其他标签。仅供参考这些元素来自JS中的Google Maps API V3,我正在使用此great tutorial来尝试测试,除了教程在Selenium中工作,我想使用Capybara / Rspec。此外,首先使用this post来制定选择器。

我需要在集成测试中做两件事:

  1. 计算lender_marker的#,无论电子邮件
  2. 点击lender_marker并附上特定的电子邮件
  3. 对于#1 ......

    • 虽然我不想用lender_markers来计算电子邮件,但我想如果我找不到lender_marker test@example.com我就不会担心找到lender_marker,因此,测试如下所述
    • 也是变体层,所以我尝试了以下
    • 的所有可能的排列

    试验:

    #Base test
    page.should have_selector("area[title='lender_marker test@example.com']")
    
    #First variation: change selector statement
    page.assert_selector("area[title='lender_marker test@example.com']")
    
    #Second variation: no quotes
    page.should have_selector(area[title='lender_marker test@example.com'])
    
    #Third variation: use map 
    page.should have_selector("map[title='lender_marker test@example.com']")
    
    #Fourth variation: use div 
    page.should have_selector("div[title='lender_marker test@example.com']")
    

    对于#2,我甚至无法尝试,直到我第一次找到区域对象,但我不能...

1 个答案:

答案 0 :(得分:1)

您的CSS选择器没有任何问题,这让我相信它是一个可见性问题。您引用的教程是使用find_elements,在Selenium中将找到与选择器匹配的所有元素。相比之下,当Capybara查找元素时,它只返回与选择器匹配的元素被确定为对用户可见。

换句话说,我猜测区域元素存在但Capybara并不认为它们是可见的。您可能需要触发某些内容才能使区域变得可见。

但是,您可以使用:visible选项验证元素是否存在,无论可见性如何:

# Validate that a specific area exists in the DOM
page.should have_selector('area[title="lender_marker test@example.com"]', visible: false)

# Count the number of lender_markers
page.all('area[title^="lender_marker"]', visible: false).length
#=> 2

# Count the number of lender_markers with minimum in case of async loading
puts page.all('area[title^="lender_marker"]', visible: false, minimum: 2).length
#=> 2

# Validate the number of lender_markers
page.should have_selector('area[title^="lender_marker"]', visible: false, count: 2)