From 45b588bdfc573b583c601b717168f4a22d5a3aeb Mon Sep 17 00:00:00 2001 From: frishber Date: Wed, 8 Oct 2014 15:29:16 -0400 Subject: [PATCH 01/25] Modified the run-on-failure mechanism so that only one screenshot is taken --- src/Selenium2Library/keywords/_runonfailure.py | 1 + src/Selenium2Library/keywords/keywordgroup.py | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) mode change 100644 => 100755 src/Selenium2Library/keywords/_runonfailure.py mode change 100644 => 100755 src/Selenium2Library/keywords/keywordgroup.py diff --git a/src/Selenium2Library/keywords/_runonfailure.py b/src/Selenium2Library/keywords/_runonfailure.py old mode 100644 new mode 100755 index 4e9057107..548d59e0f --- a/src/Selenium2Library/keywords/_runonfailure.py +++ b/src/Selenium2Library/keywords/_runonfailure.py @@ -8,6 +8,7 @@ class _RunOnFailureKeywords(KeywordGroup): def __init__(self): self._run_on_failure_keyword = None self._running_on_failure_routine = False + self._in_keyword = False # Public diff --git a/src/Selenium2Library/keywords/keywordgroup.py b/src/Selenium2Library/keywords/keywordgroup.py old mode 100644 new mode 100755 index ff4f319ca..b6e80dba5 --- a/src/Selenium2Library/keywords/keywordgroup.py +++ b/src/Selenium2Library/keywords/keywordgroup.py @@ -8,13 +8,20 @@ decorator = None # decorator module doesn't work with IronPython 2.6 def _run_on_failure_decorator(method, *args, **kwargs): + self = args[0] + in_keyword = self._in_keyword + self._in_keyword = True try: return method(*args, **kwargs) except Exception, err: - self = args[0] - if hasattr(self, '_run_on_failure'): + if in_keyword and hasattr(self, '_run_on_failure') and not self._has_run_on_failure: + self._has_run_on_failure = True self._run_on_failure() raise + finally: + if not in_keyword: + self._in_keyword = False + self._has_run_on_failure = False class KeywordGroupMetaClass(type): def __new__(cls, clsname, bases, dict): From 6007ac061d0ea3e2fbc3273e7b9167301110033a Mon Sep 17 00:00:00 2001 From: frishber Date: Thu, 9 Oct 2014 12:46:39 -0400 Subject: [PATCH 02/25] Added comments --- src/Selenium2Library/keywords/keywordgroup.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Selenium2Library/keywords/keywordgroup.py b/src/Selenium2Library/keywords/keywordgroup.py index b6e80dba5..b19043c11 100755 --- a/src/Selenium2Library/keywords/keywordgroup.py +++ b/src/Selenium2Library/keywords/keywordgroup.py @@ -8,18 +8,20 @@ decorator = None # decorator module doesn't work with IronPython 2.6 def _run_on_failure_decorator(method, *args, **kwargs): - self = args[0] - in_keyword = self._in_keyword - self._in_keyword = True +self = args[0] + in_keyword = self._in_keyword # If False, we are in the outermost keyword (or in `run_keyword`, if it's a dynamic library) + self._in_keyword = True # Set a flag on the instance so that as we call keywords inside this call and this gets run again, we know we're at least one level in. try: return method(*args, **kwargs) except Exception, err: - if in_keyword and hasattr(self, '_run_on_failure') and not self._has_run_on_failure: + if hasattr(self, '_run_on_failure') and not self._has_run_on_failure: + # If we're in an inner keyword, track the fact that we've already run on failure once self._has_run_on_failure = True self._run_on_failure() raise finally: if not in_keyword: + # If we are in the outer call, reset the flags. self._in_keyword = False self._has_run_on_failure = False From c0d0eab885f7c1c0b5d8253e2a9501e2973f7305 Mon Sep 17 00:00:00 2001 From: frishber Date: Thu, 9 Oct 2014 12:47:54 -0400 Subject: [PATCH 03/25] Fixed indentation --- src/Selenium2Library/keywords/keywordgroup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Selenium2Library/keywords/keywordgroup.py b/src/Selenium2Library/keywords/keywordgroup.py index b19043c11..79a44708b 100755 --- a/src/Selenium2Library/keywords/keywordgroup.py +++ b/src/Selenium2Library/keywords/keywordgroup.py @@ -8,7 +8,7 @@ decorator = None # decorator module doesn't work with IronPython 2.6 def _run_on_failure_decorator(method, *args, **kwargs): -self = args[0] + self = args[0] in_keyword = self._in_keyword # If False, we are in the outermost keyword (or in `run_keyword`, if it's a dynamic library) self._in_keyword = True # Set a flag on the instance so that as we call keywords inside this call and this gets run again, we know we're at least one level in. try: From 4c7e0745d6f2807a5eecead852ccb2b6319c116a Mon Sep 17 00:00:00 2001 From: frishber Date: Fri, 10 Oct 2014 14:48:21 -0400 Subject: [PATCH 04/25] Added test --- src/Selenium2Library/keywords/_runonfailure.py | 1 - src/Selenium2Library/keywords/keywordgroup.py | 8 ++++---- test/acceptance/keywords/run_on_failure.txt | 13 +++++++++++++ test/acceptance/resource.txt | 1 + test/env.py | 1 + test/resources/testlibs/CustomSeleniumKeywords.py | 9 +++++++++ test/run_tests.py | 2 +- 7 files changed, 29 insertions(+), 6 deletions(-) mode change 100644 => 100755 test/acceptance/keywords/run_on_failure.txt mode change 100644 => 100755 test/acceptance/resource.txt mode change 100644 => 100755 test/env.py create mode 100755 test/resources/testlibs/CustomSeleniumKeywords.py diff --git a/src/Selenium2Library/keywords/_runonfailure.py b/src/Selenium2Library/keywords/_runonfailure.py index 548d59e0f..4e9057107 100755 --- a/src/Selenium2Library/keywords/_runonfailure.py +++ b/src/Selenium2Library/keywords/_runonfailure.py @@ -8,7 +8,6 @@ class _RunOnFailureKeywords(KeywordGroup): def __init__(self): self._run_on_failure_keyword = None self._running_on_failure_routine = False - self._in_keyword = False # Public diff --git a/src/Selenium2Library/keywords/keywordgroup.py b/src/Selenium2Library/keywords/keywordgroup.py index 79a44708b..672603afd 100755 --- a/src/Selenium2Library/keywords/keywordgroup.py +++ b/src/Selenium2Library/keywords/keywordgroup.py @@ -9,8 +9,8 @@ def _run_on_failure_decorator(method, *args, **kwargs): self = args[0] - in_keyword = self._in_keyword # If False, we are in the outermost keyword (or in `run_keyword`, if it's a dynamic library) - self._in_keyword = True # Set a flag on the instance so that as we call keywords inside this call and this gets run again, we know we're at least one level in. + already_in_keyword = getattr(self, "_already_in_keyword", False) # If False, we are in the outermost keyword (or in `run_keyword`, if it's a dynamic library) + self._already_in_keyword = True # Set a flag on the instance so that as we call keywords inside this call and this gets run again, we know we're at least one level in. try: return method(*args, **kwargs) except Exception, err: @@ -20,9 +20,9 @@ def _run_on_failure_decorator(method, *args, **kwargs): self._run_on_failure() raise finally: - if not in_keyword: + if not already_in_keyword: # If we are in the outer call, reset the flags. - self._in_keyword = False + self._already_in_keyword = False self._has_run_on_failure = False class KeywordGroupMetaClass(type): diff --git a/test/acceptance/keywords/run_on_failure.txt b/test/acceptance/keywords/run_on_failure.txt old mode 100644 new mode 100755 index d5a482cab..bda842850 --- a/test/acceptance/keywords/run_on_failure.txt +++ b/test/acceptance/keywords/run_on_failure.txt @@ -3,6 +3,7 @@ Suite Setup Run Keywords Go To Front Page Set Info Loglevel Suite Teardown Set Debug Loglevel Test Teardown Register Keyword to Run on Failure Nothing Resource ../resource.txt +Library CustomSeleniumKeywords *** Variables *** ${PAGE TITLE} (root)/index.html @@ -27,3 +28,15 @@ Run on Failure Returns Previous Value Should Be Equal ${old} Log Title ${old}= Register Keyword to Run on Failure ${old} Should Be Equal ${old} Log Source + +On Failure Keyword Only Called Once + Set Test Variable ${ON FAIL COUNT} ${0} + Register Keyword To Run On Failure On Fail + Run Keyword And Ignore Error Custom Selenium Keyword id=missing + Should Be Equal ${ON FAIL COUNT} ${1} On Failure Keyword called ${ON FAIL COUNT} times. + [Teardown] Close Browser + +*** Keywords *** +On Fail + ${count}= Evaluate ${ON FAIL COUNT} + 1 + Set Test Variable ${ON FAIL COUNT} ${count} \ No newline at end of file diff --git a/test/acceptance/resource.txt b/test/acceptance/resource.txt old mode 100644 new mode 100755 index 35784b96a..f56a828d9 --- a/test/acceptance/resource.txt +++ b/test/acceptance/resource.txt @@ -2,6 +2,7 @@ Library Selenium2Library run_on_failure=Nothing implicit_wait=0 Library Collections Library OperatingSystem +Library CustomKeyword *Variable* diff --git a/test/env.py b/test/env.py old mode 100644 new mode 100755 index ed636cde9..efc6c4148 --- a/test/env.py +++ b/test/env.py @@ -6,6 +6,7 @@ ACCEPTANCE_TEST_DIR = os.path.join(ROOT_DIR, "acceptance") LIB_DIR = os.path.join(ROOT_DIR, "lib") RESOURCES_DIR = os.path.join(ROOT_DIR, "resources") +TEST_LIBS_DIR = os.path.join(RESOURCES_DIR, "testlibs") RESULTS_DIR = os.path.join(ROOT_DIR, "results") HTTP_SERVER_FILE = os.path.join(RESOURCES_DIR, 'testserver', 'testserver.py') SRC_DIR = os.path.join(ROOT_DIR, "..", "src") diff --git a/test/resources/testlibs/CustomSeleniumKeywords.py b/test/resources/testlibs/CustomSeleniumKeywords.py new file mode 100755 index 000000000..21e7331fa --- /dev/null +++ b/test/resources/testlibs/CustomSeleniumKeywords.py @@ -0,0 +1,9 @@ +from Selenium2Library import Selenium2Library +from robot.utils import asserts + +class CustomSeleniumKeywords(Selenium2Library): + def custom_selenium_keyword(self): + self.custom_selenium_keyword_inner() + + def custom_selenium_keyword_inner(self): + asserts.assert_false(True) \ No newline at end of file diff --git a/test/run_tests.py b/test/run_tests.py index e8e009744..ed0d4bdd4 100755 --- a/test/run_tests.py +++ b/test/run_tests.py @@ -26,7 +26,7 @@ '--critical', 'regression', '--noncritical', 'inprogress', ] -ARG_VALUES = {'outdir': env.RESULTS_DIR, 'pythonpath': env.SRC_DIR} +ARG_VALUES = {'outdir': env.RESULTS_DIR, 'pythonpath': ':'.join((env.SRC_DIR, env.TEST_LIBS_DIR))} def acceptance_tests(interpreter, browser, args): ARG_VALUES['browser'] = browser.replace('*', '') From d39b3dbffa545879ee415114ef574a724506ba06 Mon Sep 17 00:00:00 2001 From: frishber Date: Fri, 10 Oct 2014 15:09:00 -0400 Subject: [PATCH 05/25] Fixed reference in resourse.txt --- test/acceptance/resource.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/test/acceptance/resource.txt b/test/acceptance/resource.txt index f56a828d9..35784b96a 100755 --- a/test/acceptance/resource.txt +++ b/test/acceptance/resource.txt @@ -2,7 +2,6 @@ Library Selenium2Library run_on_failure=Nothing implicit_wait=0 Library Collections Library OperatingSystem -Library CustomKeyword *Variable* From 0465c8f80142659992ad0e41e9bed8e4cfa50f02 Mon Sep 17 00:00:00 2001 From: frishber Date: Fri, 10 Oct 2014 16:20:41 -0400 Subject: [PATCH 06/25] Moved run-on-failure test to new file --- .../keywords/run_on_failure_only_once.txt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100755 test/acceptance/keywords/run_on_failure_only_once.txt diff --git a/test/acceptance/keywords/run_on_failure_only_once.txt b/test/acceptance/keywords/run_on_failure_only_once.txt new file mode 100755 index 000000000..f6a39c89c --- /dev/null +++ b/test/acceptance/keywords/run_on_failure_only_once.txt @@ -0,0 +1,21 @@ +*** Settings *** +Suite Setup Run Keywords Prefer Custom Keywords Go To Front Page +Test Teardown Register Keyword to Run on Failure Nothing +Resource ../resource.txt +Library CustomSeleniumKeywords + +*** Test Cases *** +Run On Failure Keyword Only Called Once + Set Test Variable ${ON FAIL COUNT} ${0} + Register Keyword To Run On Failure On Fail + Run Keyword And Ignore Error Custom Selenium Keyword id=missing + Should Be Equal ${ON FAIL COUNT} ${1} On Failure Keyword called ${ON FAIL COUNT} times. + [Teardown] Close Browser + +*** Keywords *** +On Fail + ${count}= Evaluate ${ON FAIL COUNT} + 1 + Set Test Variable ${ON FAIL COUNT} ${count} + +Prefer Custom Keywords + Set Library Search Order CustomSeleniumKeywords \ No newline at end of file From 37822fc9fe279cd0bbd850c77199c321139f671e Mon Sep 17 00:00:00 2001 From: frishber Date: Fri, 10 Oct 2014 16:40:13 -0400 Subject: [PATCH 07/25] Fixed test --- test/acceptance/keywords/run_on_failure.txt | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/test/acceptance/keywords/run_on_failure.txt b/test/acceptance/keywords/run_on_failure.txt index bda842850..d5a482cab 100755 --- a/test/acceptance/keywords/run_on_failure.txt +++ b/test/acceptance/keywords/run_on_failure.txt @@ -3,7 +3,6 @@ Suite Setup Run Keywords Go To Front Page Set Info Loglevel Suite Teardown Set Debug Loglevel Test Teardown Register Keyword to Run on Failure Nothing Resource ../resource.txt -Library CustomSeleniumKeywords *** Variables *** ${PAGE TITLE} (root)/index.html @@ -28,15 +27,3 @@ Run on Failure Returns Previous Value Should Be Equal ${old} Log Title ${old}= Register Keyword to Run on Failure ${old} Should Be Equal ${old} Log Source - -On Failure Keyword Only Called Once - Set Test Variable ${ON FAIL COUNT} ${0} - Register Keyword To Run On Failure On Fail - Run Keyword And Ignore Error Custom Selenium Keyword id=missing - Should Be Equal ${ON FAIL COUNT} ${1} On Failure Keyword called ${ON FAIL COUNT} times. - [Teardown] Close Browser - -*** Keywords *** -On Fail - ${count}= Evaluate ${ON FAIL COUNT} + 1 - Set Test Variable ${ON FAIL COUNT} ${count} \ No newline at end of file From fc1174b4f9d1b4311487bb90cf0e66586d7b70e0 Mon Sep 17 00:00:00 2001 From: frishber Date: Fri, 10 Oct 2014 17:14:11 -0400 Subject: [PATCH 08/25] Setting keyword to run on failure --- test/acceptance/keywords/run_on_failure_only_once.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/acceptance/keywords/run_on_failure_only_once.txt b/test/acceptance/keywords/run_on_failure_only_once.txt index f6a39c89c..aa901b675 100755 --- a/test/acceptance/keywords/run_on_failure_only_once.txt +++ b/test/acceptance/keywords/run_on_failure_only_once.txt @@ -7,7 +7,8 @@ Library CustomSeleniumKeywords *** Test Cases *** Run On Failure Keyword Only Called Once Set Test Variable ${ON FAIL COUNT} ${0} - Register Keyword To Run On Failure On Fail + CustomSeleniumKeywords.Register Keyword To Run On Failure On Fail + Selenium2Library.Register Keyword To Run On Failure On Fail Run Keyword And Ignore Error Custom Selenium Keyword id=missing Should Be Equal ${ON FAIL COUNT} ${1} On Failure Keyword called ${ON FAIL COUNT} times. [Teardown] Close Browser From 44815c52ddb1461becec80869c27530c98b13469 Mon Sep 17 00:00:00 2001 From: frishber Date: Tue, 4 Nov 2014 13:57:01 -0500 Subject: [PATCH 09/25] Tests are working now --- test/acceptance/keywords/__init__.txt | 0 .../keywords/run_on_failure_only_once.txt | 20 +++++++++++++------ .../testlibs/CustomSeleniumKeywords.py | 6 ++++++ 3 files changed, 20 insertions(+), 6 deletions(-) mode change 100644 => 100755 test/acceptance/keywords/__init__.txt diff --git a/test/acceptance/keywords/__init__.txt b/test/acceptance/keywords/__init__.txt old mode 100644 new mode 100755 diff --git a/test/acceptance/keywords/run_on_failure_only_once.txt b/test/acceptance/keywords/run_on_failure_only_once.txt index aa901b675..55ee5a237 100755 --- a/test/acceptance/keywords/run_on_failure_only_once.txt +++ b/test/acceptance/keywords/run_on_failure_only_once.txt @@ -1,17 +1,19 @@ *** Settings *** Suite Setup Run Keywords Prefer Custom Keywords Go To Front Page -Test Teardown Register Keyword to Run on Failure Nothing +Suite Teardown Run Keywords Set Debug Loglevel Restore Old Search Order +Test Teardown Register Keyword To Run On Failure Nothing Resource ../resource.txt Library CustomSeleniumKeywords *** Test Cases *** Run On Failure Keyword Only Called Once Set Test Variable ${ON FAIL COUNT} ${0} - CustomSeleniumKeywords.Register Keyword To Run On Failure On Fail - Selenium2Library.Register Keyword To Run On Failure On Fail - Run Keyword And Ignore Error Custom Selenium Keyword id=missing + Register Keyword To Run On Failure On Fail + Run Keyword And Ignore Error Custom Selenium Keyword Should Be Equal ${ON FAIL COUNT} ${1} On Failure Keyword called ${ON FAIL COUNT} times. - [Teardown] Close Browser + +*** Variables *** +${old order} *** Keywords *** On Fail @@ -19,4 +21,10 @@ On Fail Set Test Variable ${ON FAIL COUNT} ${count} Prefer Custom Keywords - Set Library Search Order CustomSeleniumKeywords \ No newline at end of file + ${old order}= Set Library Search Order CustomSeleniumKeywords + +Restore Old Search Order + Set Library Search Order ${old order} + +Open Browser To Front Page + Open Browser ${FRONT PAGE} \ No newline at end of file diff --git a/test/resources/testlibs/CustomSeleniumKeywords.py b/test/resources/testlibs/CustomSeleniumKeywords.py index 21e7331fa..ce0b9d42b 100755 --- a/test/resources/testlibs/CustomSeleniumKeywords.py +++ b/test/resources/testlibs/CustomSeleniumKeywords.py @@ -1,7 +1,13 @@ from Selenium2Library import Selenium2Library from robot.utils import asserts +from robot.libraries.BuiltIn import BuiltIn class CustomSeleniumKeywords(Selenium2Library): + + def __init__(self, *args, **kwargs): + ret = super(CustomSeleniumKeywords, self).__init__(*args, **kwargs) + self._cache = BuiltIn().get_library_instance("Selenium2Library")._cache + def custom_selenium_keyword(self): self.custom_selenium_keyword_inner() From 81a673e4f29cf8a7d7e6459f67049922487fd200 Mon Sep 17 00:00:00 2001 From: frishber Date: Tue, 4 Nov 2014 14:01:09 -0500 Subject: [PATCH 10/25] Restored permissions --- src/Selenium2Library/keywords/_runonfailure.py | 0 src/Selenium2Library/keywords/keywordgroup.py | 0 test/acceptance/keywords/__init__.txt | 0 test/acceptance/keywords/run_on_failure.txt | 0 test/acceptance/keywords/run_on_failure_only_once.txt | 0 test/resources/testlibs/CustomSeleniumKeywords.py | 0 6 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 src/Selenium2Library/keywords/_runonfailure.py mode change 100755 => 100644 src/Selenium2Library/keywords/keywordgroup.py mode change 100755 => 100644 test/acceptance/keywords/__init__.txt mode change 100755 => 100644 test/acceptance/keywords/run_on_failure.txt mode change 100755 => 100644 test/acceptance/keywords/run_on_failure_only_once.txt mode change 100755 => 100644 test/resources/testlibs/CustomSeleniumKeywords.py diff --git a/src/Selenium2Library/keywords/_runonfailure.py b/src/Selenium2Library/keywords/_runonfailure.py old mode 100755 new mode 100644 diff --git a/src/Selenium2Library/keywords/keywordgroup.py b/src/Selenium2Library/keywords/keywordgroup.py old mode 100755 new mode 100644 diff --git a/test/acceptance/keywords/__init__.txt b/test/acceptance/keywords/__init__.txt old mode 100755 new mode 100644 diff --git a/test/acceptance/keywords/run_on_failure.txt b/test/acceptance/keywords/run_on_failure.txt old mode 100755 new mode 100644 diff --git a/test/acceptance/keywords/run_on_failure_only_once.txt b/test/acceptance/keywords/run_on_failure_only_once.txt old mode 100755 new mode 100644 diff --git a/test/resources/testlibs/CustomSeleniumKeywords.py b/test/resources/testlibs/CustomSeleniumKeywords.py old mode 100755 new mode 100644 From 795a67cc3d15ddd4927dcb1b79349ee007ee67cf Mon Sep 17 00:00:00 2001 From: frishber Date: Wed, 8 Oct 2014 15:29:16 -0400 Subject: [PATCH 11/25] Modified the run-on-failure mechanism so that only one screenshot is taken --- src/Selenium2Library/keywords/_runonfailure.py | 1 + src/Selenium2Library/keywords/keywordgroup.py | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) mode change 100644 => 100755 src/Selenium2Library/keywords/_runonfailure.py mode change 100644 => 100755 src/Selenium2Library/keywords/keywordgroup.py diff --git a/src/Selenium2Library/keywords/_runonfailure.py b/src/Selenium2Library/keywords/_runonfailure.py old mode 100644 new mode 100755 index 4e9057107..548d59e0f --- a/src/Selenium2Library/keywords/_runonfailure.py +++ b/src/Selenium2Library/keywords/_runonfailure.py @@ -8,6 +8,7 @@ class _RunOnFailureKeywords(KeywordGroup): def __init__(self): self._run_on_failure_keyword = None self._running_on_failure_routine = False + self._in_keyword = False # Public diff --git a/src/Selenium2Library/keywords/keywordgroup.py b/src/Selenium2Library/keywords/keywordgroup.py old mode 100644 new mode 100755 index ff4f319ca..b6e80dba5 --- a/src/Selenium2Library/keywords/keywordgroup.py +++ b/src/Selenium2Library/keywords/keywordgroup.py @@ -8,13 +8,20 @@ decorator = None # decorator module doesn't work with IronPython 2.6 def _run_on_failure_decorator(method, *args, **kwargs): + self = args[0] + in_keyword = self._in_keyword + self._in_keyword = True try: return method(*args, **kwargs) except Exception, err: - self = args[0] - if hasattr(self, '_run_on_failure'): + if in_keyword and hasattr(self, '_run_on_failure') and not self._has_run_on_failure: + self._has_run_on_failure = True self._run_on_failure() raise + finally: + if not in_keyword: + self._in_keyword = False + self._has_run_on_failure = False class KeywordGroupMetaClass(type): def __new__(cls, clsname, bases, dict): From 46a13432180312d8973d169df68275a7361d1ffc Mon Sep 17 00:00:00 2001 From: frishber Date: Thu, 9 Oct 2014 12:46:39 -0400 Subject: [PATCH 12/25] Added comments --- src/Selenium2Library/keywords/keywordgroup.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Selenium2Library/keywords/keywordgroup.py b/src/Selenium2Library/keywords/keywordgroup.py index b6e80dba5..b19043c11 100755 --- a/src/Selenium2Library/keywords/keywordgroup.py +++ b/src/Selenium2Library/keywords/keywordgroup.py @@ -8,18 +8,20 @@ decorator = None # decorator module doesn't work with IronPython 2.6 def _run_on_failure_decorator(method, *args, **kwargs): - self = args[0] - in_keyword = self._in_keyword - self._in_keyword = True +self = args[0] + in_keyword = self._in_keyword # If False, we are in the outermost keyword (or in `run_keyword`, if it's a dynamic library) + self._in_keyword = True # Set a flag on the instance so that as we call keywords inside this call and this gets run again, we know we're at least one level in. try: return method(*args, **kwargs) except Exception, err: - if in_keyword and hasattr(self, '_run_on_failure') and not self._has_run_on_failure: + if hasattr(self, '_run_on_failure') and not self._has_run_on_failure: + # If we're in an inner keyword, track the fact that we've already run on failure once self._has_run_on_failure = True self._run_on_failure() raise finally: if not in_keyword: + # If we are in the outer call, reset the flags. self._in_keyword = False self._has_run_on_failure = False From 409554973848ba60d75d13068f6c49e6177a6d8d Mon Sep 17 00:00:00 2001 From: frishber Date: Thu, 9 Oct 2014 12:47:54 -0400 Subject: [PATCH 13/25] Fixed indentation --- src/Selenium2Library/keywords/keywordgroup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Selenium2Library/keywords/keywordgroup.py b/src/Selenium2Library/keywords/keywordgroup.py index b19043c11..79a44708b 100755 --- a/src/Selenium2Library/keywords/keywordgroup.py +++ b/src/Selenium2Library/keywords/keywordgroup.py @@ -8,7 +8,7 @@ decorator = None # decorator module doesn't work with IronPython 2.6 def _run_on_failure_decorator(method, *args, **kwargs): -self = args[0] + self = args[0] in_keyword = self._in_keyword # If False, we are in the outermost keyword (or in `run_keyword`, if it's a dynamic library) self._in_keyword = True # Set a flag on the instance so that as we call keywords inside this call and this gets run again, we know we're at least one level in. try: From f9f48c3245c71c1f34486918be72595876a5a5a3 Mon Sep 17 00:00:00 2001 From: frishber Date: Fri, 10 Oct 2014 14:48:21 -0400 Subject: [PATCH 14/25] Added test --- src/Selenium2Library/keywords/_runonfailure.py | 1 - src/Selenium2Library/keywords/keywordgroup.py | 8 ++++---- test/acceptance/keywords/run_on_failure.txt | 13 +++++++++++++ test/acceptance/resource.txt | 1 + test/env.py | 1 + test/resources/testlibs/CustomSeleniumKeywords.py | 9 +++++++++ test/run_tests.py | 2 +- 7 files changed, 29 insertions(+), 6 deletions(-) mode change 100644 => 100755 test/acceptance/keywords/run_on_failure.txt mode change 100644 => 100755 test/acceptance/resource.txt mode change 100644 => 100755 test/env.py create mode 100755 test/resources/testlibs/CustomSeleniumKeywords.py diff --git a/src/Selenium2Library/keywords/_runonfailure.py b/src/Selenium2Library/keywords/_runonfailure.py index 548d59e0f..4e9057107 100755 --- a/src/Selenium2Library/keywords/_runonfailure.py +++ b/src/Selenium2Library/keywords/_runonfailure.py @@ -8,7 +8,6 @@ class _RunOnFailureKeywords(KeywordGroup): def __init__(self): self._run_on_failure_keyword = None self._running_on_failure_routine = False - self._in_keyword = False # Public diff --git a/src/Selenium2Library/keywords/keywordgroup.py b/src/Selenium2Library/keywords/keywordgroup.py index 79a44708b..672603afd 100755 --- a/src/Selenium2Library/keywords/keywordgroup.py +++ b/src/Selenium2Library/keywords/keywordgroup.py @@ -9,8 +9,8 @@ def _run_on_failure_decorator(method, *args, **kwargs): self = args[0] - in_keyword = self._in_keyword # If False, we are in the outermost keyword (or in `run_keyword`, if it's a dynamic library) - self._in_keyword = True # Set a flag on the instance so that as we call keywords inside this call and this gets run again, we know we're at least one level in. + already_in_keyword = getattr(self, "_already_in_keyword", False) # If False, we are in the outermost keyword (or in `run_keyword`, if it's a dynamic library) + self._already_in_keyword = True # Set a flag on the instance so that as we call keywords inside this call and this gets run again, we know we're at least one level in. try: return method(*args, **kwargs) except Exception, err: @@ -20,9 +20,9 @@ def _run_on_failure_decorator(method, *args, **kwargs): self._run_on_failure() raise finally: - if not in_keyword: + if not already_in_keyword: # If we are in the outer call, reset the flags. - self._in_keyword = False + self._already_in_keyword = False self._has_run_on_failure = False class KeywordGroupMetaClass(type): diff --git a/test/acceptance/keywords/run_on_failure.txt b/test/acceptance/keywords/run_on_failure.txt old mode 100644 new mode 100755 index d5a482cab..bda842850 --- a/test/acceptance/keywords/run_on_failure.txt +++ b/test/acceptance/keywords/run_on_failure.txt @@ -3,6 +3,7 @@ Suite Setup Run Keywords Go To Front Page Set Info Loglevel Suite Teardown Set Debug Loglevel Test Teardown Register Keyword to Run on Failure Nothing Resource ../resource.txt +Library CustomSeleniumKeywords *** Variables *** ${PAGE TITLE} (root)/index.html @@ -27,3 +28,15 @@ Run on Failure Returns Previous Value Should Be Equal ${old} Log Title ${old}= Register Keyword to Run on Failure ${old} Should Be Equal ${old} Log Source + +On Failure Keyword Only Called Once + Set Test Variable ${ON FAIL COUNT} ${0} + Register Keyword To Run On Failure On Fail + Run Keyword And Ignore Error Custom Selenium Keyword id=missing + Should Be Equal ${ON FAIL COUNT} ${1} On Failure Keyword called ${ON FAIL COUNT} times. + [Teardown] Close Browser + +*** Keywords *** +On Fail + ${count}= Evaluate ${ON FAIL COUNT} + 1 + Set Test Variable ${ON FAIL COUNT} ${count} \ No newline at end of file diff --git a/test/acceptance/resource.txt b/test/acceptance/resource.txt old mode 100644 new mode 100755 index 35784b96a..f56a828d9 --- a/test/acceptance/resource.txt +++ b/test/acceptance/resource.txt @@ -2,6 +2,7 @@ Library Selenium2Library run_on_failure=Nothing implicit_wait=0 Library Collections Library OperatingSystem +Library CustomKeyword *Variable* diff --git a/test/env.py b/test/env.py old mode 100644 new mode 100755 index ed636cde9..efc6c4148 --- a/test/env.py +++ b/test/env.py @@ -6,6 +6,7 @@ ACCEPTANCE_TEST_DIR = os.path.join(ROOT_DIR, "acceptance") LIB_DIR = os.path.join(ROOT_DIR, "lib") RESOURCES_DIR = os.path.join(ROOT_DIR, "resources") +TEST_LIBS_DIR = os.path.join(RESOURCES_DIR, "testlibs") RESULTS_DIR = os.path.join(ROOT_DIR, "results") HTTP_SERVER_FILE = os.path.join(RESOURCES_DIR, 'testserver', 'testserver.py') SRC_DIR = os.path.join(ROOT_DIR, "..", "src") diff --git a/test/resources/testlibs/CustomSeleniumKeywords.py b/test/resources/testlibs/CustomSeleniumKeywords.py new file mode 100755 index 000000000..21e7331fa --- /dev/null +++ b/test/resources/testlibs/CustomSeleniumKeywords.py @@ -0,0 +1,9 @@ +from Selenium2Library import Selenium2Library +from robot.utils import asserts + +class CustomSeleniumKeywords(Selenium2Library): + def custom_selenium_keyword(self): + self.custom_selenium_keyword_inner() + + def custom_selenium_keyword_inner(self): + asserts.assert_false(True) \ No newline at end of file diff --git a/test/run_tests.py b/test/run_tests.py index e8e009744..ed0d4bdd4 100755 --- a/test/run_tests.py +++ b/test/run_tests.py @@ -26,7 +26,7 @@ '--critical', 'regression', '--noncritical', 'inprogress', ] -ARG_VALUES = {'outdir': env.RESULTS_DIR, 'pythonpath': env.SRC_DIR} +ARG_VALUES = {'outdir': env.RESULTS_DIR, 'pythonpath': ':'.join((env.SRC_DIR, env.TEST_LIBS_DIR))} def acceptance_tests(interpreter, browser, args): ARG_VALUES['browser'] = browser.replace('*', '') From d6b29f80dc25a94a356a04f50afe1a9bcf8cd6a6 Mon Sep 17 00:00:00 2001 From: frishber Date: Fri, 10 Oct 2014 15:09:00 -0400 Subject: [PATCH 15/25] Fixed reference in resourse.txt --- test/acceptance/resource.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/test/acceptance/resource.txt b/test/acceptance/resource.txt index f56a828d9..35784b96a 100755 --- a/test/acceptance/resource.txt +++ b/test/acceptance/resource.txt @@ -2,7 +2,6 @@ Library Selenium2Library run_on_failure=Nothing implicit_wait=0 Library Collections Library OperatingSystem -Library CustomKeyword *Variable* From e13f9ba317befcee53f7c7bd68bf8ee5b0f4b245 Mon Sep 17 00:00:00 2001 From: frishber Date: Fri, 10 Oct 2014 16:20:41 -0400 Subject: [PATCH 16/25] Moved run-on-failure test to new file --- .../keywords/run_on_failure_only_once.txt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100755 test/acceptance/keywords/run_on_failure_only_once.txt diff --git a/test/acceptance/keywords/run_on_failure_only_once.txt b/test/acceptance/keywords/run_on_failure_only_once.txt new file mode 100755 index 000000000..f6a39c89c --- /dev/null +++ b/test/acceptance/keywords/run_on_failure_only_once.txt @@ -0,0 +1,21 @@ +*** Settings *** +Suite Setup Run Keywords Prefer Custom Keywords Go To Front Page +Test Teardown Register Keyword to Run on Failure Nothing +Resource ../resource.txt +Library CustomSeleniumKeywords + +*** Test Cases *** +Run On Failure Keyword Only Called Once + Set Test Variable ${ON FAIL COUNT} ${0} + Register Keyword To Run On Failure On Fail + Run Keyword And Ignore Error Custom Selenium Keyword id=missing + Should Be Equal ${ON FAIL COUNT} ${1} On Failure Keyword called ${ON FAIL COUNT} times. + [Teardown] Close Browser + +*** Keywords *** +On Fail + ${count}= Evaluate ${ON FAIL COUNT} + 1 + Set Test Variable ${ON FAIL COUNT} ${count} + +Prefer Custom Keywords + Set Library Search Order CustomSeleniumKeywords \ No newline at end of file From 5e35ce834bed175fdbdb083d9513803f9f8232eb Mon Sep 17 00:00:00 2001 From: frishber Date: Fri, 10 Oct 2014 16:40:13 -0400 Subject: [PATCH 17/25] Fixed test --- test/acceptance/keywords/run_on_failure.txt | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/test/acceptance/keywords/run_on_failure.txt b/test/acceptance/keywords/run_on_failure.txt index bda842850..d5a482cab 100755 --- a/test/acceptance/keywords/run_on_failure.txt +++ b/test/acceptance/keywords/run_on_failure.txt @@ -3,7 +3,6 @@ Suite Setup Run Keywords Go To Front Page Set Info Loglevel Suite Teardown Set Debug Loglevel Test Teardown Register Keyword to Run on Failure Nothing Resource ../resource.txt -Library CustomSeleniumKeywords *** Variables *** ${PAGE TITLE} (root)/index.html @@ -28,15 +27,3 @@ Run on Failure Returns Previous Value Should Be Equal ${old} Log Title ${old}= Register Keyword to Run on Failure ${old} Should Be Equal ${old} Log Source - -On Failure Keyword Only Called Once - Set Test Variable ${ON FAIL COUNT} ${0} - Register Keyword To Run On Failure On Fail - Run Keyword And Ignore Error Custom Selenium Keyword id=missing - Should Be Equal ${ON FAIL COUNT} ${1} On Failure Keyword called ${ON FAIL COUNT} times. - [Teardown] Close Browser - -*** Keywords *** -On Fail - ${count}= Evaluate ${ON FAIL COUNT} + 1 - Set Test Variable ${ON FAIL COUNT} ${count} \ No newline at end of file From 97340edf00286f9ff06c14e5ae784581dd553b52 Mon Sep 17 00:00:00 2001 From: frishber Date: Fri, 10 Oct 2014 17:14:11 -0400 Subject: [PATCH 18/25] Setting keyword to run on failure --- test/acceptance/keywords/run_on_failure_only_once.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/acceptance/keywords/run_on_failure_only_once.txt b/test/acceptance/keywords/run_on_failure_only_once.txt index f6a39c89c..aa901b675 100755 --- a/test/acceptance/keywords/run_on_failure_only_once.txt +++ b/test/acceptance/keywords/run_on_failure_only_once.txt @@ -7,7 +7,8 @@ Library CustomSeleniumKeywords *** Test Cases *** Run On Failure Keyword Only Called Once Set Test Variable ${ON FAIL COUNT} ${0} - Register Keyword To Run On Failure On Fail + CustomSeleniumKeywords.Register Keyword To Run On Failure On Fail + Selenium2Library.Register Keyword To Run On Failure On Fail Run Keyword And Ignore Error Custom Selenium Keyword id=missing Should Be Equal ${ON FAIL COUNT} ${1} On Failure Keyword called ${ON FAIL COUNT} times. [Teardown] Close Browser From b07cee2ce8c0f7726b87eefa1965b6dc37c4ccea Mon Sep 17 00:00:00 2001 From: frishber Date: Tue, 4 Nov 2014 13:57:01 -0500 Subject: [PATCH 19/25] Tests are working now --- test/acceptance/keywords/__init__.txt | 0 .../keywords/run_on_failure_only_once.txt | 20 +++++++++++++------ .../testlibs/CustomSeleniumKeywords.py | 6 ++++++ 3 files changed, 20 insertions(+), 6 deletions(-) mode change 100644 => 100755 test/acceptance/keywords/__init__.txt diff --git a/test/acceptance/keywords/__init__.txt b/test/acceptance/keywords/__init__.txt old mode 100644 new mode 100755 diff --git a/test/acceptance/keywords/run_on_failure_only_once.txt b/test/acceptance/keywords/run_on_failure_only_once.txt index aa901b675..55ee5a237 100755 --- a/test/acceptance/keywords/run_on_failure_only_once.txt +++ b/test/acceptance/keywords/run_on_failure_only_once.txt @@ -1,17 +1,19 @@ *** Settings *** Suite Setup Run Keywords Prefer Custom Keywords Go To Front Page -Test Teardown Register Keyword to Run on Failure Nothing +Suite Teardown Run Keywords Set Debug Loglevel Restore Old Search Order +Test Teardown Register Keyword To Run On Failure Nothing Resource ../resource.txt Library CustomSeleniumKeywords *** Test Cases *** Run On Failure Keyword Only Called Once Set Test Variable ${ON FAIL COUNT} ${0} - CustomSeleniumKeywords.Register Keyword To Run On Failure On Fail - Selenium2Library.Register Keyword To Run On Failure On Fail - Run Keyword And Ignore Error Custom Selenium Keyword id=missing + Register Keyword To Run On Failure On Fail + Run Keyword And Ignore Error Custom Selenium Keyword Should Be Equal ${ON FAIL COUNT} ${1} On Failure Keyword called ${ON FAIL COUNT} times. - [Teardown] Close Browser + +*** Variables *** +${old order} *** Keywords *** On Fail @@ -19,4 +21,10 @@ On Fail Set Test Variable ${ON FAIL COUNT} ${count} Prefer Custom Keywords - Set Library Search Order CustomSeleniumKeywords \ No newline at end of file + ${old order}= Set Library Search Order CustomSeleniumKeywords + +Restore Old Search Order + Set Library Search Order ${old order} + +Open Browser To Front Page + Open Browser ${FRONT PAGE} \ No newline at end of file diff --git a/test/resources/testlibs/CustomSeleniumKeywords.py b/test/resources/testlibs/CustomSeleniumKeywords.py index 21e7331fa..ce0b9d42b 100755 --- a/test/resources/testlibs/CustomSeleniumKeywords.py +++ b/test/resources/testlibs/CustomSeleniumKeywords.py @@ -1,7 +1,13 @@ from Selenium2Library import Selenium2Library from robot.utils import asserts +from robot.libraries.BuiltIn import BuiltIn class CustomSeleniumKeywords(Selenium2Library): + + def __init__(self, *args, **kwargs): + ret = super(CustomSeleniumKeywords, self).__init__(*args, **kwargs) + self._cache = BuiltIn().get_library_instance("Selenium2Library")._cache + def custom_selenium_keyword(self): self.custom_selenium_keyword_inner() From e6bc25d26f25e1ca86a747b02a728380106b5c6f Mon Sep 17 00:00:00 2001 From: frishber Date: Tue, 4 Nov 2014 14:01:09 -0500 Subject: [PATCH 20/25] Restored permissions --- src/Selenium2Library/keywords/_runonfailure.py | 0 src/Selenium2Library/keywords/keywordgroup.py | 0 test/acceptance/keywords/__init__.txt | 0 test/acceptance/keywords/run_on_failure.txt | 0 test/acceptance/keywords/run_on_failure_only_once.txt | 0 test/resources/testlibs/CustomSeleniumKeywords.py | 0 6 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 src/Selenium2Library/keywords/_runonfailure.py mode change 100755 => 100644 src/Selenium2Library/keywords/keywordgroup.py mode change 100755 => 100644 test/acceptance/keywords/__init__.txt mode change 100755 => 100644 test/acceptance/keywords/run_on_failure.txt mode change 100755 => 100644 test/acceptance/keywords/run_on_failure_only_once.txt mode change 100755 => 100644 test/resources/testlibs/CustomSeleniumKeywords.py diff --git a/src/Selenium2Library/keywords/_runonfailure.py b/src/Selenium2Library/keywords/_runonfailure.py old mode 100755 new mode 100644 diff --git a/src/Selenium2Library/keywords/keywordgroup.py b/src/Selenium2Library/keywords/keywordgroup.py old mode 100755 new mode 100644 diff --git a/test/acceptance/keywords/__init__.txt b/test/acceptance/keywords/__init__.txt old mode 100755 new mode 100644 diff --git a/test/acceptance/keywords/run_on_failure.txt b/test/acceptance/keywords/run_on_failure.txt old mode 100755 new mode 100644 diff --git a/test/acceptance/keywords/run_on_failure_only_once.txt b/test/acceptance/keywords/run_on_failure_only_once.txt old mode 100755 new mode 100644 diff --git a/test/resources/testlibs/CustomSeleniumKeywords.py b/test/resources/testlibs/CustomSeleniumKeywords.py old mode 100755 new mode 100644 From 32fb53ebc21c487a2528a87e2a24183c5a535c51 Mon Sep 17 00:00:00 2001 From: frishber Date: Fri, 7 Nov 2014 16:25:53 -0500 Subject: [PATCH 21/25] Simplified browser management for run-on-failure test --- test/acceptance/keywords/run_on_failure_only_once.txt | 4 ++-- test/resources/testlibs/CustomSeleniumKeywords.py | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) mode change 100644 => 100755 test/acceptance/keywords/run_on_failure_only_once.txt mode change 100644 => 100755 test/resources/testlibs/CustomSeleniumKeywords.py diff --git a/test/acceptance/keywords/run_on_failure_only_once.txt b/test/acceptance/keywords/run_on_failure_only_once.txt old mode 100644 new mode 100755 index 55ee5a237..a612d312c --- a/test/acceptance/keywords/run_on_failure_only_once.txt +++ b/test/acceptance/keywords/run_on_failure_only_once.txt @@ -1,6 +1,6 @@ *** Settings *** -Suite Setup Run Keywords Prefer Custom Keywords Go To Front Page -Suite Teardown Run Keywords Set Debug Loglevel Restore Old Search Order +Suite Setup Run Keywords Prefer Custom Keywords Open Browser To Front Page +Suite Teardown Run Keywords Close Browser Set Debug Loglevel Restore Old Search Order Test Teardown Register Keyword To Run On Failure Nothing Resource ../resource.txt Library CustomSeleniumKeywords diff --git a/test/resources/testlibs/CustomSeleniumKeywords.py b/test/resources/testlibs/CustomSeleniumKeywords.py old mode 100644 new mode 100755 index ce0b9d42b..a7e32c42a --- a/test/resources/testlibs/CustomSeleniumKeywords.py +++ b/test/resources/testlibs/CustomSeleniumKeywords.py @@ -4,10 +4,6 @@ class CustomSeleniumKeywords(Selenium2Library): - def __init__(self, *args, **kwargs): - ret = super(CustomSeleniumKeywords, self).__init__(*args, **kwargs) - self._cache = BuiltIn().get_library_instance("Selenium2Library")._cache - def custom_selenium_keyword(self): self.custom_selenium_keyword_inner() From e713ed49f85475e6d81d3973a3ed4a7642a33320 Mon Sep 17 00:00:00 2001 From: frishber Date: Tue, 12 May 2015 09:57:33 -0400 Subject: [PATCH 22/25] Moved run_on_failure_only_once test out into run_on_failure.txt --- test/acceptance/keywords/run_on_failure.txt | 22 +++++++++++++- .../keywords/run_on_failure_only_once.txt | 30 ------------------- 2 files changed, 21 insertions(+), 31 deletions(-) mode change 100644 => 100755 test/acceptance/keywords/run_on_failure.txt delete mode 100644 test/acceptance/keywords/run_on_failure_only_once.txt diff --git a/test/acceptance/keywords/run_on_failure.txt b/test/acceptance/keywords/run_on_failure.txt old mode 100644 new mode 100755 index d5a482cab..f103f7712 --- a/test/acceptance/keywords/run_on_failure.txt +++ b/test/acceptance/keywords/run_on_failure.txt @@ -1,14 +1,34 @@ *** Settings *** Suite Setup Run Keywords Go To Front Page Set Info Loglevel Suite Teardown Set Debug Loglevel -Test Teardown Register Keyword to Run on Failure Nothing Resource ../resource.txt *** Variables *** ${PAGE TITLE} (root)/index.html ${FAILURE MESSAGE} Page should not have contained text 'needle' +${old order} + +*** Keywords *** +On Fail + ${count}= Evaluate ${ON FAIL COUNT} + 1 + Set Test Variable ${ON FAIL COUNT} ${count} + +Prefer Custom Keywords + Import Library CustomSeleniumKeywords + ${old order}= Set Library Search Order CustomSeleniumKeywords + +Restore Old Search Order + Set Library Search Order ${old order} *** Test Cases *** +Run On Failure Keyword Only Called Once + [Setup] Prefer Custom Keywords + Set Test Variable ${ON FAIL COUNT} ${0} + Register Keyword To Run On Failure On Fail + Run Keyword And Ignore Error Custom Selenium Keyword + Should Be Equal ${ON FAIL COUNT} ${1} On Failure Keyword called ${ON FAIL COUNT} times. + [Teardown] Register Keyword to Run On Failure Nothing + Log Title On Failure [Documentation] LOG 1 Log Title will be run on failure. LOG 2:2 NONE LOG 3.1.1:1 ${PAGE TITLE} LOG 3.1:3 NONE Register Keyword to Run on Failure Log Title diff --git a/test/acceptance/keywords/run_on_failure_only_once.txt b/test/acceptance/keywords/run_on_failure_only_once.txt deleted file mode 100644 index 55ee5a237..000000000 --- a/test/acceptance/keywords/run_on_failure_only_once.txt +++ /dev/null @@ -1,30 +0,0 @@ -*** Settings *** -Suite Setup Run Keywords Prefer Custom Keywords Go To Front Page -Suite Teardown Run Keywords Set Debug Loglevel Restore Old Search Order -Test Teardown Register Keyword To Run On Failure Nothing -Resource ../resource.txt -Library CustomSeleniumKeywords - -*** Test Cases *** -Run On Failure Keyword Only Called Once - Set Test Variable ${ON FAIL COUNT} ${0} - Register Keyword To Run On Failure On Fail - Run Keyword And Ignore Error Custom Selenium Keyword - Should Be Equal ${ON FAIL COUNT} ${1} On Failure Keyword called ${ON FAIL COUNT} times. - -*** Variables *** -${old order} - -*** Keywords *** -On Fail - ${count}= Evaluate ${ON FAIL COUNT} + 1 - Set Test Variable ${ON FAIL COUNT} ${count} - -Prefer Custom Keywords - ${old order}= Set Library Search Order CustomSeleniumKeywords - -Restore Old Search Order - Set Library Search Order ${old order} - -Open Browser To Front Page - Open Browser ${FRONT PAGE} \ No newline at end of file From 73c296f0a37dc050eb70f96f305d04aeda6d0081 Mon Sep 17 00:00:00 2001 From: frishber Date: Tue, 12 May 2015 10:16:11 -0400 Subject: [PATCH 23/25] Comments --- test/resources/testlibs/CustomSeleniumKeywords.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/resources/testlibs/CustomSeleniumKeywords.py b/test/resources/testlibs/CustomSeleniumKeywords.py index ce0b9d42b..f71ef422e 100755 --- a/test/resources/testlibs/CustomSeleniumKeywords.py +++ b/test/resources/testlibs/CustomSeleniumKeywords.py @@ -5,6 +5,9 @@ class CustomSeleniumKeywords(Selenium2Library): def __init__(self, *args, **kwargs): + """Share `Selenium2Library`'s cache of browsers, so that + we don't have to open a separate browser instance for the `Run On Failure Keyword Only Called Once` + test.""" ret = super(CustomSeleniumKeywords, self).__init__(*args, **kwargs) self._cache = BuiltIn().get_library_instance("Selenium2Library")._cache From 1206fad634072c5a50d8beb61678a26682e36335 Mon Sep 17 00:00:00 2001 From: frishber Date: Tue, 12 May 2015 10:16:52 -0400 Subject: [PATCH 24/25] Comments --- test/resources/testlibs/CustomSeleniumKeywords.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/resources/testlibs/CustomSeleniumKeywords.py b/test/resources/testlibs/CustomSeleniumKeywords.py index f71ef422e..8c6a79c6f 100755 --- a/test/resources/testlibs/CustomSeleniumKeywords.py +++ b/test/resources/testlibs/CustomSeleniumKeywords.py @@ -6,8 +6,8 @@ class CustomSeleniumKeywords(Selenium2Library): def __init__(self, *args, **kwargs): """Share `Selenium2Library`'s cache of browsers, so that - we don't have to open a separate browser instance for the `Run On Failure Keyword Only Called Once` - test.""" + we don't have to open a separate browser instance for the + `Run On Failure Keyword Only Called Once` test.""" ret = super(CustomSeleniumKeywords, self).__init__(*args, **kwargs) self._cache = BuiltIn().get_library_instance("Selenium2Library")._cache From 202565042455ea8f1d327d4b0386a73a590798ea Mon Sep 17 00:00:00 2001 From: frishber Date: Tue, 12 May 2015 13:19:26 -0400 Subject: [PATCH 25/25] Removing old test file --- .../keywords/run_on_failure_only_once.txt | 30 ------------------- 1 file changed, 30 deletions(-) delete mode 100755 test/acceptance/keywords/run_on_failure_only_once.txt diff --git a/test/acceptance/keywords/run_on_failure_only_once.txt b/test/acceptance/keywords/run_on_failure_only_once.txt deleted file mode 100755 index a612d312c..000000000 --- a/test/acceptance/keywords/run_on_failure_only_once.txt +++ /dev/null @@ -1,30 +0,0 @@ -*** Settings *** -Suite Setup Run Keywords Prefer Custom Keywords Open Browser To Front Page -Suite Teardown Run Keywords Close Browser Set Debug Loglevel Restore Old Search Order -Test Teardown Register Keyword To Run On Failure Nothing -Resource ../resource.txt -Library CustomSeleniumKeywords - -*** Test Cases *** -Run On Failure Keyword Only Called Once - Set Test Variable ${ON FAIL COUNT} ${0} - Register Keyword To Run On Failure On Fail - Run Keyword And Ignore Error Custom Selenium Keyword - Should Be Equal ${ON FAIL COUNT} ${1} On Failure Keyword called ${ON FAIL COUNT} times. - -*** Variables *** -${old order} - -*** Keywords *** -On Fail - ${count}= Evaluate ${ON FAIL COUNT} + 1 - Set Test Variable ${ON FAIL COUNT} ${count} - -Prefer Custom Keywords - ${old order}= Set Library Search Order CustomSeleniumKeywords - -Restore Old Search Order - Set Library Search Order ${old order} - -Open Browser To Front Page - Open Browser ${FRONT PAGE} \ No newline at end of file