aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Calviño Sánchez <danxuliu@gmail.com>2020-08-29 01:08:30 +0200
committerDaniel Calviño Sánchez <danxuliu@gmail.com>2020-08-31 09:42:25 +0200
commit6d191c22f0a5507e5ddc3f6c9e88b5ecd7937dc3 (patch)
treed84395ee2bd90b37ab78de38671eb7e5c9ee8bf2
parent89a04fcc818026140c6940a8e5d22aeb2d314716 (diff)
downloadnextcloud-server-6d191c22f0a5507e5ddc3f6c9e88b5ecd7937dc3.tar.gz
nextcloud-server-6d191c22f0a5507e5ddc3f6c9e88b5ecd7937dc3.zip
Fix clicks on actions menu of non opaque file rows in acceptance tests
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 <danxuliu@gmail.com>
-rw-r--r--tests/acceptance/features/bootstrap/FileListContext.php43
1 files changed, 36 insertions, 7 deletions
diff --git a/tests/acceptance/features/bootstrap/FileListContext.php b/tests/acceptance/features/bootstrap/FileListContext.php
index cdf2e6acc6e..2ac09482176 100644
--- a/tests/acceptance/features/bootstrap/FileListContext.php
+++ b/tests/acceptance/features/bootstrap/FileListContext.php
@@ -387,7 +387,7 @@ class FileListContext implements Context, ActorAwareInterface {
* @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 @@ class FileListContext implements Context, ActorAwareInterface {
* @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 @@ class FileListContext implements Context, ActorAwareInterface {
* @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 @@ class FileListContext implements Context, ActorAwareInterface {
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 @@ class FileListContext implements Context, ActorAwareInterface {
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 @@ class FileListContext implements Context, ActorAwareInterface {
* @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 @@ class FileListContext implements Context, ActorAwareInterface {
* @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();
}
@@ -553,4 +553,33 @@ class FileListContext implements Context, ActorAwareInterface {
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();
+ }
}