ruby - 选择具有动态 id 的 CSS 元素

标签 ruby automation cucumber capybara

我正在使用 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 仍将被选中并且测试不会失败。

图 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 中的 key 来定义它吗?

最佳答案

我假设 id 是在外部生成的并且测试无法访问(在这种情况下 Anthony 的建议可能行不通)

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

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

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

关于ruby - 选择具有动态 id 的 CSS 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26372944/

相关文章:

mysql - 使用gem安装mysql时出现错误 "Bundler cannot continue..."

python - 如何处理使用selenium python时出现的过滤框?

.NET 相当于 Ruby 的 begin/rescue/else

ruby - 如何从列表中查找和替换文件名列表

ruby - 令人惊讶的字符串连接

delphi - 如何在不使用 COM 自动化的情况下处理 Word 文档?

android - SEND_SMS 十月政策更新

ruby-on-rails-3 - 让 Selenium 与 Bootstrap 模态褪色一起玩的建议?

java - 在多线程执行期间使用 TestNG 生成 Cucumber ExtentReport

ruby-on-rails-3 - Rails、Capybara 和子域 : how to visit certain subdomain