. * */ use Behat\Behat\Context\Context; use PHPUnit\Framework\Assert; class ContactsMenuContext implements Context, ActorAwareInterface { use ActorAware; /** * @return Locator */ public static function contactsMenuButton() { return Locator::forThe()->xpath("//*[@id = 'header']//*[@id = 'contactsmenu']//*[@class = 'header-menu__trigger']")-> describedAs("Contacts menu button"); } /** * @return Locator */ public static function contactsMenu() { return Locator::forThe()->xpath("//*[@id = 'header']//*[@id = 'contactsmenu']//*[@id = 'contactsmenu-menu']")-> describedAs("Contacts menu"); } /** * @return Locator */ public static function contactsMenuSearchInput() { return Locator::forThe()->id("contactsmenu-search")-> descendantOf(self::contactsMenu())-> describedAs("Contacts menu search input"); } /** * @return Locator */ public static function noResultsMessage() { return Locator::forThe()->xpath("//*[@class = 'emptycontent' and normalize-space() = 'No contacts found']")-> descendantOf(self::contactsMenu())-> describedAs("No results message in Contacts menu"); } /** * @return Locator */ private static function menuItemFor($contactName) { return Locator::forThe()->xpath("//*[@class = 'full-name' and normalize-space() = '$contactName']")-> descendantOf(self::contactsMenu())-> describedAs($contactName . " contact in Contacts menu"); } /** * @When I open the Contacts menu */ public function iOpenTheContactsMenu() { $this->actor->find(self::contactsMenuButton(), 10)->click(); } /** * @When I search for the user :user */ public function iSearchForTheUser($user) { $this->actor->find(self::contactsMenuSearchInput(), 10)->setValue($user); } /** * @Then I see that the Contacts menu is shown */ public function iSeeThatTheContactsMenuIsShown() { Assert::assertTrue( $this->actor->find(self::contactsMenu(), 10)->isVisible()); } /** * @Then I see that the Contacts menu search input is shown */ public function iSeeThatTheContactsMenuSearchInputIsShown() { Assert::assertTrue( $this->actor->find(self::contactsMenuSearchInput(), 10)->isVisible()); } /** * @Then I see that the no results message in the Contacts menu is shown */ public function iSeeThatTheNoResultsMessageInTheContactsMenuIsShown() { Assert::assertTrue( $this->actor->find(self::noResultsMessage(), 10)->isVisible()); } /** * @Then I see that the contact :contactName in the Contacts menu is shown */ public function iSeeThatTheContactInTheContactsMenuIsShown($contactName) { Assert::assertTrue( $this->actor->find(self::menuItemFor($contactName), 10)->isVisible()); } /** * @Then I see that the contact :contactName in the Contacts menu is not shown */ public function iSeeThatTheContactInTheContactsMenuIsNotShown($contactName) { $this->iSeeThatThecontactsMenuIsShown(); try { Assert::assertFalse( $this->actor->find(self::menuItemFor($contactName))->isVisible()); } catch (NoSuchElementException $exception) { } } /** * @Then I see that the contact :contactName in the Contacts menu is eventually not shown */ public function iSeeThatTheContactInTheContactsMenuIsEventuallyNotShown($contactName) { $this->iSeeThatThecontactsMenuIsShown(); if (!WaitFor::elementToBeEventuallyNotShown( $this->actor, self::menuItemFor($contactName), $timeout = 10 * $this->actor->getFindTimeoutMultiplier())) { Assert::fail("The $contactName contact in Contacts menu is still shown after $timeout seconds"); } } }