Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
DataGrid.php
Go to the documentation of this file.
1 <?php
8 
9 use Magento\Mtf\Client\Locator;
11 use Magento\Mtf\Client\Element\SimpleElement;
12 
18 class DataGrid extends Grid
19 {
25  protected $editLink = '.action-menu-item[href*="edit"]';
26 
32  protected $appliedFiltersList = '[data-role="filter-list"]';
33 
39  protected $filterButton = '[data-action="grid-filter-expand"]';
40 
46  protected $selectItem = 'tbody tr [data-action="select-row"]';
47 
53  protected $rowTemplate = 'td[*[contains(.,normalize-space("%s"))]]';
54 
60  protected $rowTemplateStrict = 'td[*[text()[normalize-space()="%s"]]]';
61 
67  protected $massActionToggleButton = '//th//button[@data-toggle="dropdown"]';
68 
74  protected $massActionToggleList = './/span[contains(@class, "action-menu-item") and .= "%s"]';
75 
81  protected $actionButton = '.action-select';
82 
88  protected $actionList = './/span[contains(@class, "action-menu-item") and .= "%s"]';
89 
95  protected $columnHeader = './/*[@data-role="grid-wrapper"]//th/span[.="%s"]';
96 
102  protected $rowById = ".//tr[td//input[@data-action='select-row' and @value='%s']]";
103 
109  protected $columnNumber = ".//th[span[.='%s']][not(ancestor::*[@class='sticky-header'])]/preceding-sibling::th";
110 
116  protected $cellByHeader = "//td[%s+1]";
117 
118  // @codingStandardsIgnoreStart
124  private $gridHeader = './/div[@class="admin__data-grid-header"][(not(ancestor::*[@class="sticky-header"]) and not(contains(@style,"visibility: hidden"))) or (ancestor::*[@class="sticky-header" and not(contains(@style,"display: none"))])]';
125  // @codingStandardsIgnoreEnd
126 
130  protected $fullTextSearchField = '.data-grid-search-control-wrap .data-grid-search-control';
131 
135  protected $fullTextSearchButton = '.data-grid-search-control-wrap .action-submit';
136 
142  protected $noRecords = '[class$=no-data]';
143 
149  protected $alertModal = '._show[data-role=modal]';
150 
156  protected $sortLink = './/div[@data-role="grid-wrapper"]//th[contains(@class, "%s")]/span[contains(text(), "%s")]';
157 
163  protected $currentPage = ".//*[@data-ui-id='current-page-input'][not(ancestor::*[@class='sticky-header'])]";
164 
170  public function resetFilter()
171  {
172  $chipsHolder = $this->getGridHeaderElement()->find($this->appliedFiltersList);
173  if ($chipsHolder->isVisible()) {
174  parent::resetFilter();
175  }
176  $this->waitLoader();
177  }
178 
184  protected function waitFilterToLoad()
185  {
186  $this->getTemplateBlock()->waitLoader();
187  $browser = $this->_rootElement;
188  $selector = $this->filterButton . ', ' . $this->resetButton;
189  $browser->waitUntil(
190  function () use ($browser, $selector) {
191  $filter = $browser->find($selector);
192  return $filter->isVisible() == true ? true : null;
193  }
194  );
195  }
196 
202  protected function openFilterBlock()
203  {
204  $this->waitFilterToLoad();
205 
206  $toggleFilterButton = $this->_rootElement->find($this->filterButton);
207  $searchButton = $this->_rootElement->find($this->searchButton);
208  if ($toggleFilterButton->isVisible() && !$searchButton->isVisible()) {
209  $toggleFilterButton->click();
210  $browser = $this->_rootElement;
211  $browser->waitUntil(
212  function () use ($searchButton) {
213  return $searchButton->isVisible() ? true : null;
214  }
215  );
216  }
217  }
218 
225  protected function clickEditLink(SimpleElement $rowItem)
226  {
227  $rowItem->find($this->editLink)->click();
228  }
229 
236  public function search(array $filter)
237  {
238  $this->openFilterBlock();
239  parent::search($filter);
240  $this->waitForElementNotVisible($this->searchButton);
241  $this->waitLoader();
242  }
243 
250  public function searchAndOpen(array $filter)
251  {
252  $this->search($filter);
253  $rowItem = $this->getRow($filter);
254  if ($rowItem->isVisible()) {
255  $this->clickEditLink($rowItem);
256  } else {
257  throw new \Exception("Searched item was not found by filter\n" . print_r($filter, true));
258  }
259  $this->waitLoader();
260  }
261 
268  public function searchAndSelect(array $filter)
269  {
270  $this->search($filter);
271  $rowItem = $this->getRow($filter);
272  if ($rowItem->isVisible()) {
273  $rowItem->find($this->selectItem)->click();
274  } else {
275  throw new \Exception("Searched item was not found by filter\n" . print_r($filter, true));
276  }
277  $this->waitLoader();
278  }
279 
289  public function massaction(array $items, $action, $acceptAlert = false, $massActionSelection = '')
290  {
291  $this->waitLoader();
292  $this->resetFilter();
293  if ($this->_rootElement->find($this->noRecords)->isVisible()) {
294  return;
295  }
296  $this->selectItems($items);
297  if ($massActionSelection) {
298  $this->selectMassAction($massActionSelection);
299  }
300  $this->selectAction($action);
301  if ($acceptAlert) {
302  $element = $this->browser->find($this->alertModal);
304  $modal = $this->blockFactory->create(
305  \Magento\Ui\Test\Block\Adminhtml\Modal::class,
306  ['element' => $element]
307  );
308  $modal->acceptAlert();
309  }
310  }
311 
318  public function selectMassAction($massActionSelection)
319  {
320  //Checks which dropdown is visible and uses it.
321  for ($i = 1; $i <= 2; $i++) {
322  $massActionButton = '(' . $this->massActionToggleButton . ")[$i]";
323  $massActionList = '(' . $this->massActionToggleList . ")[$i]";
324  if ($this->_rootElement->find($massActionButton, Locator::SELECTOR_XPATH)->isVisible()) {
325  $this->_rootElement->find($massActionButton, Locator::SELECTOR_XPATH)->click();
326  $this->_rootElement
327  ->find(sprintf($massActionList, $massActionSelection), Locator::SELECTOR_XPATH)
328  ->click();
329  break;
330  }
331  }
332  }
333 
340  public function selectAction($action)
341  {
342  $actionType = is_array($action) ? key($action) : $action;
343  $this->getGridHeaderElement()->find($this->actionButton)->click();
344  $toggle = $this->getGridHeaderElement()->find(sprintf($this->actionList, $actionType), Locator::SELECTOR_XPATH);
345  $toggle->hover();
346  if ($toggle->isVisible() === false) {
347  $this->getGridHeaderElement()->find($this->actionButton)->click();
348  }
349  $toggle->click();
350  if (is_array($action)) {
351  $locator = sprintf($this->actionList, end($action));
352  $this->getGridHeaderElement()->find($locator, Locator::SELECTOR_XPATH)->hover();
353  $this->getGridHeaderElement()->find($locator, Locator::SELECTOR_XPATH)->click();
354  }
355  }
356 
365  public function selectItems(array $items, $isSortable = true)
366  {
367  if ($isSortable) {
368  $this->sortGridByField('ID');
369  }
370  foreach ($items as $item) {
371  $this->_rootElement->find($this->currentPage, Locator::SELECTOR_XPATH)->setValue('');
372  $this->waitLoader();
373  $selectItem = $this->getRow($item)->find($this->selectItem);
374  do {
375  if ($selectItem->isVisible()) {
376  if (!$selectItem->isSelected()) {
377  $selectItem->click();
378  }
379  break;
380  }
381  } while ($this->nextPage());
382  if (!$selectItem->isVisible()) {
383  throw new \Exception("Searched item was not found\n" . print_r($item, true));
384  }
385  }
386  }
387 
395  public function sortGridByField($field, $sort = "desc")
396  {
397  $reverseSort = $sort == 'desc' ? 'asc' : 'desc';
398  $sortBlock = $this->_rootElement->find(sprintf($this->sortLink, $reverseSort, $field), Locator::SELECTOR_XPATH);
399  if ($sortBlock->isVisible()) {
400  $sortBlock->click();
401  $this->waitLoader();
402  }
403  }
404 
411  public function sortByColumn($columnLabel)
412  {
413  $this->waitLoader();
414  $this->getTemplateBlock()->waitForElementNotVisible($this->loader);
415  $this->_rootElement->find(sprintf($this->columnHeader, $columnLabel), Locator::SELECTOR_XPATH)->click();
416  $this->waitLoader();
417  }
418 
422  public function getFirstItemId()
423  {
424  $this->waitLoader();
425  $this->getTemplateBlock()->waitForElementNotVisible($this->loader);
426  return $this->_rootElement->find($this->selectItem)->getValue();
427  }
428 
434  public function getAllIds()
435  {
436  $this->waitLoader();
437  $this->getTemplateBlock()->waitForElementNotVisible($this->loader);
438  $rowsCheckboxes = $this->_rootElement->getElements($this->selectItem);
439  $ids = [];
440  foreach ($rowsCheckboxes as $checkbox) {
441  $ids[] = $checkbox->getValue();
442  }
443  return $ids;
444  }
445 
451  public function getColumnValue($id, $headerLabel)
452  {
453  $this->waitLoader();
454  $this->getTemplateBlock()->waitForElementNotVisible($this->loader);
455  $columnNumber = count(
456  $this->_rootElement->getElements(sprintf($this->columnNumber, $headerLabel), Locator::SELECTOR_XPATH)
457  );
458  $selector = sprintf($this->rowById, $id) . sprintf($this->cellByHeader, $columnNumber);
459 
460  return $this->_rootElement->find($selector, Locator::SELECTOR_XPATH)->getText();
461  }
462 
466  public function fullTextSearch($text)
467  {
468  $this->waitLoader();
469  $this->getTemplateBlock()->waitForElementNotVisible($this->loader);
470  $this->_rootElement->find($this->fullTextSearchField)->setValue($text);
471  $this->_rootElement->find($this->fullTextSearchButton)->click();
472  }
473 
480  public function getRowsData(array $columns)
481  {
482  $data = [];
483  $rows = $this->_rootElement->getElements($this->rowItem);
484  foreach ($rows as $row) {
485  $rowData = [];
486  foreach ($columns as $columnName) {
487  $rowData[$columnName] = trim($row->find('div[data-index="' . $columnName . '"]')->getText());
488  }
489 
490  $data[] = $rowData;
491  }
492 
493  return $data;
494  }
495 
501  private function getGridHeaderElement()
502  {
503  return $this->_rootElement->find($this->gridHeader, Locator::SELECTOR_XPATH);
504  }
505 }
selectItems(array $items, $isSortable=true)
Definition: DataGrid.php:365
selectMassAction($massActionSelection)
Definition: DataGrid.php:318
$id
Definition: fieldset.phtml:14
endifif( $block->getLastPageNum()>1)( 'Page') ?></strong >< ul class $text
Definition: pager.phtml:43
$columns
Definition: default.phtml:15
clickEditLink(SimpleElement $rowItem)
Definition: DataGrid.php:225
sortGridByField($field, $sort="desc")
Definition: DataGrid.php:395
$i
Definition: gallery.phtml:31
massaction(array $items, $action, $acceptAlert=false, $massActionSelection='')
Definition: Grid.php:319
getRow(array $filter, $isStrict=true)
Definition: Grid.php:369
$items
$element
Definition: element.phtml:12