用Behat检查单选按钮

时间:2013-09-24 11:05:33

标签: button radio behat mink

我在这个问题上停留了1个小时。实际上,检查带有Mink的单选按钮应该不难。怎么做,我已经找到了。但它只有在单选按钮位于表单标签内时才有效。如果我有

<table>
    <tr>
        <td>
            <input id="payone" type="radio" name="payment[method]" value="payone_today">
            <label for="payone">Vorkasse</label>
        </td>
    </tr>
</table>

无法检查单选按钮,或者找不到它。有什么想法吗?

4 个答案:

答案 0 :(得分:10)

我发现'当我选择'值“来自”名称“'形式用于选择单选按钮。也许你的代码可以使用:当我从“payment [method]”中选择“payone_today”时。

答案 1 :(得分:5)

我有一个类似的问题,并使用了类似的解决方案 - 但我认为可能有用的确切要求有所改变。

如果您有两个带有相同标签文字的单选按钮会怎样?当你有多个单选按钮组并且上面的解决方案只能在DOM中找到带有该标签的第一个按钮时,这是完全可能的 - 你可能希望它是第二个或第三个。

提供每个单选按钮组都在容器内,然后您可以从该容器开始,而不是通过整个DOM。

我对原始问题和稍微扩展版本的解决方案如下所示。

/**
 * @When /^I check the "([^"]*)" radio button$/
 */
public function iCheckTheRadioButton($labelText) {
    $page = $this->getMainContext()->getSession()->getPage();
    foreach ($page->findAll('css', 'label') as $label) {
        if ( $labelText === $label->getText() ) {
            $radioButton = $page->find('css', '#'.$label->getAttribute('for'));
            $radioButton->click();
            return;
        }
    }
    throw new \Exception("Radio button with label {$labelText} not found");
}

/**
 * @When /^I check the "([^"]*)" radio button in "([^"]*)" button group$/
 */
public function iCheckButtonInGroup($labelText, $groupSelector){
    $page = $this->getMainContext()->getSession()->getPage();
    $group = $page->find('css',$groupSelector);
    foreach ($group->findAll('css', 'label') as $label) {
        if ( $labelText === $label->getText() ) {
            $radioButton = $page->find('css', '#'.$label->getAttribute('for'));
            $radioButton->click();
            return;
        }
    }
    throw new \Exception("Radio button with label {$labelText} not found in group {$groupSelector}");
}

答案 2 :(得分:1)

如果您的单选按钮具有<label>,并且该标签使用for属性来标识其目标,则可以使用以下代码:

/**
 * @When /^I select the "([^"]*)" radio button$/
 */
public function iSelectTheRadioButton($labelText)
{
    // Find the label by its text, then use that to get the radio item's ID
    $radioId = null;
    $ctx = $this->getMainContext();

    /** @var $label NodeElement */
    foreach ($ctx->getSession()->getPage()->findAll('css', 'label') as $label) {
        if ($labelText === $label->getText()) {
            if ($label->hasAttribute('for')) {
                $radioId = $label->getAttribute('for');
                break;
            } else {
                throw new \Exception("Radio button's label needs the 'for' attribute to be set");
            }
        }
    }
    if (!$radioId) {
        throw new \InvalidArgumentException("Label '$labelText' not found.");
    }

    // Now use the ID to retrieve the button and click it
    /** @var NodeElement $radioButton */
    $radioButton = $ctx->getSession()->getPage()->find('css', "#$radioId");
    if (!$radioButton) {
        throw new \Exception("$labelText radio button not found.");
    }

    $ctx->fillField($radioId, $radioButton->getAttribute('value'));
}

我在Nassim的回答链接的博客文章中对此进行了调整 - 那里的代码依赖于你的单选按钮<input>被包裹在标签中,这在我的情况下是不可能的(好吧,不容易)。

答案 3 :(得分:0)

我发现最简单的代码解决方案是这样的。

/**
 * @Given /^I check the "([^"]*)" radio button with "([^"]*)" value$/
 */
public function iCheckTheRadioButtonWithValue($element, $value)
{
  foreach ($this->getMainContext()->getSession()->getPage()->findAll('css', 'input[type="radio"][name="'. $element .'"]') as $radio) {
    if ($radio->getAttribute('value') == $value) {
      $radio->check();
      return true;
    }
  }
  return false;
}