Проверьте радио кнопку с 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;
}