. * */ use Behat\Behat\Context\Context; class NotificationsContext implements Context, ActorAwareInterface { use ActorAware; /** * @return Locator */ public static function notificationsButton() { return Locator::forThe()->css("#header .notifications .notifications-button")-> describedAs("Notifications button in the header"); } /** * @return Locator */ public static function notificationsContainer() { return Locator::forThe()->css("#header .notifications .notification-container")-> describedAs("Notifications container"); } /** * @return Locator */ public static function incomingShareNotificationForFile($fileName) { return Locator::forThe()->xpath("//div[contains(concat(' ', normalize-space(@class), ' '), ' notification ') and //div[starts-with(normalize-space(), 'You received $fileName as a share by')]]")-> descendantOf(self::notificationsContainer())-> describedAs("Notification of incoming share for file $fileName"); } /** * @return Locator */ public static function actionsInIncomingShareNotificationForFile($fileName) { return Locator::forThe()->css(".notification-actions")-> descendantOf(self::incomingShareNotificationForFile($fileName))-> describedAs("Actions in notification of incoming share for file $fileName"); } /** * @return Locator */ public static function actionInIncomingShareNotificationForFile($fileName, $action) { return Locator::forThe()->xpath("//button[normalize-space() = '$action']")-> descendantOf(self::actionsInIncomingShareNotificationForFile($fileName))-> describedAs("$action button in notification of incoming share for file $fileName"); } /** * @return Locator */ public static function acceptButtonInIncomingShareNotificationForFile($fileName) { return self::actionInIncomingShareNotificationForFile($fileName, 'Accept'); } /** * @Given I accept the share for :fileName in the notifications */ public function iAcceptTheShareForInTheNotifications($fileName) { $this->actor->find(self::notificationsButton(), 10)->click(); // Notifications are refreshed every 30 seconds, so wait a bit longer. // As the waiting is long enough already the find timeout multiplier is // capped at 2 when finding notifications. $findTimeoutMultiplier = $this->actor->getFindTimeoutMultiplier(); $this->actor->setFindTimeoutMultiplier(min(2, $findTimeoutMultiplier)); $this->actor->find(self::acceptButtonInIncomingShareNotificationForFile($fileName), 35)->click(); $this->actor->setFindTimeoutMultiplier($findTimeoutMultiplier); // Hide the notifications again $this->actor->find(self::notificationsButton(), 10)->click(); } }