我们如何使用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—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—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—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;
}