Wrapped выбирает тесты на сумерки

Я использую сумерки для тестирования браузера. Недавно начал пользоваться mdbootstrap, но не в этом дело. Дело в том, что mdb оборачивает выборки таким образом, что делает их непроверяемыми, как это обычно делаю я.

Что я делаю в своем лезвии:

<select class="mdb-select md-form" id="selectId" name="selectName">
  @foreach($elements as $element)
     <option value="{{ $element->id }}">{{ $element->display_name }}</option>
  @endforeach
</select>

Как на самом деле выглядит мой DOM

<div class="select-wrapper mdb-select md-form">
  <span class="caret">▼</span>
  <input type="text" class="select-dropdown" readonly="true" data-activates="select-options-f8364f16-85fb-4f93-a212-a11ee81271f1" value="" data-cip-id="cIPJQ342845639">
  <ul id="select-options-f8364f16-85fb-4f93-a212-a11ee81271f1" class="dropdown-content select-dropdown w-100">
    <li class="active"><span class="filtrable">Some Text</span></li>
  </ul>
  <select class="mdb-select md-form initialized" id="selectId" name="selectName">
    <option value="1"></option>
  </select>
</div>

Попытка использовать обычный select('@selector', 'value'); приводит к ошибке "Element is not currently visible and may not be manipulated".
Есть идеи, как я могу проверить свои выборки сейчас?
Когда у меня есть только один выбор, я мог бы попытаться щелкнуть эти теги ul и li вручную, но когда у меня есть несколько из них truoble начинается. Идентификаторы оболочки непредсказуемы, поэтому я не могу их жестко запрограммировать.


person TimSch    schedule 21.11.2018    source источник
comment
Можете ли вы предоставить простой jsfiddle.net?   -  person Jonas Staudenmeir    schedule 21.11.2018
comment
@JonasStaudenmeir Извините, это заняло некоторое время. Я не могу предоставить стандартную скрипку, потому что это функция профессиональной версии. Но вот ссылка на их собственный инструмент скрипки. mdbootstrap.com/snippets/jquery/schulz/178051   -  person TimSch    schedule 05.12.2018
comment
Вам, вероятно, придется использовать click(). Начните с чего-то вроде $browser->click('.select-wrapper'). stackoverflow.com/a/49539988/4848587 и stackoverflow.com/a/51195175/4848587 похожие проблемы.   -  person Jonas Staudenmeir    schedule 05.12.2018
comment
Большое спасибо. Это действительно хороший подход. К сожалению, это работает, только если есть только один выбор из-за случайного идентификатора. Но это не проблема сумерек.   -  person TimSch    schedule 06.12.2018
comment
Я открыл тикет здесь: mdbootstrap.com/support/jquery/ Если кто-то тоже столкнется с этим, вы можете посмотреть прогресс там.   -  person TimSch    schedule 06.12.2018
comment
Если у вас есть несколько вариантов выбора, вы можете использовать что-то вроде этого: $browser->elements('.select-wrapper')[$i]->click()   -  person Jonas Staudenmeir    schedule 06.12.2018
comment
Это решит это! Отлично, спасибо. @JonasStaudenmeir   -  person TimSch    schedule 06.12.2018


Ответы (1)


Благодаря Йонасу Штауденмейру я смог создать хорошее решение.

Я написал функцию для выбора одного элемента элемента select, предоставив класс или идентификатор элемента и текст элемента для выбора.
Я также написал функцию для проверки того, выбран ли конкретный элемент.
Это может выглядеть немного быстро и грязно, и, возможно, я смогу его улучшить, но пока я доволен.

функция выбора:

    /**
     * Selects an mdBootstrap select
     * @param Browser $browser
     * @param $method string "id" or "class"
     * @param $selector string id or class of the searched select element
     * @param $text string text of the select item to select 
     */
    public function mdbSelectByNativeSelector(Browser $browser, $method, $selector, $text)
    {
        $text = trim($text);
        //Find the select element itself
        $selects = $browser->elements(".select-wrapper");
        $select = 0;

    foreach ($selects as $el)
    {
        if ($el->findElement(WebDriverBy::tagName("select"))->getAttribute($method) == $selector)
        {
            $select = $el;
        }
    }
    PHPUnit::assertTrue(is_a($select, RemoteWebElement::class), "Select with {$method} {$selector} not found!");
    $select->click();

    //Find the content of the select
    $select_content = $select->findElement(WebDriverBy::className("dropdown-content"));
    //Select the nthElement (li) of the select content.

    $liElements = $select_content->findElements(WebDriverBy::tagName("li"));
    foreach ($liElements as $el)
    {
        if ($el->getText() == $text)
        {
            $el->click();
            return;
        }
    }
}

подтвердить выбранную функцию:

   /**
     * Tests if an mdbSelect is selected
     * @param $method string "id" or "name"
     * @param $selector string the id or name of the native select element
     * @param $text string the content of the selectable element (value not possible because it's flushed away)
     * @return DuskBrowser
     */
    public function assertMDBSelected($method, $selector, $text)
    {

        //Find the select element itself
        $selects = $this->elements(".select-wrapper");
        $select = 0;
        $success = false;

    foreach ($selects as $el)
    {
        if ($el->findElement(WebDriverBy::tagName("select"))->getAttribute($method) == $selector)
        {
            $select = $el;
        }
    }

    PHPUnit::assertTrue(is_a($el, RemoteWebElement::class), "Didn't find expected native select with {$method} {$selector}.");

    //Find the content of the select
    $select_content = $select->findElement(WebDriverBy::className("dropdown-content"));
    //Select the nthElement (li) of the select content.
    $liElements = $select_content->findElements(WebDriverBy::tagName("li"));
    foreach ($liElements as $el)
    {
        if (strpos($el->getAttribute("class"), "active") !== false)
        {
            //We need to ltrim because mdb inserts some problematic whitespaces in the text.
            if(ltrim($el->findElement(WebDriverBy::tagName("span"))->getAttribute("innerHTML")) == $text){
                $success = true;
                break;
            }
        }
    }
    PHPUnit::assertTrue($success, "Select is not selected!");
    return $this;
}

Несколько слов о последней функции:
Чтобы использовать собственные утверждения в сумерках, вам нужно создать собственный браузер. Я следовал этому руководству. Самые важные шаги здесь:

  1. Создайте класс DuskBrowser, который расширяет Browser
  2. Включите туда свою пользовательскую функцию assert.
  3. Переопределить функцию protected newBrowser. Его единственная задача — вернуть новый DuskBrowser.

    protected function newBrowser($driver)
    {
    return new DuskBrowser($driver);
    }

person TimSch    schedule 12.12.2018