/** * @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)); } }
/** * @param string $filterName The name of the filter * @param string $value The value to filter by * @param string $operator If false, no operator will be selected * @param DriverInterface|null $driver Required to filter by multiple choices */ 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')) { if ($operator !== false) { $filter->find('css', 'button.dropdown-toggle')->click(); $filter->find('css', '[data-value="' . $operator . '"]')->click(); } if ($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)); } }