‪TYPO3CMS  ‪main
AbstractTree.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Facebook\WebDriver\Remote\RemoteWebElement;
21 
25 abstract class ‪AbstractTree
26 {
27  // Selectors
28  public static ‪$treeSelector = '';
29  public static ‪$treeItemSelector = '.nodes-list > [role="treeitem"]';
30  public static ‪$treeItemAnchorSelector = '.node-contentlabel';
31 
35  protected ‪$tester;
36 
40  public function ‪waitForNodes(): void
41  {
42  $this->tester->waitForElement(static::$treeSelector . ' ' . static::$treeItemSelector, 5);
43  }
44 
56  public function ‪openPath(array $path)
57  {
58  $context = $this->‪getPageTreeElement();
59 
60  $this->‪waitForNodes();
61 
62  // Collapse all opened paths (might be opened due to localstorage)
63  do {
64  $toggled = false;
65  try {
66  // collapse last opened node element, that is not the root (=first node)
67  $context->findElement(\Facebook\WebDriver\WebDriverBy::xpath('(.//*[position()>1 and @role="treeitem" and */typo3-backend-icon/@identifier="actions-chevron-down"])[last()]/*[@class="node-toggle"]'))->click();
68  $toggled = true;
69  } catch (\Facebook\WebDriver\‪Exception\NoSuchElementException $e) {
70  // element not found so it may be already opened...
71  } catch (\Facebook\WebDriver\‪Exception\ElementNotVisibleException $e) {
72  // element not found so it may be already opened...
73  } catch (\Facebook\WebDriver\‪Exception\ElementNotInteractableException $e) {
74  // another possible exception if the chevron isn't there ... depends on facebook driver version
75  }
76  } while ($toggled);
77 
78  foreach ($path as $pageName) {
79  $context = $this->‪ensureTreeNodeIsOpen($pageName, $context);
80  }
81  $context->findElement(\Facebook\WebDriver\WebDriverBy::cssSelector(static::$treeItemAnchorSelector))->click();
82  }
83 
89  public function ‪getPageTreeElement()
90  {
91  $I = ‪$this->tester;
92  $I->switchToIFrame();
93  return $I->executeInSelenium(function (\Facebook\WebDriver\Remote\RemoteWebDriver $webdriver) {
94  return $webdriver->findElement(\Facebook\WebDriver\WebDriverBy::cssSelector(static::$treeSelector));
95  });
96  }
97 
105  protected function ‪ensureTreeNodeIsOpen(string $nodeText, RemoteWebElement $context)
106  {
107  $I = ‪$this->tester;
108  $I->see($nodeText, static::$treeItemSelector);
109 
111  $context = $I->executeInSelenium(function () use (
112  $nodeText,
113  $context
114  ) {
115  return $context->findElement(\Facebook\WebDriver\WebDriverBy::xpath('//*[@class=\'node-name\'][text()=\'' . $nodeText . '\']/../../..'));
116  });
117 
118  try {
119  $context->findElement(\Facebook\WebDriver\WebDriverBy::cssSelector('.node-toggle > typo3-backend-icon[identifier=\'actions-chevron-right\']'))->click();
120  } catch (\Facebook\WebDriver\Exception\NoSuchElementException $e) {
121  // element not found so it may be already opened...
122  } catch (\Facebook\WebDriver\Exception\ElementNotVisibleException $e) {
123  // element not found so it may be already opened...
124  } catch (\Facebook\WebDriver\Exception\ElementNotInteractableException $e) {
125  // another possible exception if the chevron isn't there ... depends on facebook driver version
126  }
127 
128  return $context;
129  }
130 }
‪TYPO3\CMS\Core\Tests\Acceptance\Support\Helper\AbstractTree\$treeItemAnchorSelector
‪static $treeItemAnchorSelector
Definition: AbstractTree.php:30
‪TYPO3\CMS\Core\Tests\Acceptance\Support\Helper\AbstractTree\waitForNodes
‪waitForNodes()
Definition: AbstractTree.php:39
‪TYPO3\CMS\Core\Exception
Definition: Exception.php:21
‪TYPO3\CMS\Core\Tests\Acceptance\Support\Helper\AbstractTree\$tester
‪AcceptanceTester $tester
Definition: AbstractTree.php:34
‪TYPO3\CMS\Core\Tests\Acceptance\Support\Helper\AbstractTree\getPageTreeElement
‪RemoteWebElement getPageTreeElement()
Definition: AbstractTree.php:88
‪TYPO3\CMS\Core\Tests\Acceptance\Support\Helper\AbstractTree\openPath
‪openPath(array $path)
Definition: AbstractTree.php:55
‪TYPO3\CMS\Core\Tests\Acceptance\Support\Helper\AbstractTree\ensureTreeNodeIsOpen
‪RemoteWebElement ensureTreeNodeIsOpen(string $nodeText, RemoteWebElement $context)
Definition: AbstractTree.php:104
‪TYPO3\CMS\Core\Tests\Acceptance\Support\Helper\AbstractTree
Definition: AbstractTree.php:26
‪TYPO3\CMS\Core\Tests\Acceptance\Support\Helper
Definition: AbstractTree.php:18
‪TYPO3\CMS\Core\Tests\Acceptance\Support\Helper\AbstractTree\$treeItemSelector
‪static $treeItemSelector
Definition: AbstractTree.php:29
‪TYPO3\CMS\Core\Tests\Acceptance\Support\Helper\AbstractTree\$treeSelector
‪static $treeSelector
Definition: AbstractTree.php:28