Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
256 changes: 211 additions & 45 deletions src/Selenium2Library/keywords/browsermanagement.py

Large diffs are not rendered by default.

11 changes: 10 additions & 1 deletion src/Selenium2Library/utils/browsercache.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from robot.utils import ConnectionCache
from robot.api.logger import debug


class BrowserCache(ConnectionCache):
Expand All @@ -17,7 +18,7 @@ def get_open_browsers(self):
if browser not in self._closed:
open_browsers.append(browser)
return open_browsers

def close(self):
if self.current:
browser = self.current
Expand All @@ -31,3 +32,11 @@ def close_all(self):
browser.quit()
self.empty_cache()
return self.current

def register(self, connection, alias=None):
for browser in self._connections:
if browser.session_id == connection.session_id: # and connection.command_executor._url == browser.command_executor._url:
debug('Browser with session %s already registered. Marking previous one as obsolete'
% connection.session_id)
self._closed.add(browser)
return super(BrowserCache, self).register(connection, alias)
58 changes: 58 additions & 0 deletions test/acceptance/create_webdriver.robot
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,64 @@ Create Webdriver With Bad Keyword Argument Dictionary
Run Keyword And Expect Error kwargs must be a dictionary.
... Create Webdriver Firefox kwargs={'spam': 'eggs'}

Create Reusable Webdriver with alias
[Documentation] Reconnect to an existing browser session
[Setup] Set Driver Variables
Create Webdriver ${DRIVER_NAME} alias=dummy kwargs=${KWARGS}
${file}= Save Webdriver
Restore Webdriver alias=dummy
${file}= Save Webdriver
Restore Webdriver alias=dummy delete_file=${False}
Restore Webdriver alias=dummy
${file}= Save Webdriver dummy.tmp
Restore Webdriver alias=dummy file=${file}
${file}= Save Webdriver ${CURDIR}/dummy.tmp
Restore Webdriver alias=dummy file=${file}
${file}= Save Webdriver
Restore Webdriver alias=dummy2 file=session_dummy.tmp
${sid} ${url} ${pid} = Save Webdriver ${None}
Restore Webdriver alias=dummy session_id=${sid} session_url=${url} session_pid=${pid}
Go To ${FRONT PAGE}
Page Should Contain needle
[Teardown] Close Browser

Create Reusable Webdriver without alias
[Documentation] Reconnect to an existing browser session
[Setup] Set Driver Variables
${i1} = Create Webdriver ${DRIVER_NAME} kwargs=${KWARGS}
${file}= Save Webdriver
${i2} = Restore Webdriver file=${file}
log to console \n${i1}-${i2}
${file}= Save Webdriver
Restore Webdriver file=${file} delete_file=${False}
Restore Webdriver file=${file} delete_file=${False}
Restore Webdriver alias=dummy file=${file}
${file}= Save Webdriver dummy.tmp
Restore Webdriver file=${file}
${file}= Save Webdriver ${CURDIR}/dummy.tmp
Restore Webdriver file=${file}
${sid} ${url} ${pid} = Save Webdriver ${None}
Restore Webdriver session_id=${sid} session_url=${url} session_pid=${pid}
Go To ${FRONT PAGE}
Page Should Contain needle
[Teardown] Close Browser

Create Reusable Webdriver with Invalid Arguments
[Documentation] Invalid arguments & run-time errors
run keyword and expect error *both alias and file* Restore Webdriver
run keyword and expect error *IOError*No such file* Restore Webdriver alias=foo
run keyword and expect error *IOError*No such file* Restore Webdriver file=foo.tmp

Create Reusable Webdriver with runtime errors
[Documentation] run-time errors
[Setup] Set Driver Variables
run keyword and expect error *No browser is open* Save Webdriver
run keyword and expect error *URLError*refused* Restore Webdriver session_id=foo session_url=http://127.0.0.1:52470/foo
Create Webdriver ${DRIVER_NAME} kwargs=${KWARGS}
${sid} ${url} ${pid} = Save Webdriver ${None}
run keyword and expect error ** Restore Webdriver session_id=bogus session_url=${url}
[Teardown] Close Browser

*** Keywords ***
Set Driver Variables
[Documentation] Selects proper driver
Expand Down
2 changes: 1 addition & 1 deletion test/resources/testserver/testserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,4 @@ def start_server(path, port=7000):
path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
start_server(path)
else:
stop_server()
stop_server()
5 changes: 4 additions & 1 deletion test/run_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@
'--log', 'NONE',
'--loglevel', 'DEBUG',
'--pythonpath', os.pathsep.join([SRC_DIR, TEST_LIBS_DIR]),
#'--suite', 'Acceptance.Create_Webdriver',
#'-t', '*Functioning*',
#'-t', '*Reusable*',
'-b', 'debug.log',
]
REBOT_OPTIONS = [
'--outputdir', RESULTS_DIR,
Expand All @@ -81,7 +85,6 @@
'--noncritical', 'known issue {browser}',
]


def unit_tests():
print('Running unit tests')
failures = run_unit_tests()
Expand Down
28 changes: 27 additions & 1 deletion test/unit/keywords/test_browsermanagement.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from mockito import when, mock, verify, verifyNoMoreInteractions
from selenium import webdriver

from Selenium2Library.keywords.browsermanagement import BrowserManagementKeywords
from Selenium2Library.keywords.browsermanagement import BrowserManagementKeywords, _ReusableDriver


class BrowserManagementTests(unittest.TestCase):
Expand Down Expand Up @@ -120,6 +120,32 @@ def test_create_webdriver(self):
finally:
del webdriver.FakeWebDriver

def test_create_reusable_webdriver(self):
bm = _BrowserManagementWithLoggingStubs()
FakeCmdExecutor = mock()
FakeCmdExecutor._url = "http://127.0.0.1:9999/dummy"
FakeWebDriver = mock()
FakeWebDriver.command_executor = FakeCmdExecutor
FakeWebDriver.session_id = "dummy_id"
when(FakeWebDriver).__call__(some_arg=1).thenReturn(FakeWebDriver)
when(FakeWebDriver).__call__(some_arg=2).thenReturn(FakeWebDriver)
when(_ReusableDriver).execute("GetSessionData").thenReturn({'value': 'dummy'})
webdriver.FakeWebDriver = FakeWebDriver
try:
bm.create_webdriver('FakeWebDriver', 'fake', some_arg=1)
self.assertEquals(FakeWebDriver.session_id, bm._current_browser().session_id)
self.assertEquals(FakeCmdExecutor._url, bm._current_browser().command_executor._url)
(sid, url, pid) = bm.save_webdriver(None)
self.assertEquals(FakeWebDriver.session_id, sid)
self.assertEquals(FakeCmdExecutor._url, url)
old_index = bm._cache.current_index
new_index = bm.restore_webdriver(session_id=sid, session_url=url)
self.assertNotEqual(old_index, new_index)
self.assertEquals(sid, FakeWebDriver.session_id)
self.assertEquals(url, FakeCmdExecutor._url)
finally:
del webdriver.FakeWebDriver

def verify_browser(self , webdriver_type , browser_name, **kw):
#todo try lambda *x: was_called = true
bm = BrowserManagementKeywords()
Expand Down