2

我无法让 Cucumber“选择”一个单选按钮并希望有人能给我一个健全的检查。在不引用大量 HTML 垃圾的情况下,这里是相关部分(我从 print.html 收集的)。它位于由按钮激活的模态 div 中。我可以“单击”该按钮并看到模态窗口出现(我在 Selenium 中将其作为@javascript 场景运行)。

<div class="modal-body pagination-centered">
    <img src="/assets/payment.png" alt="Payment" />
    <form novalidate="novalidate" method="post" id="edit_cart_1" class="simple_form edit_cart" action="/carts/complete" accept-charset="UTF-8">
        <div style="margin:0;padding:0;display:inline">
            <input type="hidden" value="✓" name="utf8" />
            <input type="hidden" value="put" name="_method" />
        </div>
        <div class="control-group hidden cart_property_id">
            <div class="controls">
                <input type="hidden" name="cart[property_id]" id="cart_property_id" class="hidden" />
            </div>
        </div>
        <div id="payment_fat_buttons" class="fat-buttons">
            <div class="vertical-button-wrapper">
                <input type="radio" value="cash" name="cart[payment_type]" id="cart_payment_type_cash_pay" data-property-id="1" />
                <label for="cart_payment_type_cash_pay">Cash</label>
            </div>
            <div class="vertical-button-wrapper">
                <input type="radio" value="credit" name="cart[payment_type]" id="cart_payment_type_credit_pay" data-property-id="1" />
                <label for="cart_payment_type_credit_pay">Credit</label>
            </div>
        </div>
        <div style="display: none;" id="cart_room_number_area_pay">
            <div class="control-group string optional cart_room_number">
                <label for="cart_room_number_pay" class="string optional control-label">Room number</label>
                <div class="controls">
                    <input type="text" value="" size="50" name="cart[room_number]" id="cart_room_number_pay" class="string optional" />
                </div>
            </div>
        </div>
        <input type="checkbox" value="1" style="display: none;" name="receipt" id="receipt" />
        <div class="sell-modal-footer">
            <input type="submit" value="Complete With Receipt" name="commit" id="cart_complete_with_receipt" data_disable_with="Processing..." class="btn btn-danger" />
            <input type="submit" value="Complete Sale" name="commit" data_disable_with="Processing..." class="btn btn-danger" />
        </div>
    </form>
</div>

我已经尝试了许多我能想到的不同的等效方法。最明显的是标签或 ID,例如:

choose 'cart_payment_type_cash_pay'
choose 'Cash'

这只是给了我错误:

Unable to find radio button "cart_payment_type_cash_pay" (Capybara::ElementNotFound)

我认为它可能与模态对话框、可见性等有关,但我引入 ID#payment_fat_buttons只是为了测试,当我像这样查找它时:

find('#payment_fat_buttons').choose('Cash')

它发现 DIV OK,但仍然不是单选按钮。我还尝试在整个页面上使用 :xpath 来处理它,并且在如下范围内:

within(:xpath, "//div[@id='payment_methods']") do
  find(:xpath, ".//input[@id='cart_payment_type_cash_pay']").choose
end

它的行为就像它也可以找到外部 DIV,但不能找到单选按钮 - 我收到错误:

Unable to find xpath ".//input[@id='cart_payment_type_cash_pay']" (Capybara::ElementNotFound)

一般来说,我似乎可以使用 :xpath 或 CSS 表达式在单选按钮周围找到任何任意元素,而不是单选按钮。我也可以毫无问题地按下表单上的提交按钮。我尝试删除数据属性作为测试 - 没有区别。任何帮助将不胜感激。这让我发疯,因为它看起来很简单,但我却一无所获。我需要为大部分场景选择它,所以如果我想不通,我将不得不求助于一些虚假和可怕的东西。提前谢谢了...

Gemfile.lock 的相关版本:

rails (3.2.13)
cucumber (1.3.8)
gherkin (2.12.2)
cucumber-rails (1.4.0)
capybara (2.1.0)
selenium-webdriver (2.35.1)
4

1 回答 1

7

终于想通了这一点。Capybara 没有找到单选按钮,因为在我的样式深处隐藏着一些 CSS 隐藏它以改变外观。一旦我意识到这一点,我发现我可以通过单击标签来回避查找单选按钮的整个问题:

find(:xpath, "//label[@for='the_radio_button_id']").click

我没有意识到可以以这种方式获取单选按钮 - 但无论如何,它解决了如何单击 Capybara 由于样式或其他问题而找不到的单选按钮的问题。希望对其他人有所帮助。

于 2013-10-29T21:38:36.913 回答