我们如何使用Laravel Dusk检查Twitter引导单选按钮?

我们如何使用Laravel Dusk检查Twitter引导单选按钮?,laravel,testing,webdriver,laravel-dusk,facebook-php-webdriver,Laravel,Testing,Webdriver,Laravel Dusk,Facebook Php Webdriver,根据,这是我们制作收音机的方式: <div class="radio"> <label> <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked> Option one is this and that&mdash;be sure to include why it's great </label> &l

根据,这是我们制作收音机的方式:

<div class="radio">
  <label>
    <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked>
    Option one is this and that&mdash;be sure to include why it's great
  </label>
</div>
在标签标签内输入。但问题是Dask(实际上是Facebook Webdriver)无法以这种方式找到它。它不断提出:

Facebook\WebDriver\Exception\ElementNotVisibleException: element not visible
为了让它工作,我把输入放在标签外面,但是,当然,boostrap收音机不再显示它应该显示的内容了

<div class="radio">
  <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked>
  <label>
    Option one is this and that&mdash;be sure to include why it's great
  </label>
</div>
问题是Dusk(Webdriver)甚至看不到页面中的元素,因为这个简单的like以完全相同的方式失败:

$browser->waitFor('#sitesActive3');
导致:

Facebook\WebDriver\Exception\TimeOutException: Waited 5 seconds for selector [#sitesActive3].
每次我有一个表单,表单上有一个输入,周围有一个标签,如果我把输入从标签中拿出来,它就会工作。但对于收音机来说,这并不像其他一些输入,收音机那样简单

这是一台正确编码的收音机:

这是一台输入在标签外的收音机:


那么,您是如何做到这一点的呢?

您可能不愿意为了测试脚本而编辑视图,但是如果您愿意这样做,那么向测试脚本添加一个类怎么样

<input type="radio" ... > 

在您的黄昏测试中?

我的表单有一个单选按钮。我就是这样检查的

userCreate.blade.php

这对我有用。我想这会对你有所帮助。

他们会说:

要“选择”单选按钮选项,可以使用
单选
方法。与许多其他与输入相关的方法一样,不需要完整的CSS选择器。如果找不到精确的选择器匹配,Dask将搜索具有匹配的
名称
属性的收音机:
$browser->radio('version','php7')

在我的例子中,“黄昏”对我的大多数单选按钮都很好,但对以下情况不起作用:

->radio(“Field728”,“知道这是任何致力于这个梦想的人都会做的事,如果她找到了一个具有经过验证的流程和支持社区的优秀节目”)

我也试着用双引号,但也没用。(可能值太长了?我不知道。)

于是我做了这个:


->radio('#Field728_0',true)//这是此组的第一个单选按钮的特定ID

最简单的方法是单击父按钮

$el = $this->resolver->resolveForRadioSelection($field, $value);
$el = $el->findElement(WebDriverBy::xpath(".."));
$el->click();
由于收音机不可见,黄昏不能点击它

如果在项目中使用引导,您可能会创建如下特征

trait BootstrapInteraction
{
    /**
     * Undocumented variable
     * @var \Laravel\Dusk\ElementResolver $resolver
     */
    public   $resolver;
    public function radioB($field, $value)
    {
        /**
         * @var RemoteWebElement $el
         */
        $radio = $this->resolver->resolveForRadioSelection($field, $value);
        // click on parent
        $el = $radio->findElement(WebDriverBy::xpath(".."));
        $el->click();
        // if not selected click on label 
        if (!$radio->isSelected()) {
            $el = $el->findElement(WebDriverBy::cssSelector("label"));
            $el->click();
        }

        PHPUnit::assertTrue(
            $radio->isSelected(),
            "Not able to select Radio [{$field}] within value [{$value}]."
        ); 

        return $this;
    }

这会很奇怪,因为我必须为每个收音机
.myRadioClass1;添加一个类。myRadioClass2
,但我使用ID尝试了类似的方法:
,然后执行
->单击(“#radio1”)
,但它不起作用我尝试了类的方法,它似乎起作用了-但是你是对的,为每个元素添加单独的类可能会很烦人。我将期待看到出现其他建议。这似乎不正确,因为您已将
id=“gender”
设置为同一页面上的多个元素,这打破了HTML规则,即
id
必须是唯一的。不应具有多个id属性这是最好的答案。$el=$browser等功能就像一个魔咒一样,一目了然。然而,@Pascal,我无法实现你建议的trait方法。我创建了Trait并在文件和类中添加了use Trait。我通过:$this->browse(函数($browser)use($user){$browser->radioB($field,$value)->click();}访问Dash浏览器实例,但是我得到了对未定义方法[radioB]的调用。我如何引用浏览器实例和trait方法?提前谢谢。
<input type="radio" ... > 
        ->click('.yourClass') 
<div class="row">
    <div class="col-md-12">
        <div class="form-group">
            <label>Gender</label>
            <div>
                <label class="radio-inline">
                    <input type="radio" id="gender" name="gender" value="m">Male
                </label>
                <label class="radio-inline">
                    <input type="radio" id="gender" name="gender" value="f">Female
                </label>
            </div>
        </div>
    </div>
</div>
class CreateUserTest extends DuskTestCase
{

    public function  testCreateForm()
    {
        $this->browse(function (Browser $browser) {
            $browser->visit('/user/create')
                ->radio('#gender', 'm')
                ->click('button[type="submit"]')
                ->assertSee('Successfully created user.');
        });
    }
}
$el = $this->resolver->resolveForRadioSelection($field, $value);
$el = $el->findElement(WebDriverBy::xpath(".."));
$el->click();
trait BootstrapInteraction
{
    /**
     * Undocumented variable
     * @var \Laravel\Dusk\ElementResolver $resolver
     */
    public   $resolver;
    public function radioB($field, $value)
    {
        /**
         * @var RemoteWebElement $el
         */
        $radio = $this->resolver->resolveForRadioSelection($field, $value);
        // click on parent
        $el = $radio->findElement(WebDriverBy::xpath(".."));
        $el->click();
        // if not selected click on label 
        if (!$radio->isSelected()) {
            $el = $el->findElement(WebDriverBy::cssSelector("label"));
            $el->click();
        }

        PHPUnit::assertTrue(
            $radio->isSelected(),
            "Not able to select Radio [{$field}] within value [{$value}]."
        ); 

        return $this;
    }