Laravel Dusk + Vue 与 ElementUI
Laravel Dusk + Vue with ElementUI
我需要帮助 Laravel Dusk 编写测试。我在 ElementUI 中使用 Vue。我真的很喜欢这个框架,但是,我不能在我的测试中使用 Dusk 的内置 select()
方法。
这是因为 ElementUI 的 select 组件并没有生成真正的 <select>
标签,而是创建了一个普通的 <input>
(即只读),并且在底部页面,带有 select 选项的 popper,因此,我的页面中没有 <select>
标签,只有 <div>
和只读<input>
。
如何使用 Dusk 编写测试,让我可以点击 'div'?
如果我尝试在该输入上输入类似这样的内容:
// $browser->select('my_select_id'); not working,
$browser->type('my_select_id', 1);
它抛出一个异常:
Facebook\WebDriver\Exception\InvalidElementStateException: invalid element state: Element must be user-editable in order to clear it.
所以我不知道如何测试 ElementUI 的 selects :(
请帮忙,
谢谢!
编辑
发布 html 由 ElementUI 生成:
<div class="el-select w-100 el-select--mini" value="0" title="Cliente" dusk="v-select-component">
<div class="el-input el-input--mini el-input--suffix">
<input autocomplete="off" placeholder="Cliente" size="mini" name="client_id" id="client_id" readonly="readonly" type="text" rows="2" class="el-input__inner">
<span class="el-input__suffix">
<span class="el-input__suffix-inner">
<i class="el-select__caret el-input__icon el-icon-arrow-up"></i>
</span>
</span>
</div>
<div class="el-select-dropdown el-popper" style="display: none; min-width: 512.344px;">
<div class="el-scrollbar" style="">
<div class="el-select-dropdown__wrap el-scrollbar__wrap" style="margin-bottom: -17px; margin-right: -17px;">
<ul class="el-scrollbar__view el-select-dropdown__list" style="position: relative;">
<li class="el-select-dropdown__item selected"><span>Item 1</span></li>
<li class="el-select-dropdown__item"><span>Item 2</span></li>
</ul>
</div>
<div class="el-scrollbar__bar is-horizontal">
<div class="el-scrollbar__thumb" style="transform: translateX(0%);"></div>
</div>
<div class="el-scrollbar__bar is-vertical">
<div class="el-scrollbar__thumb" style="transform: translateY(0%);"></div>
</div>
</div>
</div>
</div>
编辑 2:
我用 ElementUI 的 select 示例添加了一个简单的 JSFiddle。我只是想用 Laravel Dusk
测试 select
您必须单击 .el-select
元素并等待弹出器打开:
$browser->click('.el-select');
$browser->waitFor('.el-select-dropdown.el-popper');
然后你可以select一个索引选项:
$browser->elements('.el-select-dropdown__item')[2]->click();
或通过文字:
$selector = "//li[@class='el-select-dropdown__item']/span[text()='Option3']";
$browser->driver->findElement(WebDriverBy::xpath($selector))->click();
我看不到按值 select 选项的方法,因为值不在 HTML 中的任何位置。
仅当您在页面上只有一个 el-select 时才有效,当您有多个时无法识别它们或添加标识符
@Lionslair 是对的:如果您在页面中使用多个 el-select
,@JonasStaudenmeir 的解决方案 returns 错误。
为了让它工作,我使用 javascript 执行。您可以在自定义 Browser
或 Component
中添加此功能:
public function elSelectDropdownClose(Browser $browser)
{
$browser->script(
<<<EOT
Array.prototype.slice.call(document.querySelectorAll('.el-select-dropdown.el-popper:not([style*=\"display: none\"])')).map(function(el){
el.style.display = 'none'
})
EOT
);
}
public function elSelectDropdownClick(Browser $browser, $index)
{
$browser->script(
<<<EOT
document.querySelectorAll('.el-select-dropdown.el-popper:not([style*=\"display: none\"]) .el-select-dropdown__item')[$index].click()
EOT
);
$this->elSelectDropdownClose($browser);
}
运行 测试:
$browser
->click('.el-select.first')
->elSelectDropdownClick(0);
$browser
->click('.el-select.second')
->elSelectDropdownClick(2);
我需要帮助 Laravel Dusk 编写测试。我在 ElementUI 中使用 Vue。我真的很喜欢这个框架,但是,我不能在我的测试中使用 Dusk 的内置 select()
方法。
这是因为 ElementUI 的 select 组件并没有生成真正的 <select>
标签,而是创建了一个普通的 <input>
(即只读),并且在底部页面,带有 select 选项的 popper,因此,我的页面中没有 <select>
标签,只有 <div>
和只读<input>
。
如何使用 Dusk 编写测试,让我可以点击 'div'?
如果我尝试在该输入上输入类似这样的内容:
// $browser->select('my_select_id'); not working,
$browser->type('my_select_id', 1);
它抛出一个异常:
Facebook\WebDriver\Exception\InvalidElementStateException: invalid element state: Element must be user-editable in order to clear it.
所以我不知道如何测试 ElementUI 的 selects :(
请帮忙,
谢谢!
编辑
发布 html 由 ElementUI 生成:
<div class="el-select w-100 el-select--mini" value="0" title="Cliente" dusk="v-select-component">
<div class="el-input el-input--mini el-input--suffix">
<input autocomplete="off" placeholder="Cliente" size="mini" name="client_id" id="client_id" readonly="readonly" type="text" rows="2" class="el-input__inner">
<span class="el-input__suffix">
<span class="el-input__suffix-inner">
<i class="el-select__caret el-input__icon el-icon-arrow-up"></i>
</span>
</span>
</div>
<div class="el-select-dropdown el-popper" style="display: none; min-width: 512.344px;">
<div class="el-scrollbar" style="">
<div class="el-select-dropdown__wrap el-scrollbar__wrap" style="margin-bottom: -17px; margin-right: -17px;">
<ul class="el-scrollbar__view el-select-dropdown__list" style="position: relative;">
<li class="el-select-dropdown__item selected"><span>Item 1</span></li>
<li class="el-select-dropdown__item"><span>Item 2</span></li>
</ul>
</div>
<div class="el-scrollbar__bar is-horizontal">
<div class="el-scrollbar__thumb" style="transform: translateX(0%);"></div>
</div>
<div class="el-scrollbar__bar is-vertical">
<div class="el-scrollbar__thumb" style="transform: translateY(0%);"></div>
</div>
</div>
</div>
</div>
编辑 2:
我用 ElementUI 的 select 示例添加了一个简单的 JSFiddle。我只是想用 Laravel Dusk
测试 select您必须单击 .el-select
元素并等待弹出器打开:
$browser->click('.el-select');
$browser->waitFor('.el-select-dropdown.el-popper');
然后你可以select一个索引选项:
$browser->elements('.el-select-dropdown__item')[2]->click();
或通过文字:
$selector = "//li[@class='el-select-dropdown__item']/span[text()='Option3']";
$browser->driver->findElement(WebDriverBy::xpath($selector))->click();
我看不到按值 select 选项的方法,因为值不在 HTML 中的任何位置。
仅当您在页面上只有一个 el-select 时才有效,当您有多个时无法识别它们或添加标识符
@Lionslair 是对的:如果您在页面中使用多个 el-select
,@JonasStaudenmeir 的解决方案 returns 错误。
为了让它工作,我使用 javascript 执行。您可以在自定义 Browser
或 Component
中添加此功能:
public function elSelectDropdownClose(Browser $browser)
{
$browser->script(
<<<EOT
Array.prototype.slice.call(document.querySelectorAll('.el-select-dropdown.el-popper:not([style*=\"display: none\"])')).map(function(el){
el.style.display = 'none'
})
EOT
);
}
public function elSelectDropdownClick(Browser $browser, $index)
{
$browser->script(
<<<EOT
document.querySelectorAll('.el-select-dropdown.el-popper:not([style*=\"display: none\"]) .el-select-dropdown__item')[$index].click()
EOT
);
$this->elSelectDropdownClose($browser);
}
运行 测试:
$browser
->click('.el-select.first')
->elSelectDropdownClick(0);
$browser
->click('.el-select.second')
->elSelectDropdownClick(2);