选择具有动态ID的CSS元素

时间:2014-10-15 01:17:00

标签: ruby automation cucumber capybara qa

我正在使用cucumber和SitePrism编写自动化测试,我在测试之间选择CSS元素时遇到问题,因为它的id是动态的(用用户ID更改)并且名称不是唯一的。该元素是用户角色下拉菜单,因此ID会更改以匹配用户ID。

元素的html是......

<dd>
   <select id="select-role-a02322d1-8add-4234-aeca-02d3fca2a239" name="role_id">
      <option title="System Administrator Role" value ="1">Administrator</option>
      <option title="Secure Content Viewer" value="2">SecureContentView</option>
   </select>
</dd>

当我将页面模型上的元素设置为...

element :role_dropdown, 'select[name=role_id]'

执行以下对象/实例...

And(/^select the first value in the Add Role dropdown$/) do
    @page.user.role_dropdown.select("Administrator")
end

我被退回了

Capybara::Ambiguous: Ambiguous match, found 2 elements matching css "select[name=role_id]"
from /Users/Alex/.rvm/gems/ruby-2.1.2@railstutorial_rails_4_0/gems/capybara-2.4.3/lib/capybara/node/finders.rb:38:in 
`block in find'

因此,要使测试起作用,我必须将元素设置为静态id

element :role_dropdown, '#select-role-8ec3f391-3871-47ff-b605-8f43aa40677d'

但是,在没有测试具有该id的用户的所有情况下,该元素都是无用的。

  1. 有没有办法在页面模型上设置元素以获得动态ID?

  2. 在下面的实例中(图1),如何选择值1而不是选项的文本?我希望所选择的内容与值有关,而不是文本。这样,如果选项1的标题或文本发生更改,仍将选择选项1并且测试不会失败。

  3. 图1:

    And(/^select the first value in the Add Role dropdown$/) do
        @page.user.role_dropdown.select("Administrator")
    end
    
    1. 如果ID是动态的,我该如何定义{id}?我可以使用environment_keys.yaml中的键来定义它吗?

2 个答案:

答案 0 :(得分:2)

我假设id是外部生成的,而且测试无法访问(在这种情况下,Anthony的建议可能不起作用)

如果是这种情况,select[name=role_id]可能是一个好的开始。显然,页面上有两个与此选择器匹配的元素,因此您需要更具体的内容来区分它们。

要查找两者,请打开开发人员工具并转到控制台。假设站点有jQuery,您可以$('select[name=role_id]')找到匹配的元素。您可以右键单击它们以在元素面板中显示。树中可能有更高的值可用于选择它们。

有可能一个是可见的,一个是隐藏的。如果是这样,那么你可以选择这样的可见的: element :role_dropdown, 'select[name=role_id]', visible: true

答案 1 :(得分:1)

您是否在测试中创建了该角色?为什么不使用它来隔离您的元素选择:

@role = Role.create('attributes here')
element :role_dropdown, "select[name=#{@role.id}]"