Skip to content

Commit 8905c10

Browse files
authored
Merge pull request #734 from magento/MQE-2162
MQE-2162: Chrome remains running after MFTF suite finishes
2 parents e36fc50 + 23d8693 commit 8905c10

File tree

7 files changed

+156
-58
lines changed

7 files changed

+156
-58
lines changed

dev/tests/verification/Resources/functionalSuiteHooks.txt

+49-22
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
namespace Group;
44

5+
use Facebook\WebDriver\Remote\RemoteWebDriver;
56
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler;
67
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore;
8+
use Magento\FunctionalTestingFramework\Module\MagentoWebDriver;
79

810
/**
911
* Group class is Codeception Extension which is allowed to handle to all internal events.
@@ -41,17 +43,15 @@ class functionalSuiteHooks extends \Codeception\GroupObject
4143
if ($this->currentTestRun == 1) {
4244
print sprintf(self::$HOOK_EXECUTION_INIT, "before");
4345

46+
/** @var MagentoWebDriver $webDriver */
47+
$webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver');
48+
4449
try {
45-
$webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver');
46-
47-
// close any open sessions
4850
if ($webDriver->webDriver != null) {
49-
$webDriver->webDriver->close();
50-
$webDriver->webDriver = null;
51+
$webDriver->_restart();
52+
} else {
53+
$webDriver->_initializeSession();
5154
}
52-
53-
// initialize the webdriver session
54-
$webDriver->_initializeSession();
5555
$webDriver->amOnPage("some.url"); // stepKey: before
5656
$createFields['someKey'] = "dataHere";
5757
PersistedObjectHandler::getInstance()->createEntity(
@@ -64,16 +64,15 @@ class functionalSuiteHooks extends \Codeception\GroupObject
6464
print("Entering Action Group [AC] actionGroupWithTwoArguments");
6565
$webDriver->see("John", msq("uniqueData") . "John"); // stepKey: seeFirstNameAC
6666
print("Exiting Action Group [AC] actionGroupWithTwoArguments");
67-
68-
// reset configuration and close session
69-
$this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver')->_resetConfig();
70-
$webDriver->webDriver->close();
71-
$webDriver->webDriver = null;
72-
7367
} catch (\Exception $exception) {
7468
$this->preconditionFailure = $exception->getMessage();
7569
}
7670

71+
// reset configuration and close session
72+
$webDriver->_resetConfig();
73+
$webDriver->webDriver->close();
74+
$webDriver->webDriver = null;
75+
7776
print sprintf(self::$HOOK_EXECUTION_END, "before");
7877
}
7978
}
@@ -89,6 +88,9 @@ class functionalSuiteHooks extends \Codeception\GroupObject
8988
if ($this->currentTestRun == $this->testCount) {
9089
print sprintf(self::$HOOK_EXECUTION_INIT, "after");
9190

91+
/** @var MagentoWebDriver $webDriver */
92+
$webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver');
93+
9294
try {
9395
// Find out if Test in Suite failed, will cause potential failures in suite after
9496
$cest = $e->getTest();
@@ -111,16 +113,11 @@ class functionalSuiteHooks extends \Codeception\GroupObject
111113
}
112114
}
113115
}
114-
$webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver');
115-
116-
// close any open sessions
117116
if ($webDriver->webDriver != null) {
118-
$webDriver->webDriver->close();
119-
$webDriver->webDriver = null;
117+
$webDriver->_restart();
118+
} else {
119+
$webDriver->_initializeSession();
120120
}
121-
122-
// initialize the webdriver session
123-
$webDriver->_initializeSession();
124121
$webDriver->amOnPage("some.url"); // stepKey: after
125122
$webDriver->deleteEntityByUrl("deleteThis"); // stepKey: delete
126123
print("Entering Action Group [AC] actionGroupWithTwoArguments");
@@ -131,7 +128,37 @@ class functionalSuiteHooks extends \Codeception\GroupObject
131128
}
132129

133130
PersistedObjectHandler::getInstance()->clearSuiteObjects();
131+
132+
$this->closeSession($webDriver);
133+
134134
print sprintf(self::$HOOK_EXECUTION_END, "after");
135135
}
136136
}
137+
138+
/**
139+
* Close session method closes current session.
140+
* If config 'close_all_sessions' is set to 'true' all sessions will be closed.
141+
*
142+
* @param MagentoWebDriver $webDriver
143+
* return void
144+
*/
145+
private function closeSession(MagentoWebDriver $webDriver): void
146+
{
147+
$webDriverConfig = $webDriver->_getConfig();
148+
$webDriver->_closeSession();
149+
if (isset($webDriverConfig['close_all_sessions']) && $webDriverConfig['close_all_sessions'] === "true") {
150+
$wdHost = sprintf(
151+
'%s://%s:%s%s',
152+
$webDriverConfig['protocol'],
153+
$webDriverConfig['host'],
154+
$webDriverConfig['port'],
155+
$webDriverConfig['path']
156+
);
157+
$availableSessions = RemoteWebDriver::getAllSessions($wdHost);
158+
foreach ($availableSessions as $session) {
159+
$remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost);
160+
$remoteWebDriver->quit();
161+
}
162+
}
163+
}
137164
}

dev/tests/verification/Resources/functionalSuiteWithComments.txt

+49-22
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
namespace Group;
44

5+
use Facebook\WebDriver\Remote\RemoteWebDriver;
56
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler;
67
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore;
8+
use Magento\FunctionalTestingFramework\Module\MagentoWebDriver;
79

810
/**
911
* Group class is Codeception Extension which is allowed to handle to all internal events.
@@ -41,17 +43,15 @@ class functionalSuiteWithComments extends \Codeception\GroupObject
4143
if ($this->currentTestRun == 1) {
4244
print sprintf(self::$HOOK_EXECUTION_INIT, "before");
4345

46+
/** @var MagentoWebDriver $webDriver */
47+
$webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver');
48+
4449
try {
45-
$webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver');
46-
47-
// close any open sessions
4850
if ($webDriver->webDriver != null) {
49-
$webDriver->webDriver->close();
50-
$webDriver->webDriver = null;
51+
$webDriver->_restart();
52+
} else {
53+
$webDriver->_initializeSession();
5154
}
52-
53-
// initialize the webdriver session
54-
$webDriver->_initializeSession();
5555
print("Comment in Before");
5656
$webDriver->amOnPage("some.url"); // stepKey: before
5757
$createFields['someKey'] = "dataHere";
@@ -66,16 +66,15 @@ class functionalSuiteWithComments extends \Codeception\GroupObject
6666
print("Entering Action Group [AC] actionGroupWithTwoArguments");
6767
$webDriver->see("John", msq("uniqueData") . "John"); // stepKey: seeFirstNameAC
6868
print("Exiting Action Group [AC] actionGroupWithTwoArguments");
69-
70-
// reset configuration and close session
71-
$this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver')->_resetConfig();
72-
$webDriver->webDriver->close();
73-
$webDriver->webDriver = null;
74-
7569
} catch (\Exception $exception) {
7670
$this->preconditionFailure = $exception->getMessage();
7771
}
7872

73+
// reset configuration and close session
74+
$webDriver->_resetConfig();
75+
$webDriver->webDriver->close();
76+
$webDriver->webDriver = null;
77+
7978
print sprintf(self::$HOOK_EXECUTION_END, "before");
8079
}
8180
}
@@ -91,6 +90,9 @@ class functionalSuiteWithComments extends \Codeception\GroupObject
9190
if ($this->currentTestRun == $this->testCount) {
9291
print sprintf(self::$HOOK_EXECUTION_INIT, "after");
9392

93+
/** @var MagentoWebDriver $webDriver */
94+
$webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver');
95+
9496
try {
9597
// Find out if Test in Suite failed, will cause potential failures in suite after
9698
$cest = $e->getTest();
@@ -113,23 +115,48 @@ class functionalSuiteWithComments extends \Codeception\GroupObject
113115
}
114116
}
115117
}
116-
$webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver');
117-
118-
// close any open sessions
119118
if ($webDriver->webDriver != null) {
120-
$webDriver->webDriver->close();
121-
$webDriver->webDriver = null;
119+
$webDriver->_restart();
120+
} else {
121+
$webDriver->_initializeSession();
122122
}
123-
124-
// initialize the webdriver session
125-
$webDriver->_initializeSession();
126123
print("afterBlock");
127124
} catch (\Exception $exception) {
128125
print $exception->getMessage();
129126
}
130127

131128
PersistedObjectHandler::getInstance()->clearSuiteObjects();
129+
130+
$this->closeSession($webDriver);
131+
132132
print sprintf(self::$HOOK_EXECUTION_END, "after");
133133
}
134134
}
135+
136+
/**
137+
* Close session method closes current session.
138+
* If config 'close_all_sessions' is set to 'true' all sessions will be closed.
139+
*
140+
* @param MagentoWebDriver $webDriver
141+
* return void
142+
*/
143+
private function closeSession(MagentoWebDriver $webDriver): void
144+
{
145+
$webDriverConfig = $webDriver->_getConfig();
146+
$webDriver->_closeSession();
147+
if (isset($webDriverConfig['close_all_sessions']) && $webDriverConfig['close_all_sessions'] === "true") {
148+
$wdHost = sprintf(
149+
'%s://%s:%s%s',
150+
$webDriverConfig['protocol'],
151+
$webDriverConfig['host'],
152+
$webDriverConfig['port'],
153+
$webDriverConfig['path']
154+
);
155+
$availableSessions = RemoteWebDriver::getAllSessions($wdHost);
156+
foreach ($availableSessions as $session) {
157+
$remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost);
158+
$remoteWebDriver->quit();
159+
}
160+
}
161+
}
135162
}

docs/configuration.md

+10
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,16 @@ Enables addition of browser logs to Allure steps
321321
ENABLE_BROWSER_LOG=true
322322
```
323323

324+
### SELENIUM_CLOSE_ALL_SESSIONS
325+
326+
Forces MFTF to close all Selenium sessions after running a suite.
327+
328+
Use this if you're having issues with sessions hanging in an MFTF suite.
329+
330+
```conf
331+
SELENIUM_CLOSE_ALL_SESSIONS=true
332+
```
333+
324334
### BROWSER_LOG_BLACKLIST
325335

326336
Blacklists types of browser log entries from appearing in Allure steps.

etc/config/.env.example

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ MAGENTO_ADMIN_PASSWORD=123123q
2121
#SELENIUM_PORT=4444
2222
#SELENIUM_PROTOCOL=http
2323
#SELENIUM_PATH=/wd/hub
24+
SELENIUM_CLOSE_ALL_SESSIONS=true
2425

2526
#*** Browser for running tests, default chrome. Uncomment and change if you want to run tests on another browser (ex. firefox).
2627
BROWSER=chrome

etc/config/functional.suite.dist.yml

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ modules:
3434
port: "%SELENIUM_PORT%"
3535
protocol: "%SELENIUM_PROTOCOL%"
3636
path: "%SELENIUM_PATH%"
37+
close_all_sessions: "%SELENIUM_CLOSE_ALL_SESSIONS%"
3738
capabilities:
3839
unhandledPromptBehavior: "ignore"
3940
chromeOptions:

src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache

+43-6
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
namespace Group;
44

5+
use Facebook\WebDriver\Remote\RemoteWebDriver;
56
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler;
67
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore;
8+
use Magento\FunctionalTestingFramework\Module\MagentoWebDriver;
79

810
/**
911
* Group class is Codeception Extension which is allowed to handle to all internal events.
@@ -55,18 +57,20 @@ class {{suiteName}} extends \Codeception\GroupObject
5557
if ($this->currentTestRun == 1) {
5658
print sprintf(self::$HOOK_EXECUTION_INIT, "before");
5759
60+
/** @var MagentoWebDriver $webDriver */
61+
$webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver');
62+
5863
try {
5964
{{> testActions}}
60-
61-
// reset configuration and close session
62-
$this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver')->_resetConfig();
63-
$webDriver->webDriver->close();
64-
$webDriver->webDriver = null;
65-
6665
} catch (\Exception $exception) {
6766
$this->preconditionFailure = $exception->getMessage();
6867
}
6968

69+
// reset configuration and close session
70+
$webDriver->_resetConfig();
71+
$webDriver->webDriver->close();
72+
$webDriver->webDriver = null;
73+
7074
print sprintf(self::$HOOK_EXECUTION_END, "before");
7175
}
7276
}
@@ -84,6 +88,9 @@ class {{suiteName}} extends \Codeception\GroupObject
8488
if ($this->currentTestRun == $this->testCount) {
8589
print sprintf(self::$HOOK_EXECUTION_INIT, "after");
8690
91+
/** @var MagentoWebDriver $webDriver */
92+
$webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver');
93+
8794
try {
8895
// Find out if Test in Suite failed, will cause potential failures in suite after
8996
$cest = $e->getTest();
@@ -112,8 +119,38 @@ class {{suiteName}} extends \Codeception\GroupObject
112119
}
113120

114121
PersistedObjectHandler::getInstance()->clearSuiteObjects();
122+
123+
$this->closeSession($webDriver);
124+
115125
print sprintf(self::$HOOK_EXECUTION_END, "after");
116126
}
117127
}
118128
{{/after}}
129+
130+
/**
131+
* Close session method closes current session.
132+
* If config 'close_all_sessions' is set to 'true' all sessions will be closed.
133+
*
134+
* @param MagentoWebDriver $webDriver
135+
* return void
136+
*/
137+
private function closeSession(MagentoWebDriver $webDriver): void
138+
{
139+
$webDriverConfig = $webDriver->_getConfig();
140+
$webDriver->_closeSession();
141+
if (isset($webDriverConfig['close_all_sessions']) && $webDriverConfig['close_all_sessions'] === "true") {
142+
$wdHost = sprintf(
143+
'%s://%s:%s%s',
144+
$webDriverConfig['protocol'],
145+
$webDriverConfig['host'],
146+
$webDriverConfig['port'],
147+
$webDriverConfig['path']
148+
);
149+
$availableSessions = RemoteWebDriver::getAllSessions($wdHost);
150+
foreach ($availableSessions as $session) {
151+
$remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost);
152+
$remoteWebDriver->quit();
153+
}
154+
}
155+
}
119156
}

src/Magento/FunctionalTestingFramework/Suite/views/partials/testActions.mustache

+3-8
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
{{#actions}}
22
{{#webDriverInit}}
3-
$webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver');
4-
5-
// close any open sessions
63
if ($webDriver->webDriver != null) {
7-
$webDriver->webDriver->close();
8-
$webDriver->webDriver = null;
4+
$webDriver->_restart();
5+
} else {
6+
$webDriver->_initializeSession();
97
}
10-
11-
// initialize the webdriver session
12-
$webDriver->_initializeSession();
138
{{/webDriverInit}}
149
{{#action}}
1510
{{{action}}}

0 commit comments

Comments
 (0)