From 034b7bd4a903e5c3fca9851ea4f67af64ed474d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Calvi=C3=B1o=20S=C3=A1nchez?= Date: Sat, 29 Aug 2020 01:08:30 +0200 Subject: [PATCH] Fix clicks on actions menu of non opaque file rows in acceptance tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a row is added to the file list the opacity of the file row is animated from transparent to fully opaque. As the file actions menu is a descendant of the row but overflows it when the row is not fully opaque clicks on the menu entries "fall-through" and are received instead by the rows behind. The opacity animation is a CSS animation, and it is not possible to know if a row is appearing or not except from its opacity (the row will have the "appear" CSS class even after the animation ended). Therefore it should be waited until the row of the file is fully opaque before using the menu. Signed-off-by: Daniel Calviño Sánchez --- .../features/bootstrap/FileListContext.php | 44 ++++++++++++++++--- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/tests/acceptance/features/bootstrap/FileListContext.php b/tests/acceptance/features/bootstrap/FileListContext.php index 72c5c012dd138..0b0c80bc272a5 100644 --- a/tests/acceptance/features/bootstrap/FileListContext.php +++ b/tests/acceptance/features/bootstrap/FileListContext.php @@ -387,7 +387,7 @@ public function iStartTheMoveOrCopyOperationForTheSelectedFiles() { * @Given I open the details view for :fileName */ public function iOpenTheDetailsViewFor($fileName) { - $this->actor->find(self::fileActionsMenuButtonForFile($this->fileListAncestor, $fileName), 10)->click(); + $this->openFileActionsMenuForFile($fileName); $this->actor->find(self::detailsMenuItem(), 2)->click(); } @@ -396,7 +396,7 @@ public function iOpenTheDetailsViewFor($fileName) { * @Given I rename :fileName1 to :fileName2 */ public function iRenameTo($fileName1, $fileName2) { - $this->actor->find(self::fileActionsMenuButtonForFile($this->fileListAncestor, $fileName1), 10)->click(); + $this->openFileActionsMenuForFile($fileName1); $this->actor->find(self::renameMenuItem(), 2)->click(); @@ -416,7 +416,7 @@ public function iRenameTo($fileName1, $fileName2) { * @Given I start the move or copy operation for :fileName */ public function iStartTheMoveOrCopyOperationFor($fileName) { - $this->actor->find(self::fileActionsMenuButtonForFile($this->fileListAncestor, $fileName), 10)->click(); + $this->openFileActionsMenuForFile($fileName); $this->actor->find(self::moveOrCopyMenuItem(), 2)->click(); } @@ -427,7 +427,7 @@ public function iStartTheMoveOrCopyOperationFor($fileName) { public function iMarkAsFavorite($fileName) { $this->iSeeThatIsNotMarkedAsFavorite($fileName); - $this->actor->find(self::fileActionsMenuButtonForFile($this->fileListAncestor, $fileName), 10)->click(); + $this->openFileActionsMenuForFile($fileName); $this->actor->find(self::addToFavoritesMenuItem(), 2)->click(); } @@ -438,7 +438,7 @@ public function iMarkAsFavorite($fileName) { public function iUnmarkAsFavorite($fileName) { $this->iSeeThatIsMarkedAsFavorite($fileName); - $this->actor->find(self::fileActionsMenuButtonForFile($this->fileListAncestor, $fileName), 10)->click(); + $this->openFileActionsMenuForFile($fileName); $this->actor->find(self::removeFromFavoritesMenuItem(), 2)->click(); } @@ -447,7 +447,7 @@ public function iUnmarkAsFavorite($fileName) { * @When I view :fileName in folder */ public function iViewInFolder($fileName) { - $this->actor->find(self::fileActionsMenuButtonForFile($this->fileListAncestor, $fileName), 10)->click(); + $this->openFileActionsMenuForFile($fileName); $this->actor->find(self::viewFileInFolderMenuItem(), 2)->click(); } @@ -456,7 +456,7 @@ public function iViewInFolder($fileName) { * @When I delete :fileName */ public function iDelete($fileName) { - $this->actor->find(self::fileActionsMenuButtonForFile($this->fileListAncestor, $fileName), 10)->click(); + $this->openFileActionsMenuForFile($fileName); $this->actor->find(self::deleteMenuItem(), 2)->click(); } @@ -552,4 +552,34 @@ public function iSeeThatIsNotMarkedAsFavorite($fileName) { public function iSeeThatHasUnreadComments($fileName) { PHPUnit_Framework_Assert::assertTrue($this->actor->find(self::commentActionForFile($this->fileListAncestor, $fileName), 10)->isVisible()); } + + private function waitForRowForFileToBeFullyOpaque($fileName) { + $actor = $this->actor; + $fileRowXpathExpression = $this->actor->find(self::rowForFile($this->fileListAncestor, $fileName), 10)->getWrappedElement()->getXpath(); + + $fileRowIsFullyOpaqueCallback = function () use ($actor, $fileRowXpathExpression) { + $opacity = $actor->getSession()->evaluateScript("return window.getComputedStyle(document.evaluate(\"" . $fileRowXpathExpression . "\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue).opacity;"); + if ($opacity === "1") { + return true; + } + + return false; + }; + + if (!Utils::waitFor($fileRowIsFullyOpaqueCallback, $timeout = 2 * $this->actor->getFindTimeoutMultiplier(), $timeoutStep = 1)) { + PHPUnit_Framework_Assert::fail("The row for file $fileName in file list is not fully opaque after $timeout seconds"); + } + } + + private function openFileActionsMenuForFile($fileName) { + // When a row is added to the file list the opacity of the file row is + // animated from transparent to fully opaque. As the file actions menu + // is a descendant of the row but overflows it when the row is not fully + // opaque clicks on the menu entries "fall-through" and are received + // instead by the rows behind. Therefore it should be waited until the + // row of the file is fully opaque before using the menu. + $this->waitForRowForFileToBeFullyOpaque($fileName); + + $this->actor->find(self::fileActionsMenuButtonForFile($this->fileListAncestor, $fileName), 10)->click(); + } }