我在这个问题上停留了1个小时。实际上,检查带有Mink的单选按钮应该不难。怎么做,我已经找到了。但它只有在单选按钮位于表单标签内时才有效。如果我有
<table>
<tr>
<td>
<input id="payone" type="radio" name="payment[method]" value="payone_today">
<label for="payone">Vorkasse</label>
</td>
</tr>
</table>
无法检查单选按钮,或者找不到它。有什么想法吗?
答案 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;
}