From 6a7df2f702cbe27f25480f1aa2af001ad645c38c Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Mon, 7 Apr 2014 18:08:56 +1200 Subject: [PATCH] More resistant login form detection Had some issues with multiple login forms on the same page, e.g. for social login, or with duplicated hidden login forms in the header. --- .../BehatExtension/Context/LoginContext.php | 51 +++++++++++-------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/src/SilverStripe/BehatExtension/Context/LoginContext.php b/src/SilverStripe/BehatExtension/Context/LoginContext.php index d80a11b..e2bd9b8 100644 --- a/src/SilverStripe/BehatExtension/Context/LoginContext.php +++ b/src/SilverStripe/BehatExtension/Context/LoginContext.php @@ -126,37 +126,46 @@ class LoginContext extends BehatContext $page = $this->getSession()->getPage(); $forms = $page->findAll('css', 'form[action="Security/LoginForm"]'); assertNotNull($forms, 'Login form not found'); - + + // Try to find visible forms on current page + // Allow multiple login forms (e.g. social login) by filering for "Email" field + $visibleForm = null; + foreach($forms as $form) { + if($form->isVisible() && $form->find('css', '[name=Email]')) { + $visibleForm = $form; + } + } + // If no login form, go to /security/login page - if(count($forms) <= 0 ) { + if(!$visibleForm) { $c = $this->getMainContext(); $loginUrl = $c->joinUrlParts($c->getBaseUrl(), $c->getLoginUrl()); $this->getSession()->visit($loginUrl); $page = $this->getSession()->getPage(); $forms = $page->findAll('css', 'form[action="Security/LoginForm"]'); } - - $foundForm = false; + + // Try to find visible forms again on login page. + $visibleForm = null; foreach($forms as $form) { - if(!$form->isVisible()) continue; - - $emailField = $form->find('css', '[name=Email]'); - $passwordField = $form->find('css', '[name=Password]'); - $submitButton = $form->find('css', '[type=submit]'); - - assertNotNull($emailField, 'Email field on login form not found'); - assertNotNull($passwordField, 'Password field on login form not found'); - assertNotNull($submitButton, 'Submit button on login form not found'); - - $emailField->setValue($email); - $passwordField->setValue($password); - $submitButton->press(); - - $foundForm = true; - break; + if($form->isVisible() && $form->find('css', '[name=Email]')) { + $visibleForm = $form; + } } + + assertNotNull($visibleForm, 'Could not find login form'); - assertTrue($foundForm, 'Found login form'); + $emailField = $visibleForm->find('css', '[name=Email]'); + $passwordField = $visibleForm->find('css', '[name=Password]'); + $submitButton = $visibleForm->find('css', '[type=submit]'); + + assertNotNull($emailField, 'Email field on login form not found'); + assertNotNull($passwordField, 'Password field on login form not found'); + assertNotNull($submitButton, 'Submit button on login form not found'); + + $emailField->setValue($email); + $passwordField->setValue($password); + $submitButton->press(); } /**