【问题标题】:Laravel Dusk + Vue with ElementUILaravel Dusk + Vue 与 ElementUI
【发布时间】:2018-09-05 22:49:16
【问题描述】:

我需要帮助编写 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 的选择 :(

请帮忙,

谢谢!

编辑

发布 ElementUI 生成的 html:

    <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 的选择示例中添加了一个简单的 JSFiddle。我只是想用 Laravel Dusk 测试那个选择

【问题讨论】:

  • 能否贴出ElementUI为选择组件生成的HTML?
  • 我添加了。谢谢评论:D
  • 我从未使用过 ElementUI。您能给我一个简单的代码示例(HTML 和 JS),以便我尝试找到解决方案吗?
  • 或者你可以创建一个公共测试网站吗?
  • 我添加了 JSFiddle,但我不知道这是否足够。谢谢你的帮助!

标签: laravel testing select laravel-dusk element-ui


【解决方案1】:

您必须点击.el-select 元素并等待弹出窗口打开:

$browser->click('.el-select');
$browser->waitFor('.el-select-dropdown.el-popper');

然后你可以通过索引选择一个选项:

$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();

我看不到按值选择选项的方法,因为值不在 HTML 中的任何位置。

【讨论】:

    【解决方案2】:

    这只有在页面上只有一个 el-select 时才有效,当您有多个时无法识别它们或添加标识符

    【讨论】:

    • (这篇文章似乎没有为问题提供quality answer。请编辑您的答案并改进它,或者将其作为对问题的评论发布。)
    • 你能再解释一下吗?
    • 如果页面上有两个 el-select 元素,则 $browser-&gt;waitFor('.el-select-dropdown.el-popper'); 不再有效。它超时。 Facebook\WebDriver\Exception\TimeOutException: Waited 5 seconds for selector [body &gt; div.el-select-dropdown.el-popper.is-multiple] 没有办法让选择器足够独特。如果我删除其中一个 el-select 元素,那么上述方法确实有效。
    • @Lionslair ,我找到了一个执行 Javascript 的解决方案。它并不完美,但它对完成测试和使用多个el-select很有用。
    • 维护者回复了我。使用 popper-class 属性可以添加一个对我有用的唯一标识符
    【解决方案3】:

    @Lionslair 是对的:如果您在页面中使用多个el-select,@JonasStaudenmeir 的解决方案会返回错误。

    为了让它工作,我使用 javascript 执行。您可以在自定义 BrowserComponent 中添加此功能:

    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);
    

    【讨论】:

      猜你喜欢
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多