Repository: robotframework/SeleniumLibrary (python)

Issue:
Update SeleniumLibrary is_truthy and is_falsy to follow Robot Framework 3.1 
In Robot Framework `is_truthy` and `is_falsy` has changed between 3.0 and 3.1 version. In Robot Framewrok 3.1 string `0` is considered `False`, but in 3.0 string `0` is `True`. Same also applies to string `off`. Change SeleniumLibrary `is_truthy` and `is_falsy` to follow RF 3.1. 

Reference  #1304 

Pull request description:
Change string 0 to be false in utils is_* methods
Also `off` is False. 

Fixes #1308 

Patch:
diff --git a/src/SeleniumLibrary/__init__.py b/src/SeleniumLibrary/__init__.py
index abe3c215..bb237dab 100644
--- a/src/SeleniumLibrary/__init__.py
+++ b/src/SeleniumLibrary/__init__.py
@@ -283,8 +283,8 @@ class SeleniumLibrary(DynamicCore):
 
     Some keywords accept arguments that are handled as Boolean values true or
     false. If such an argument is given as a string, it is considered false if
-    it is either empty or case-insensitively equal to ``false``, ``no`` or
-    ``none``. Other strings are considered true regardless their value, and
+    it is either empty or case-insensitively equal to ``false``, ``no``, ``off``,
+     ``0`` or ``none``. Other strings are considered true regardless their value, and
     other argument types are tested using same
     [https://docs.python.org/2/library/stdtypes.html#truth-value-testing|rules as in Python].
 
@@ -305,7 +305,8 @@ class SeleniumLibrary(DynamicCore):
     | `Set Screenshot Directory` | ${RESULTS} | persist=${NONE}  | # Python None is false.         |
 
     Note that prior to SeleniumLibrary 3.0, all non-empty strings, including
-    ``false``, ``no`` and ``none``, were considered true.
+    ``false``, ``no`` and ``none``, were considered true. Starting from
+    SeleniumLibrary 4.0, strings ``0`` and ``off`` are considered as false.
 
     = Thread support =
 
diff --git a/src/SeleniumLibrary/utils/types.py b/src/SeleniumLibrary/utils/types.py
index 47162e02..edae4c2c 100644
--- a/src/SeleniumLibrary/utils/types.py
+++ b/src/SeleniumLibrary/utils/types.py
@@ -16,15 +16,16 @@
 
 # Originally based on  Robot Framework 3.0.2 robot.utils.robottypes and
 # Can be removed when library minimum required Robot Framework
-# version is greater than 3.0.2. Then Robot Framework is_truthy should
-# also support string NONE as Python False.
+# version is greater than 3.0.4. Then Robot Framework is_truthy should
+# also support string NONE as Python False. Also string 0 is evaluated
+# as False in RF 3.1 but not in 3.0.4.
 from robot.utils import is_string
 from robot.utils import PY3
 
 
 def is_truthy(item):
     if is_string(item):
-        return item.upper() not in ('FALSE', 'NO', '', 'NONE')
+        return item.upper() not in ('FALSE', 'NO', '', 'NONE', '0', 'OFF')
     return bool(item)
 
 


Test patch:
diff --git a/utest/test/keywords/test_cookie.py b/utest/test/keywords/test_cookie.py
index 27cfc83d..c85caaf9 100644
--- a/utest/test/keywords/test_cookie.py
+++ b/utest/test/keywords/test_cookie.py
@@ -33,7 +33,7 @@ class KeywordArgumentsCookieTest(unittest.TestCase):
                                secure=True)
         verify(self.driver, times=3).add_cookie(cookie)
         self.cookie.add_cookie('name', 'value', path='None', domain='None',
-                               secure='0')
+                               secure='1')
         verify(self.driver, times=4).add_cookie(cookie)
 
     def test_add_cookie_secure_false(self):
diff --git a/utest/test/utils/test_types.py b/utest/test/utils/test_types.py
index ddee7c66..50e79051 100644
--- a/utest/test/utils/test_types.py
+++ b/utest/test/utils/test_types.py
@@ -4,8 +4,8 @@ from SeleniumLibrary.utils import is_truthy, is_falsy, is_noney
 
 
 class IsTruthyFalsyNoneyTests(unittest.TestCase):
-    truthy = ['0', 'foo', ' ', 1, 2.3, True, [1], 'True', {'k': 'v'}]
-    falsy = [0, False, None, [], {}, (), u'', '', 'False', 'None']
+    truthy = ['foo', ' ', 1, 2.3, True, [1], 'True', {'k': 'v'}]
+    falsy = [0, False, None, [], {}, (), u'', '', 'False', 'None', '0', 'off']
 
     def test_is_truthy(self):
         for item in self.truthy: