Пример #1
0
 /**
  * @param string               $filterName The name of the filter
  * @param string               $value      The value to filter by
  * @param bool|string          $operator   If false, no operator will be selected
  * @param DriverInterface|null $driver     Required to filter by multiple choices
  *
  * @throws \Behat\Mink\Exception\ElementNotFoundException
  */
 public function filterBy($filterName, $value, $operator = false, DriverInterface $driver = null)
 {
     $filter = $this->getFilter($filterName);
     $this->openFilter($filter);
     if ($elt = $filter->find('css', 'select')) {
         if ($elt->getText() === "between not between more than less than is empty") {
             $this->filterByDate($filter, $value, $operator);
         } elseif ($elt->getParent()->find('css', 'button.ui-multiselect')) {
             if (!$driver || !$driver instanceof Selenium2Driver) {
                 throw new \InvalidArgumentException('Selenium2Driver is required to filter by a choice filter');
             }
             $values = explode(',', $value);
             foreach ($values as $value) {
                 $driver->executeScript(sprintf("\$('.ui-multiselect-menu:visible input[title=\"%s\"]').click().trigger('click');", $value));
                 sleep(1);
             }
             // Uncheck the 'All' option
             if (!in_array('All', $values)) {
                 $driver->executeScript("var all = \$('.ui-multiselect-menu:visible input[title=\"All\"]');" . "if (all.length && all.is(':checked')) { all.click().trigger('click'); }");
             }
         }
     } elseif ($elt = $filter->find('css', 'div.filter-criteria')) {
         $results = $this->getElement('Select2 results');
         $select2 = $filter->find('css', '.select2-input');
         if (false !== $operator) {
             $filter->find('css', 'button.dropdown-toggle')->click();
             $filter->find('css', sprintf('[data-value="%s"]', $operator))->click();
         }
         if (null !== $results && null !== $select2) {
             if (in_array($value, ['empty', 'is empty'])) {
                 // Allow passing 'empty' as value too (for backwards compability with existing scenarios)
                 $filter->find('css', 'button.dropdown-toggle')->click();
                 $filter->find('css', '[data-value="empty"]')->click();
             } else {
                 $values = explode(',', $value);
                 foreach ($values as $value) {
                     $driver->getWebDriverSession()->element('xpath', $select2->getXpath())->postValue(['value' => [$value]]);
                     sleep(2);
                     $results->find('css', 'li')->click();
                     sleep(2);
                 }
             }
         } elseif ($value !== false) {
             $elt->fillField('value', $value);
         }
         $filter->find('css', 'button.filter-update')->click();
     } else {
         throw new \InvalidArgumentException(sprintf('Filtering by "%s" is not yet implemented"', $filterName));
     }
 }