@@ -387,7 +387,7 @@ public function iStartTheMoveOrCopyOperationForTheSelectedFiles() {
387387 * @Given I open the details view for :fileName
388388 */
389389 public function iOpenTheDetailsViewFor ($ fileName ) {
390- $ this ->actor -> find ( self :: fileActionsMenuButtonForFile ( $ this -> fileListAncestor , $ fileName), 10 )-> click ( );
390+ $ this ->openFileActionsMenuForFile ( $ fileName );
391391
392392 $ this ->actor ->find (self ::detailsMenuItem (), 2 )->click ();
393393 }
@@ -396,7 +396,7 @@ public function iOpenTheDetailsViewFor($fileName) {
396396 * @Given I rename :fileName1 to :fileName2
397397 */
398398 public function iRenameTo ($ fileName1 , $ fileName2 ) {
399- $ this ->actor -> find ( self :: fileActionsMenuButtonForFile ( $ this -> fileListAncestor , $ fileName1), 10 )-> click ( );
399+ $ this ->openFileActionsMenuForFile ( $ fileName1 );
400400
401401 $ this ->actor ->find (self ::renameMenuItem (), 2 )->click ();
402402
@@ -416,7 +416,7 @@ public function iRenameTo($fileName1, $fileName2) {
416416 * @Given I start the move or copy operation for :fileName
417417 */
418418 public function iStartTheMoveOrCopyOperationFor ($ fileName ) {
419- $ this ->actor -> find ( self :: fileActionsMenuButtonForFile ( $ this -> fileListAncestor , $ fileName), 10 )-> click ( );
419+ $ this ->openFileActionsMenuForFile ( $ fileName );
420420
421421 $ this ->actor ->find (self ::moveOrCopyMenuItem (), 2 )->click ();
422422 }
@@ -427,7 +427,7 @@ public function iStartTheMoveOrCopyOperationFor($fileName) {
427427 public function iMarkAsFavorite ($ fileName ) {
428428 $ this ->iSeeThatIsNotMarkedAsFavorite ($ fileName );
429429
430- $ this ->actor -> find ( self :: fileActionsMenuButtonForFile ( $ this -> fileListAncestor , $ fileName), 10 )-> click ( );
430+ $ this ->openFileActionsMenuForFile ( $ fileName );
431431
432432 $ this ->actor ->find (self ::addToFavoritesMenuItem (), 2 )->click ();
433433 }
@@ -438,7 +438,7 @@ public function iMarkAsFavorite($fileName) {
438438 public function iUnmarkAsFavorite ($ fileName ) {
439439 $ this ->iSeeThatIsMarkedAsFavorite ($ fileName );
440440
441- $ this ->actor -> find ( self :: fileActionsMenuButtonForFile ( $ this -> fileListAncestor , $ fileName), 10 )-> click ( );
441+ $ this ->openFileActionsMenuForFile ( $ fileName );
442442
443443 $ this ->actor ->find (self ::removeFromFavoritesMenuItem (), 2 )->click ();
444444 }
@@ -447,7 +447,7 @@ public function iUnmarkAsFavorite($fileName) {
447447 * @When I view :fileName in folder
448448 */
449449 public function iViewInFolder ($ fileName ) {
450- $ this ->actor -> find ( self :: fileActionsMenuButtonForFile ( $ this -> fileListAncestor , $ fileName), 10 )-> click ( );
450+ $ this ->openFileActionsMenuForFile ( $ fileName );
451451
452452 $ this ->actor ->find (self ::viewFileInFolderMenuItem (), 2 )->click ();
453453 }
@@ -456,7 +456,7 @@ public function iViewInFolder($fileName) {
456456 * @When I delete :fileName
457457 */
458458 public function iDelete ($ fileName ) {
459- $ this ->actor -> find ( self :: fileActionsMenuButtonForFile ( $ this -> fileListAncestor , $ fileName), 10 )-> click ( );
459+ $ this ->openFileActionsMenuForFile ( $ fileName );
460460
461461 $ this ->actor ->find (self ::deleteMenuItem (), 2 )->click ();
462462 }
@@ -552,4 +552,34 @@ public function iSeeThatIsNotMarkedAsFavorite($fileName) {
552552 public function iSeeThatHasUnreadComments ($ fileName ) {
553553 PHPUnit_Framework_Assert::assertTrue ($ this ->actor ->find (self ::commentActionForFile ($ this ->fileListAncestor , $ fileName ), 10 )->isVisible ());
554554 }
555+
556+ private function waitForRowForFileToBeFullyOpaque ($ fileName ) {
557+ $ actor = $ this ->actor ;
558+ $ fileRowXpathExpression = $ this ->actor ->find (self ::rowForFile ($ this ->fileListAncestor , $ fileName ), 10 )->getWrappedElement ()->getXpath ();
559+
560+ $ fileRowIsFullyOpaqueCallback = function () use ($ actor , $ fileRowXpathExpression ) {
561+ $ opacity = $ actor ->getSession ()->evaluateScript ("return window.getComputedStyle(document.evaluate( \"" . $ fileRowXpathExpression . "\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue).opacity; " );
562+ if ($ opacity === "1 " ) {
563+ return true ;
564+ }
565+
566+ return false ;
567+ };
568+
569+ if (!Utils::waitFor ($ fileRowIsFullyOpaqueCallback , $ timeout = 2 * $ this ->actor ->getFindTimeoutMultiplier (), $ timeoutStep = 1 )) {
570+ PHPUnit_Framework_Assert::fail ("The row for file $ fileName in file list is not fully opaque after $ timeout seconds " );
571+ }
572+ }
573+
574+ private function openFileActionsMenuForFile ($ fileName ) {
575+ // When a row is added to the file list the opacity of the file row is
576+ // animated from transparent to fully opaque. As the file actions menu
577+ // is a descendant of the row but overflows it when the row is not fully
578+ // opaque clicks on the menu entries "fall-through" and are received
579+ // instead by the rows behind. Therefore it should be waited until the
580+ // row of the file is fully opaque before using the menu.
581+ $ this ->waitForRowForFileToBeFullyOpaque ($ fileName );
582+
583+ $ this ->actor ->find (self ::fileActionsMenuButtonForFile ($ this ->fileListAncestor , $ fileName ), 10 )->click ();
584+ }
555585}
0 commit comments