Rails + Minitest + Capybara:如何 assert_select 使用 span id

Rails + Minitest + Capybara: how to assert_select with span id

在我看来我有:

<span class = "info">
    <span id="<%= account.id %>" data-account_id="<%= account.id %>" data-activated="<%= account.starts_at? %>">
        <%= t(".account_activated") %>
    </span>
</span>

如果里面显示 "account has been activated" 文本,最好的测试方法是什么(使用水豚进行系统测试)?

我试过了:

assert_selector "span##{acount.id}", text: "account has been activated"

但得到 Selenium::WebDriver::Error::InvalidSelectorError:无效的选择器:指定了无效或非法的选择器

我已经解决了这个问题。

这是因为 ID 不应以数字开头(参见 here

ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons (":"), and periods (".").

查看代码修改如下:

<span class = "info">
    <span id="**account_**<%= account.id %>" data-account_id="<%= account.id %>" data-activated="<%= account.starts_at? %>">
        <%= t(".account_activated") %>
    </span>
</span>

assert_selector "#account_#{account.id}", text: "account has been activated"

在 HTML5 中,定义已更改为允许 ID 以数字开头,但 CSS 要求正确转义前导数字(# 234 将匹配 ID“1234” ).因此,如果您需要通过 CSS 将元素与可能以数字开头的 id 匹配,最好使用 id 选项(所有 Capybara 选择器都支持)并让 Capybara 将其合并到CSS

assert_selector "span", id: account.id, text: "account has been activated"

这将正确转义并将其应用于 CSS。如果你只想指定 id 而不是元素类型(因为 id 在页面上应该是唯一的)你可以使用 :id 选择器类型(而不是默认的 CSS 选择器类型)

assert_selector :id, account.id, text: "account has been activated"