Проверьте радио кнопку с Behat

Я застрял в этой проблеме на 1 час. На самом деле, должно быть не сложно проверить переключатель с норкой. Как это сделать я уже нашел. Но это работает только тогда, когда переключатель находится внутри тегов формы. Если у меня есть

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

Невозможно проверить переключатель, или я не смог его найти. Есть идеи?

4 ответа

Я обнаружил, что форма "Когда я выбираю" значение "из" имени "" работает для выбора переключателей. Возможно, ваш код будет работать с: Когда я выбираю "payone_today" из "payment[method]".

У меня была похожая проблема, и я использовал похожее решение - но в моих точных требованиях был поворот, который, по моему мнению, мог бы быть полезным.

Что произойдет, если у вас есть две кнопки с одинаковым текстом метки? Это вполне возможно, когда у вас есть несколько групп переключателей, и решение, приведенное выше, найдет только первую кнопку с этим ярлыком в 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}");
}

Если ваш переключатель имеет <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'));
}

Я адаптировал это из поста в блоге, на который есть ссылка в ответе Нассима - код там зависит от вашего переключателя <input> быть завернутым в этикетку, что было невозможно (ну, не легко) в моей ситуации.

Я обнаружил, что самое простое решение кода было что-то вроде этого.

/**
 * @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;
}
Другие вопросы по тегам