Repository: yashaka/selene (language: python)

Issue:
refactor timeouts in givenpage.py to be seconds based, not ms based
Check this test:
```
    browser = session_browser.with_(timeout=0.5)
    page = GivenPage(browser.driver)
    page.load_body_with_timeout(
        '''
        <a href="#second">go to Heading 2</a>
        <h2 id="second">Heading 2</h2>       
        ''',
        250,
    )
```
in first line we use timeout in seconds, in pre-pre-last - in ms - INCONSISTENCY!!! :)

Let's fix it:)
Let's refactor timeouts in givenpage.py to be seconds based, not ms based. 
And adapt all tests correspondingly. 


Discussion / hints:
I will do

Fix patch:
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
new file mode 100644
index 00000000..28c50d8b
--- /dev/null
+++ b/.github/workflows/publish.yml
@@ -0,0 +1,29 @@
+name: Upload Python Package
+on:
+  release:
+    types: [ published ]
+
+jobs:
+  build_and_publish:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2.3.4
+      - uses: abatilo/actions-poetry@v2.1.0
+
+      - name: Bump version
+        run: |
+          version=${{ github.event.release.tag_name }}
+          poetry version $version
+          sed -i "s/__version__ = .*/__version__ = \'${version}\'/g" ./selene/__init__.py
+
+      - name: Commit version
+        uses: EndBug/add-and-commit@v7.1.2
+        with:
+          add: '["pyproject.toml", "selene/__init__.py"]'
+          branch: 'master'
+          message: 'bump version up to ${{ github.event.release.tag_name }}'
+
+      - name: Build and publish to pypi
+        uses: JRubics/poetry-publish@v1.5
+        with:
+          pypi_token: ${{ secrets.PYPI_TOKEN }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 065342d1..f4454093 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -77,7 +77,15 @@
 - repeat fix of #225 to other options in shared config, refactor it... 
   - should we make original config (not shared) mutable?
 
-## 2.0.0a36 (to be released on 30.03.2021)
+## 2.0.0a38 (released on 05.05.2021)
+- Upgrade [webdriver-manager](https://github.com/SergeyPirogov/webdriver_manager) 3.3.0 -> 3.4.1 ([see changes](https://github.com/SergeyPirogov/webdriver_manager/compare/v3.3.0...v.3.4.1))
+
+## 2.0.0a37 (released on 24.04.2021)
+- Upgrade [webdriver-manager](https://github.com/SergeyPirogov/webdriver_manager) 2.3.0 -> 3.3.0 [#299](https://github.com/yashaka/selene/issues/299)
+- New release and publish process of selene [#246](https://github.com/yashaka/selene/issues/246#issuecomment-825897200)
+
+## 2.0.0a36 (released on 30.03.2021)
+Contributors release.
 - Moved selene from Pipenv to [Poetry](https://python-poetry.org/) as a greater python dependency resolver of 2021 (see #302).
 - Moved to a new release process with Poetry: added bash aliases in `./.run/*.sh` (see #304).
 - Moved from setup.py and setup.cfg to pyproject.toml config-file.
@@ -86,19 +94,19 @@
 
 ## 2.0.0a35 (released on 27.03.2021)
 - added command.js.click
-- if you set driver for shared.browser manually via `browser.config.driver = ...`
+- if you set driver for `shared.browser` manually via `browser.config.driver = ...`
   now it will automatically close previous driver, if it is alive
 - in selene 1.0 if you could do mixed driver management, 
   like: use automatic driver, then manual, then automatic...
   in selene 2.0 this behaviour was broken, and this version fixes this;)
-- deprecated shared.config.quit_driver; use shared.config.reset_driver instead
+- deprecated `shared.config.quit_driver`; use `shared.config.reset_driver` instead
   - actually, you don't need this method,
-    in most cases you just need shared.browser.quit() – use it if you don't know what you do;)
+    in most cases you just need `shared.browser.quit()` – use it if you don't know what you do;)
 - fixed `browser.switch_to_tab(index_or_name)` when arg is of `int` type    
     
 ## 2.0.0a34 (released on 22.12.2020)
 - fixed [#231](https://github.com/yashaka/selene/issues/225): Need additional option to turn off logging outerHTML
-  - added support.shared.config.log_outer_html_on_failure (`False` by default)
+  - added `support.shared.config.log_outer_html_on_failure` (`False` by default)
 
 ## 2.0.0a33 (released on 10.09.2020)
 - fixed [#225](https://github.com/yashaka/selene/issues/225): Failed to get last_screenshot from shared browser if element with custom config failed
@@ -111,10 +119,10 @@
   - latest PyCharm 2020.2 revealed the hidden issue with typing
 
 ## 2.0.0a30 (released on 30.07.2020)
-- fixed selene.support.shared.browser.with_
+- fixed `selene.support.shared.browser.with_`
   - to return sharedbrowser instance instead of browser instance
-- made browser.config.hold_browser_open to influence browser quit logic 
-  - even if set after calling browser.open or resetting browser.config.driver
+- made `browser.config.hold_browser_open` to influence browser quit logic 
+  - even if set after calling `browser.open` or resetting `browser.config.driver`
 
 ## 2.0.0a29 (released on 30.07.2020)
 - fixed shared browser automatic quit on process exit
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 430db029..f9fd8856 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -42,3 +42,31 @@ Code-style is controlled by few linter jobs in GitHub Actions.
 
 ### Black 
 - lints default black rules except "string normalization".
+
+# Release process
+First make sure you described release notes in CHANGELOG.md.
+## Automatically
+
+1. Create new release on GitHub.
+2. Choose new tag or take not released yet.
+3. Describe release notes.
+4. Select pre-release checkbox if not stable.
+5. Publish the release on GitHub.
+
+Then GitHub action will automatically build and publish release to pypi with selected tag automatically. Also it will commit the tag semver into `__init__.py` and `pyproject.toml` before building if it has not been there yet.
+
+## Old fashion manually (only if GitHub Actions CI is not available)
+1. bump version via `bash .run/bump_version.sh x.x.x`
+2. build via `bash .run/build.sh`
+3. publish via `bash .run/publish.sh`
+
+or
+
+`bash .run/bump_build_publish.sh x.x.x`
+
+or if you want to control all by yourself
+
+1. manually bump version in `pyproject.toml` and `selene/__init.py:__version__`
+2. poetry publish --build
+
+Also don't forget to push a tag and describe release notes on GitHub! (If GitHub Actions works then publish job will fail because same version had already been published on pypi.org)
diff --git a/README.md b/README.md
index 22412c0c..9ada9271 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,7 @@
 [![MIT License](http://img.shields.io/badge/license-MIT-green.svg)](https://github.com/yashaka/selene/blob/master/LICENSE)
 [![Project Template](http://img.shields.io/badge/project-template-9cf.svg)](https://github.com/yashaka/python-web-test)
 [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
+[![Downloads](https://pepy.tech/badge/selene)](https://pepy.tech/project/selene)
 
 ![GitHub stats in](https://raw.githubusercontent.com/yashaka/selene/traffic/traffic-selene/in_2021.svg)
 ![GitHub views](https://raw.githubusercontent.com/yashaka/selene/traffic/traffic-selene/views.svg)
@@ -53,7 +54,7 @@ Tests with Selene can be built either in a simple straightforward "selenide' sty
 
 ## Versions
   
-* Latest recommended version to use is [2.0.0a36](https://pypi.org/project/selene/2.0.0a36/)
+* Latest recommended version to use is [2.0.0a37](https://pypi.org/project/selene/2.0.0a37/)
   * it's a completely new version of selene, with improved API and speed
   * supports python >= 3.7
   * it's incompatible with [1.x](https://github.com/yashaka/selene/tree/1.x)
@@ -419,25 +420,14 @@ TBD
 
 TBD
 
-## Changelog
-
-[see CHANGELOG.md](https://github.com/yashaka/selene/blob/master/CHANGELOG.md)
-
 ## Contributing
 
 [see CONTRIBUTING.md](https://github.com/yashaka/selene/blob/master/CONTRIBUTING.md)
 
-## Release process
+## Release Process
 
-1. bump version via `bash .run/bump_version.sh x.x.x`
-2. build via `bash .run/build.sh`
-3. publish via `bash .run/publish.sh`
+[see CONTRIBUTING.md#release-process](https://github.com/yashaka/selene/blob/master/CONTRIBUTING.md#release-process)
 
-or
-
-`bash .run/bump_build_publish.sh x.x.x`
-
-or if you want to control all by yourself
+## Changelog
 
-1. manually bump version in `pyproject.toml` and `selene/__init.py:__version__`
-2. poetry publish --build
+[see CHANGELOG.md](https://github.com/yashaka/selene/blob/master/CHANGELOG.md)
diff --git a/poetry.lock b/poetry.lock
index e882c02b..6b6dba89 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -8,11 +8,11 @@ python-versions = "*"
 
 [[package]]
 name = "astroid"
-version = "2.5.1"
+version = "2.5.6"
 description = "An abstract syntax tree for Python with inference support."
 category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = "~=3.6"
 
 [package.dependencies]
 lazy-object-proxy = ">=1.4.0"
@@ -36,10 +36,10 @@ optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
 [package.extras]
+dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"]
 docs = ["furo", "sphinx", "zope.interface"]
 tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"]
 tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"]
-dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"]
 
 [[package]]
 name = "black"
@@ -50,14 +50,14 @@ optional = false
 python-versions = ">=3.6"
 
 [package.dependencies]
-regex = ">=2020.1.8"
+appdirs = "*"
+click = ">=7.1.2"
 mypy-extensions = ">=0.4.3"
-typed-ast = ">=1.4.0"
+pathspec = ">=0.6,<1"
+regex = ">=2020.1.8"
 toml = ">=0.10.1"
+typed-ast = ">=1.4.0"
 typing-extensions = ">=3.7.4"
-pathspec = ">=0.6,<1"
-click = ">=7.1.2"
-appdirs = "*"
 
 [package.extras]
 colorama = ["colorama (>=0.4.3)"]
@@ -96,8 +96,8 @@ optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
 [package.dependencies]
-requests = ">=2.7.9"
 coverage = "*"
+requests = ">=2.7.9"
 
 [[package]]
 name = "colorama"
@@ -159,7 +159,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
 [[package]]
 name = "importlib-metadata"
-version = "3.8.0"
+version = "4.0.1"
 description = "Read metadata from Python packages"
 category = "dev"
 optional = false
@@ -190,9 +190,9 @@ optional = false
 python-versions = ">=3.6,<4.0"
 
 [package.extras]
-colors = ["colorama (>=0.4.3,<0.5.0)"]
 pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
 requirements_deprecated_finder = ["pipreqs", "pip-api"]
+colors = ["colorama (>=0.4.3,<0.5.0)"]
 
 [[package]]
 name = "lazy-object-proxy"
@@ -269,21 +269,18 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
 [[package]]
 name = "pylint"
-version = "2.7.2"
+version = "2.8.2"
 description = "python code static checker"
 category = "dev"
 optional = false
 python-versions = "~=3.6"
 
 [package.dependencies]
-astroid = ">=2.5.1,<2.6"
-mccabe = ">=0.6,<0.7"
+astroid = ">=2.5.6,<2.7"
 colorama = {version = "*", markers = "sys_platform == \"win32\""}
-toml = ">=0.7.1"
 isort = ">=4.2.5,<6"
-
-[package.extras]
-docs = ["sphinx (==3.5.1)", "python-docs-theme (==2020.12)"]
+mccabe = ">=0.6,<0.7"
+toml = ">=0.7.1"
 
 [[package]]
 name = "pyparsing"
@@ -295,22 +292,22 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
 
 [[package]]
 name = "pytest"
-version = "6.2.2"
+version = "6.2.3"
 description = "pytest: simple powerful testing with Python"
 category = "dev"
 optional = false
 python-versions = ">=3.6"
 
 [package.dependencies]
+atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
+attrs = ">=19.2.0"
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
+iniconfig = "*"
 packaging = "*"
+pluggy = ">=0.12,<1.0.0a1"
 py = ">=1.8.2"
-iniconfig = "*"
-importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-attrs = ">=19.2.0"
 toml = "*"
-pluggy = ">=0.12,<1.0.0a1"
-atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
 
 [package.extras]
 testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
@@ -324,15 +321,15 @@ optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
 [package.dependencies]
-pytest = ">=4.6"
 coverage = ">=5.2.1"
+pytest = ">=4.6"
 
 [package.extras]
 testing = ["fields", "hunter", "process-tests (==2.0.2)", "six", "pytest-xdist", "virtualenv"]
 
 [[package]]
 name = "regex"
-version = "2021.3.17"
+version = "2021.4.4"
 description = "Alternative regular expression module, to replace re."
 category = "dev"
 optional = false
@@ -347,9 +344,9 @@ optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
 [package.dependencies]
-idna = ">=2.5,<3"
 certifi = ">=2017.4.17"
 chardet = ">=3.0.2,<5"
+idna = ">=2.5,<3"
 urllib3 = ">=1.21.1,<1.27"
 
 [package.extras]
@@ -377,7 +374,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
 
 [[package]]
 name = "typed-ast"
-version = "1.4.2"
+version = "1.4.3"
 description = "a fork of Python 2 and 3 ast modules with type comment support"
 category = "dev"
 optional = false
@@ -400,22 +397,22 @@ optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
 
 [package.extras]
-socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
 secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
+socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
 brotli = ["brotlipy (>=0.6.0)"]
 
 [[package]]
 name = "webdriver-manager"
-version = "3.3.0"
+version = "3.4.1"
 description = "Library provides the way to automatically manage drivers for different browsers"
 category = "main"
 optional = false
 python-versions = ">=3.6"
 
 [package.dependencies]
+configparser = "*"
 crayons = "*"
 requests = "*"
-configparser = "*"
 
 [[package]]
 name = "wrapt"
@@ -440,7 +437,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.7"
-content-hash = "0f870f545b17afab3eb221082739f252d5300abcab465dbe7c40bae58d21187b"
+content-hash = "e19f69b79bf05a147a9ec8236141c03ed0ea2b8546385ee14996139a27d055d2"
 
 [metadata.files]
 appdirs = [
@@ -448,8 +445,8 @@ appdirs = [
     {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
 ]
 astroid = [
-    {file = "astroid-2.5.1-py3-none-any.whl", hash = "sha256:21d735aab248253531bb0f1e1e6d068f0ee23533e18ae8a6171ff892b98297cf"},
-    {file = "astroid-2.5.1.tar.gz", hash = "sha256:cfc35498ee64017be059ceffab0a25bedf7548ab76f2bea691c5565896e7128d"},
+    {file = "astroid-2.5.6-py3-none-any.whl", hash = "sha256:4db03ab5fc3340cf619dbc25e42c2cc3755154ce6009469766d7143d1fc2ee4e"},
+    {file = "astroid-2.5.6.tar.gz", hash = "sha256:8a398dfce302c13f14bab13e2b14fe385d32b73f4e4853b9bdfb64598baa1975"},
 ]
 atomicwrites = [
     {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
@@ -553,8 +550,8 @@ idna = [
     {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"},
 ]
 importlib-metadata = [
-    {file = "importlib_metadata-3.8.0-py3-none-any.whl", hash = "sha256:ce8ae4d781be528001aad74ecfec7512641e36f1272effeea55164e47ae26841"},
-    {file = "importlib_metadata-3.8.0.tar.gz", hash = "sha256:9dd89454add8894cc93619426949a58bdad9c1ef42822e46b884e7fc2d2a901e"},
+    {file = "importlib_metadata-4.0.1-py3-none-any.whl", hash = "sha256:d7eb1dea6d6a6086f8be21784cc9e3bcfa55872b52309bc5fad53a8ea444465d"},
+    {file = "importlib_metadata-4.0.1.tar.gz", hash = "sha256:8c501196e49fb9df5df43833bdb1e4328f64847763ec8a50703148b73784d581"},
 ]
 iniconfig = [
     {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
@@ -617,63 +614,63 @@ pycodestyle = [
     {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"},
 ]
 pylint = [
-    {file = "pylint-2.7.2-py3-none-any.whl", hash = "sha256:d09b0b07ba06bcdff463958f53f23df25e740ecd81895f7d2699ec04bbd8dc3b"},
-    {file = "pylint-2.7.2.tar.gz", hash = "sha256:0e21d3b80b96740909d77206d741aa3ce0b06b41be375d92e1f3244a274c1f8a"},
+    {file = "pylint-2.8.2-py3-none-any.whl", hash = "sha256:f7e2072654a6b6afdf5e2fb38147d3e2d2d43c89f648637baab63e026481279b"},
+    {file = "pylint-2.8.2.tar.gz", hash = "sha256:586d8fa9b1891f4b725f587ef267abe2a1bad89d6b184520c7f07a253dd6e217"},
 ]
 pyparsing = [
     {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
     {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
 ]
 pytest = [
-    {file = "pytest-6.2.2-py3-none-any.whl", hash = "sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839"},
-    {file = "pytest-6.2.2.tar.gz", hash = "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9"},
+    {file = "pytest-6.2.3-py3-none-any.whl", hash = "sha256:6ad9c7bdf517a808242b998ac20063c41532a570d088d77eec1ee12b0b5574bc"},
+    {file = "pytest-6.2.3.tar.gz", hash = "sha256:671238a46e4df0f3498d1c3270e5deb9b32d25134c99b7d75370a68cfbe9b634"},
 ]
 pytest-cov = [
     {file = "pytest-cov-2.11.1.tar.gz", hash = "sha256:359952d9d39b9f822d9d29324483e7ba04a3a17dd7d05aa6beb7ea01e359e5f7"},
     {file = "pytest_cov-2.11.1-py2.py3-none-any.whl", hash = "sha256:bdb9fdb0b85a7cc825269a4c56b48ccaa5c7e365054b6038772c32ddcdc969da"},
 ]
 regex = [
-    {file = "regex-2021.3.17-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b97ec5d299c10d96617cc851b2e0f81ba5d9d6248413cd374ef7f3a8871ee4a6"},
-    {file = "regex-2021.3.17-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:cb4ee827857a5ad9b8ae34d3c8cc51151cb4a3fe082c12ec20ec73e63cc7c6f0"},
-    {file = "regex-2021.3.17-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:633497504e2a485a70a3268d4fc403fe3063a50a50eed1039083e9471ad0101c"},
-    {file = "regex-2021.3.17-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:a59a2ee329b3de764b21495d78c92ab00b4ea79acef0f7ae8c1067f773570afa"},
-    {file = "regex-2021.3.17-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:f85d6f41e34f6a2d1607e312820971872944f1661a73d33e1e82d35ea3305e14"},
-    {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:4651f839dbde0816798e698626af6a2469eee6d9964824bb5386091255a1694f"},
-    {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:39c44532d0e4f1639a89e52355b949573e1e2c5116106a395642cbbae0ff9bcd"},
-    {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3d9a7e215e02bd7646a91fb8bcba30bc55fd42a719d6b35cf80e5bae31d9134e"},
-    {file = "regex-2021.3.17-cp36-cp36m-win32.whl", hash = "sha256:159fac1a4731409c830d32913f13f68346d6b8e39650ed5d704a9ce2f9ef9cb3"},
-    {file = "regex-2021.3.17-cp36-cp36m-win_amd64.whl", hash = "sha256:13f50969028e81765ed2a1c5fcfdc246c245cf8d47986d5172e82ab1a0c42ee5"},
-    {file = "regex-2021.3.17-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b9d8d286c53fe0cbc6d20bf3d583cabcd1499d89034524e3b94c93a5ab85ca90"},
-    {file = "regex-2021.3.17-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:201e2619a77b21a7780580ab7b5ce43835e242d3e20fef50f66a8df0542e437f"},
-    {file = "regex-2021.3.17-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d47d359545b0ccad29d572ecd52c9da945de7cd6cf9c0cfcb0269f76d3555689"},
-    {file = "regex-2021.3.17-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:ea2f41445852c660ba7c3ebf7d70b3779b20d9ca8ba54485a17740db49f46932"},
-    {file = "regex-2021.3.17-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:486a5f8e11e1f5bbfcad87f7c7745eb14796642323e7e1829a331f87a713daaa"},
-    {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:18e25e0afe1cf0f62781a150c1454b2113785401ba285c745acf10c8ca8917df"},
-    {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:a2ee026f4156789df8644d23ef423e6194fad0bc53575534101bb1de5d67e8ce"},
-    {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:4c0788010a93ace8a174d73e7c6c9d3e6e3b7ad99a453c8ee8c975ddd9965643"},
-    {file = "regex-2021.3.17-cp37-cp37m-win32.whl", hash = "sha256:575a832e09d237ae5fedb825a7a5bc6a116090dd57d6417d4f3b75121c73e3be"},
-    {file = "regex-2021.3.17-cp37-cp37m-win_amd64.whl", hash = "sha256:8e65e3e4c6feadf6770e2ad89ad3deb524bcb03d8dc679f381d0568c024e0deb"},
-    {file = "regex-2021.3.17-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a0df9a0ad2aad49ea3c7f65edd2ffb3d5c59589b85992a6006354f6fb109bb18"},
-    {file = "regex-2021.3.17-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b98bc9db003f1079caf07b610377ed1ac2e2c11acc2bea4892e28cc5b509d8d5"},
-    {file = "regex-2021.3.17-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:808404898e9a765e4058bf3d7607d0629000e0a14a6782ccbb089296b76fa8fe"},
-    {file = "regex-2021.3.17-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:5770a51180d85ea468234bc7987f5597803a4c3d7463e7323322fe4a1b181578"},
-    {file = "regex-2021.3.17-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:976a54d44fd043d958a69b18705a910a8376196c6b6ee5f2596ffc11bff4420d"},
-    {file = "regex-2021.3.17-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:63f3ca8451e5ff7133ffbec9eda641aeab2001be1a01878990f6c87e3c44b9d5"},
-    {file = "regex-2021.3.17-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bcd945175c29a672f13fce13a11893556cd440e37c1b643d6eeab1988c8b209c"},
-    {file = "regex-2021.3.17-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:3d9356add82cff75413bec360c1eca3e58db4a9f5dafa1f19650958a81e3249d"},
-    {file = "regex-2021.3.17-cp38-cp38-win32.whl", hash = "sha256:f5d0c921c99297354cecc5a416ee4280bd3f20fd81b9fb671ca6be71499c3fdf"},
-    {file = "regex-2021.3.17-cp38-cp38-win_amd64.whl", hash = "sha256:14de88eda0976020528efc92d0a1f8830e2fb0de2ae6005a6fc4e062553031fa"},
-    {file = "regex-2021.3.17-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4c2e364491406b7888c2ad4428245fc56c327e34a5dfe58fd40df272b3c3dab3"},
-    {file = "regex-2021.3.17-cp39-cp39-manylinux1_i686.whl", hash = "sha256:8bd4f91f3fb1c9b1380d6894bd5b4a519409135bec14c0c80151e58394a4e88a"},
-    {file = "regex-2021.3.17-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:882f53afe31ef0425b405a3f601c0009b44206ea7f55ee1c606aad3cc213a52c"},
-    {file = "regex-2021.3.17-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:07ef35301b4484bce843831e7039a84e19d8d33b3f8b2f9aab86c376813d0139"},
-    {file = "regex-2021.3.17-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:360a01b5fa2ad35b3113ae0c07fb544ad180603fa3b1f074f52d98c1096fa15e"},
-    {file = "regex-2021.3.17-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:709f65bb2fa9825f09892617d01246002097f8f9b6dde8d1bb4083cf554701ba"},
-    {file = "regex-2021.3.17-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:c66221e947d7207457f8b6f42b12f613b09efa9669f65a587a2a71f6a0e4d106"},
-    {file = "regex-2021.3.17-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:c782da0e45aff131f0bed6e66fbcfa589ff2862fc719b83a88640daa01a5aff7"},
-    {file = "regex-2021.3.17-cp39-cp39-win32.whl", hash = "sha256:dc9963aacb7da5177e40874585d7407c0f93fb9d7518ec58b86e562f633f36cd"},
-    {file = "regex-2021.3.17-cp39-cp39-win_amd64.whl", hash = "sha256:a0d04128e005142260de3733591ddf476e4902c0c23c1af237d9acf3c96e1b38"},
-    {file = "regex-2021.3.17.tar.gz", hash = "sha256:4b8a1fb724904139149a43e172850f35aa6ea97fb0545244dc0b805e0154ed68"},
+    {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"},
+    {file = "regex-2021.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711"},
+    {file = "regex-2021.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11"},
+    {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968"},
+    {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0"},
+    {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4"},
+    {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a"},
+    {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7"},
+    {file = "regex-2021.4.4-cp36-cp36m-win32.whl", hash = "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29"},
+    {file = "regex-2021.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79"},
+    {file = "regex-2021.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8"},
+    {file = "regex-2021.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31"},
+    {file = "regex-2021.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a"},
+    {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5"},
+    {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82"},
+    {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765"},
+    {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e"},
+    {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439"},
+    {file = "regex-2021.4.4-cp37-cp37m-win32.whl", hash = "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d"},
+    {file = "regex-2021.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3"},
+    {file = "regex-2021.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500"},
+    {file = "regex-2021.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14"},
+    {file = "regex-2021.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480"},
+    {file = "regex-2021.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc"},
+    {file = "regex-2021.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093"},
+    {file = "regex-2021.4.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10"},
+    {file = "regex-2021.4.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f"},
+    {file = "regex-2021.4.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87"},
+    {file = "regex-2021.4.4-cp38-cp38-win32.whl", hash = "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac"},
+    {file = "regex-2021.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2"},
+    {file = "regex-2021.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17"},
+    {file = "regex-2021.4.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605"},
+    {file = "regex-2021.4.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9"},
+    {file = "regex-2021.4.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7"},
+    {file = "regex-2021.4.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8"},
+    {file = "regex-2021.4.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed"},
+    {file = "regex-2021.4.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c"},
+    {file = "regex-2021.4.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"},
+    {file = "regex-2021.4.4-cp39-cp39-win32.whl", hash = "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6"},
+    {file = "regex-2021.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07"},
+    {file = "regex-2021.4.4.tar.gz", hash = "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb"},
 ]
 requests = [
     {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"},
@@ -688,36 +685,36 @@ toml = [
     {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
 ]
 typed-ast = [
-    {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"},
-    {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"},
-    {file = "typed_ast-1.4.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412"},
-    {file = "typed_ast-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400"},
-    {file = "typed_ast-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606"},
-    {file = "typed_ast-1.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64"},
-    {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07"},
-    {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc"},
-    {file = "typed_ast-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a"},
-    {file = "typed_ast-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151"},
-    {file = "typed_ast-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3"},
-    {file = "typed_ast-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41"},
-    {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f"},
-    {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581"},
-    {file = "typed_ast-1.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37"},
-    {file = "typed_ast-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd"},
-    {file = "typed_ast-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496"},
-    {file = "typed_ast-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc"},
-    {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"},
-    {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea"},
-    {file = "typed_ast-1.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787"},
-    {file = "typed_ast-1.4.2-cp38-cp38-win32.whl", hash = "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2"},
-    {file = "typed_ast-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937"},
-    {file = "typed_ast-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1"},
-    {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6"},
-    {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166"},
-    {file = "typed_ast-1.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d"},
-    {file = "typed_ast-1.4.2-cp39-cp39-win32.whl", hash = "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b"},
-    {file = "typed_ast-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440"},
-    {file = "typed_ast-1.4.2.tar.gz", hash = "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a"},
+    {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"},
+    {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"},
+    {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"},
+    {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"},
+    {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"},
+    {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"},
+    {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"},
+    {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"},
+    {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"},
+    {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"},
+    {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"},
+    {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"},
+    {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"},
+    {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"},
+    {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"},
+    {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"},
+    {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"},
+    {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"},
+    {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"},
+    {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"},
+    {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"},
+    {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"},
+    {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"},
+    {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"},
+    {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"},
+    {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"},
+    {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"},
+    {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"},
+    {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"},
+    {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"},
 ]
 typing-extensions = [
     {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"},
@@ -729,8 +726,8 @@ urllib3 = [
     {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"},
 ]
 webdriver-manager = [
-    {file = "webdriver_manager-3.3.0-py2.py3-none-any.whl", hash = "sha256:22ae0ace4da117472302c21ead8ec05eb5c1312eeeba97547395d79f83afb241"},
-    {file = "webdriver_manager-3.3.0.tar.gz", hash = "sha256:6b54b18f75379f97f9e49f504a8e79010d47af1da8e7b5d7d7a103ca535b1e46"},
+    {file = "webdriver_manager-3.4.1-py2.py3-none-any.whl", hash = "sha256:00bb38c91a1aee23ef09699df074f7328a3618abbe5bf23944b7e835ad561dd6"},
+    {file = "webdriver_manager-3.4.1.tar.gz", hash = "sha256:254a3c58a253785433ce0d8afd1d6a46ebf0e62137bb05a963c033958610c6da"},
 ]
 wrapt = [
     {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"},
diff --git a/pyproject.toml b/pyproject.toml
index 147e5acd..5f12d9b3 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "selene"
-version = "2.0.0a36"
+version = "2.0.0a38"
 description = "User-oriented browser tests in Python (Selenide port)"
 authors = ["Iakiv Kramarenko <yashaka@gmail.com>"]
 license = "MIT"
@@ -43,7 +43,7 @@ packages = [
 python = "^3.7"
 selenium = "==3.141.0"
 future = "*"
-webdriver-manager = "==3.3.0"
+webdriver-manager = "==3.4.1"
 
 [tool.poetry.dev-dependencies]
 black = "^20.8b1"
diff --git a/selene/__init__.py b/selene/__init__.py
index 60cce9b3..eae7c771 100644
--- a/selene/__init__.py
+++ b/selene/__init__.py
@@ -220,7 +220,7 @@
 # """
 # todo: add here some type imports like Element, Collection, etc.
 
-__version__ = '2.0.0a36'
+__version__ = '2.0.0a38'
 
 # --- DEPRECATED, and will be removed soon --- #
 


Test patch:
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index e158d24b..5489969e 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -27,9 +27,12 @@ jobs:
           poetry install
 
       # can be packaged as Docker-image
-      - name: Install Chrome & xvfb
+      - name: Install Firefox & Chrome & xvfb
         run: |
-          sudo apt-get install google-chrome-stable xvfb
+          sudo apt-get update
+          sudo apt-get install firefox
+          sudo apt-get install google-chrome-stable
+          sudo apt-get install xvfb
           sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 &
 
       - name: Test selene with pytest
@@ -40,10 +43,9 @@ jobs:
 
       # can be improved by flags/options
       - name: Code Coverage
-        uses: codecov/codecov-action@v1.1.1
+        uses: codecov/codecov-action@v1
         with:
           file: ./coverage.xml # optional
-          flags: unittests # optional
           name: selene-codecov # optional
           fail_ci_if_error: true # optional (default = false)
           verbose: true
diff --git a/tests/acceptance/helpers/givenpage.py b/tests/acceptance/helpers/givenpage.py
index d3c4df10..3d96a427 100644
--- a/tests/acceptance/helpers/givenpage.py
+++ b/tests/acceptance/helpers/givenpage.py
@@ -21,6 +21,7 @@
 # SOFTWARE.
 
 import os
+from tests.helpers import convert_sec_to_ms
 
 EMPTY_PAGE_URL = (
     'file://'
@@ -48,7 +49,7 @@ def render_body(self, body, timeout=0):
             'setTimeout(function() { document.getElementsByTagName("body")[0].innerHTML = "'
             + body.replace('\n', ' ').replace('"', '\\"')
             + '";}, '
-            + str(timeout)
+            + str(convert_sec_to_ms(timeout))
             + ');'
         )
         return self
@@ -62,7 +63,7 @@ def execute_script_with_timeout(self, script, timeout):
             "setTimeout(function() { "
             + script.replace("\n", " ")
             + " }, "
-            + str(timeout)
+            + str(convert_sec_to_ms(timeout))
             + ");"
         )
         return self
diff --git a/tests/helpers.py b/tests/helpers.py
index dd2c08d1..838eb684 100644
--- a/tests/helpers.py
+++ b/tests/helpers.py
@@ -30,3 +30,7 @@ def time_spent(function, *args, **kwargs):
     end_time = time.time()
 
     return end_time - start_time
+
+
+def convert_sec_to_ms(timeout):
+    return timeout * 1000
diff --git a/tests/integration/collection__element_by_condition__waiting_search_on_actions_like_click_test.py b/tests/integration/collection__element_by_condition__waiting_search_on_actions_like_click_test.py
index 8822c289..bf50de7a 100644
--- a/tests/integration/collection__element_by_condition__waiting_search_on_actions_like_click_test.py
+++ b/tests/integration/collection__element_by_condition__waiting_search_on_actions_like_click_test.py
@@ -33,7 +33,7 @@ def test_waits_for_visibility(session_browser):
         <a href="#second" style="display:none">go to Heading 2</a>
         <h2 id="second">Heading 2</h2>'''
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 500
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.5
     )
 
     element = session_browser.all('a').element_by(
@@ -54,7 +54,7 @@ def test_waits_for_present_in_dom_and_visibility(session_browser):
         '''
         <a href="#second">go to Heading 2</a>
         <h2 id="second">Heading 2</h2>''',
-        500,
+        0.5,
     )
 
     element = session_browser.all('a').element_by(
@@ -75,9 +75,9 @@ def test_waits_first_for_present_in_dom_then_visibility(session_browser):
         '''
         <a href="#second" style="display:none">go to Heading 2</a>
         <h2 id="second">Heading 2</h2>''',
-        250,
+        0.25,
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 500
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.5
     )
 
     element = session_browser.all('a').element_by(
@@ -96,7 +96,7 @@ def test_fails_on_timeout_during_waiting_for_visibility(session_browser):
         <a href='#second' style='display:none'>go to Heading 2</a>
         <h2 id='second'>Heading 2</h2>'''
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 500
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.5
     )
 
     with pytest.raises(TimeoutException):
@@ -118,7 +118,7 @@ def test_fails_on_timeout_during_waits_for_present_in_dom_and_visibility(
         '''
         <a href="#second">go to Heading 2</a>
         <h2 id="second">Heading 2</h2>''',
-        500,
+        0.5,
     )
 
     with pytest.raises(TimeoutException):
@@ -140,9 +140,9 @@ def test_fails_on_timeout_during_waits_first_for_present_in_dom_then_visibility(
         '''
         <a href="#second" style="display:none">go to Heading 2</a>
         <h2 id="second">Heading 2</h2>''',
-        250,
+        0.25,
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 500
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.5
     )
 
     with pytest.raises(TimeoutException):
diff --git a/tests/integration/collection__filtered_by_condition__no_waiting_search_test.py b/tests/integration/collection__filtered_by_condition__no_waiting_search_test.py
index 67d1942b..6b4d6837 100644
--- a/tests/integration/collection__filtered_by_condition__no_waiting_search_test.py
+++ b/tests/integration/collection__filtered_by_condition__no_waiting_search_test.py
@@ -29,25 +29,28 @@ def test_waits_nothing(session_browser):
     elements = session_browser.all('li').filtered_by(
         have.css_class('will-appear')
     )
-
     page.load_body(
         '''
-                   <ul>Hello to:
-                       <li>Anonymous</li>
-                       <li class='will-appear'>Bob</li>
-                       <li class='will-appear' style='display:none'>Kate</li>
-                   </ul>'''
+        <ul>Hello to:
+            <li>Anonymous</li>
+            <li class='will-appear'>Bob</li>
+            <li class='will-appear' style='display:none'>Kate</li>
+        </ul>
+        '''
     )
-    assert len(elements) == 2
-
+    original_count = len(elements)
     page.load_body_with_timeout(
         '''
-                                <ul>Hello to:
-                                    <li>Anonymous</li>
-                                    <li class='will-appear'>Bob</li>
-                                    <li class='will-appear' style='display:none'>Kate</li>
-                                    <li class='will-appear'>Joe</li>
-                                </ul>''',
-        500,
+        <ul>Hello to:
+            <li>Anonymous</li>
+            <li class='will-appear'>Bob</li>
+            <li class='will-appear' style='display:none'>Kate</li>
+            <li class='will-appear'>Joe</li>
+        </ul>
+        ''',
+        0.5,
     )
-    assert len(elements) == 2
+
+    updated_count = len(elements)
+
+    assert updated_count == original_count == 2
diff --git a/tests/integration/collection__indexed_element__waiting_search_on_actions_like_click_test.py b/tests/integration/collection__indexed_element__waiting_search_on_actions_like_click_test.py
index 1a5ae582..049e73ca 100644
--- a/tests/integration/collection__indexed_element__waiting_search_on_actions_like_click_test.py
+++ b/tests/integration/collection__indexed_element__waiting_search_on_actions_like_click_test.py
@@ -32,7 +32,7 @@ def test_waits_for_visibility(session_browser):
         <a href="#second" style="display:none">go to Heading 2</a>
         <h2 id="second">Heading 2</h2>'''
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 500
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.5
     )
 
     session_browser.all('a')[0].click()
@@ -50,7 +50,7 @@ def test_waits_for_present_in_dom_and_visibility(session_browser):
         '''
         <a href="#second">go to Heading 2</a>
         <h2 id="second">Heading 2</h2>''',
-        500,
+        0.5,
     )
 
     session_browser.all('a')[0].click()
@@ -67,9 +67,9 @@ def test_waits_first_for_present_in_dom_then_visibility(session_browser):
         '''
         <a href="#second" style="display:none">go to Heading 2</a>
         <h2 id="second">Heading 2</h2>''',
-        250,
+        0.25,
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 500
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.5
     )
 
     session_browser.all('a')[0].click()
@@ -85,7 +85,7 @@ def test_fails_on_timeout_during_waiting_for_visibility(session_browser):
         <a href='#second' style='display:none'>go to Heading 2</a>
         <h2 id='second'>Heading 2</h2>'''
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 500
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.5
     )
 
     with pytest.raises(TimeoutException):
@@ -107,7 +107,7 @@ def test_fails_on_timeout_during_waits_for_present_in_dom_and_visibility(
         '''
         <a href="#second">go to Heading 2</a>
         <h2 id="second">Heading 2</h2>''',
-        500,
+        0.5,
     )
 
     with pytest.raises(TimeoutException):
@@ -129,9 +129,9 @@ def test_fails_on_timeout_during_waits_first_for_present_in_dom_then_visibility(
         '''
         <a href="#second" style="display:none">go to Heading 2</a>
         <h2 id="second">Heading 2</h2>''',
-        250,
+        0.25,
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 500
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.5
     )
 
     with pytest.raises(TimeoutException):
diff --git a/tests/integration/collection__inner_collection__nowaiting_search_test.py b/tests/integration/collection__inner_collection__nowaiting_search_test.py
index 076e72ed..01c873e9 100644
--- a/tests/integration/collection__inner_collection__nowaiting_search_test.py
+++ b/tests/integration/collection__inner_collection__nowaiting_search_test.py
@@ -44,7 +44,7 @@ def test_does_not_wait_inner(session_browser):
             <li class='will-appear' style='display:none'>Kate</li>
             <li class='will-appear'>Joe</li>
         </ul>''',
-        500,
+        0.5,
     )
 
     assert len(elements) == 2
@@ -67,9 +67,9 @@ def test_waits_for_parent_in_dom_then_visible(session_browser):
             <li class='item'>Bob</li>
             <li class='item' style='display:none'>Kate</li>
         </ul>''',
-        250,
+        0.25,
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("ul")[0].style = "display:block";', 500
+        'document.getElementsByTagName("ul")[0].style = "display:block";', 0.5
     )
 
     assert len(elements) == 2
diff --git a/tests/integration/collection__nowaiting_search_test.py b/tests/integration/collection__nowaiting_search_test.py
index f36aaf1d..736c4288 100644
--- a/tests/integration/collection__nowaiting_search_test.py
+++ b/tests/integration/collection__nowaiting_search_test.py
@@ -43,6 +43,6 @@ def test_waits_nothing(session_browser):
                                     <li class='will-appear' style='display:none'>Kate</li>
                                     <li class='will-appear'>Joe</li>
                                 </ul>''',
-        500,
+        0.5,
     )
     assert len(elements) == 2
diff --git a/tests/integration/element__click_test.py b/tests/integration/element__click_test.py
index ae6bf67d..6b8e9be6 100644
--- a/tests/integration/element__click_test.py
+++ b/tests/integration/element__click_test.py
@@ -25,7 +25,7 @@ def test_click_waits_for_no_overlay(session_browser):
         '''
         document.getElementById('overlay').style.display=none
         ''',
-        250,
+        0.25,
     )
 
     browser.element('a').click()
diff --git a/tests/integration/element__element__waiting_search_on_actions_like_click_test.py b/tests/integration/element__element__waiting_search_on_actions_like_click_test.py
index 5829028c..fe79a7c9 100644
--- a/tests/integration/element__element__waiting_search_on_actions_like_click_test.py
+++ b/tests/integration/element__element__waiting_search_on_actions_like_click_test.py
@@ -38,7 +38,7 @@ def test_waits_for_inner_visibility(session_browser):
         )
         .execute_script_with_timeout(
             'document.getElementsByTagName("a")[0].style = "display:block";',
-            250,
+            0.25,
         )
     )
 
@@ -61,7 +61,7 @@ def test_waits_for_inner_presence_in_dom_and_visibility(session_browser):
             <a href="#second">go to Heading 2</a>
             <h2 id="second">Heading 2</h2>
         </p>''',
-        250,
+        0.25,
     )
 
     session_browser.element('p').element('a').click()
@@ -85,9 +85,9 @@ def test_waits_first_for_inner_presence_in_dom_then_visibility(
             <a href="#second" style="display:none">go to Heading 2</a>
             <h2 id="second">Heading 2</h2>
         </p>''',
-        250,
+        0.25,
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 500
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.5
     )
 
     session_browser.element('p').element('a').click()
@@ -105,7 +105,7 @@ def test_waits_first_for_parent_in_dom_then_inner_in_dom_then_visibility(
         <p>
             <h2 id="second">Heading 2</h2>
         </p>''',
-        250,
+        0.25,
     )
     page.load_body_with_timeout(
         '''
@@ -113,9 +113,9 @@ def test_waits_first_for_parent_in_dom_then_inner_in_dom_then_visibility(
             <a href="#second" style="display:none">go to Heading 2</a>
             <h2 id="second">Heading 2</h2>
         </p>''',
-        500,
+        0.5,
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 750
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.75
     )
 
     session_browser.element('p').element('a').click()
@@ -133,9 +133,9 @@ def test_waits_for__hidden_parent_then_visible_then_inner_hidden_then_visible(
         <p style="display:none">
             <h2 id="second">Heading 2</h2>
         </p>''',
-        250,
+        0.25,
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("p")[0].style = "display:block";', 500
+        'document.getElementsByTagName("p")[0].style = "display:block";', 0.5
     )
     page.load_body_with_timeout(
         '''
@@ -143,9 +143,9 @@ def test_waits_for__hidden_parent_then_visible_then_inner_hidden_then_visible(
             <a href="#second" style="display:none">go to Heading 2</a>
             <h2 id="second">Heading 2</h2>
         </p>''',
-        750,
+        0.75,
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 1000
+        'document.getElementsByTagName("a")[0].style = "display:block";', 1
     )
 
     session_browser.element('p').element('a').click()
@@ -163,7 +163,7 @@ def test_fails_on_timeout_during_waiting_for_inner_visibility(session_browser):
             <h2 id='second'>Heading 2</h2>
         </p>'''
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 500
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.5
     )
 
     with pytest.raises(TimeoutException):
@@ -189,7 +189,7 @@ def test_fails_on_timeout_during_waiting_for_inner_in_dom_and_visibility(
             <a href="#second">go to Heading 2</a>
             <h2 id="second">Heading 2</h2>
         </p>''',
-        250,
+        0.25,
     )
 
     with pytest.raises(TimeoutException):
@@ -215,9 +215,9 @@ def test_fails_on_timeout_during_waiting_first_for_inner_in_dom_then_visibility(
             <a href="#second" style="display:none">go to Heading 2</a>
             <h2 id="second">Heading 2</h2>
         </p>''',
-        250,
+        0.25,
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 500
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.5
     )
 
     with pytest.raises(TimeoutException):
@@ -237,7 +237,7 @@ def test_fails_on_timeout_when_waiting_parent_in_dom_then_inner_in_dom_then_visi
         <p>
             <h2 id="second">Heading 2</h2>
         </p>''',
-        250,
+        0.25,
     )
     page.load_body_with_timeout(
         '''
@@ -245,9 +245,9 @@ def test_fails_on_timeout_when_waiting_parent_in_dom_then_inner_in_dom_then_visi
             <a href="#second" style="display:none">go to Heading 2</a>
             <h2 id="second">Heading 2</h2>
         </p>''',
-        500,
+        0.5,
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 750
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.75
     )
 
     with pytest.raises(TimeoutException):
@@ -267,9 +267,9 @@ def test_fails_on_timeout_when_waiting_parent_in_dom_then_visible_then_inner_in_
         <p style="display:none">
             <h2 id="second">Heading 2</h2>
         </p>''',
-        250,
+        0.25,
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("p")[0].style = "display:block";', 500
+        'document.getElementsByTagName("p")[0].style = "display:block";', 0.5
     )
     page.load_body_with_timeout(
         '''
@@ -277,9 +277,9 @@ def test_fails_on_timeout_when_waiting_parent_in_dom_then_visible_then_inner_in_
             <a href="#second" style="display:none">go to Heading 2</a>
             <h2 id="second">Heading 2</h2>
         </p>''',
-        750,
+        0.75,
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 1000
+        'document.getElementsByTagName("a")[0].style = "display:block";', 1
     )
 
     with pytest.raises(TimeoutException):
diff --git a/tests/integration/element__waiting_search_on_actions_like_click_test.py b/tests/integration/element__waiting_search_on_actions_like_click_test.py
index 5de2bbba..47d3cd14 100644
--- a/tests/integration/element__waiting_search_on_actions_like_click_test.py
+++ b/tests/integration/element__waiting_search_on_actions_like_click_test.py
@@ -33,7 +33,7 @@ def test_waits_for_visibility_minimum_needed_time(session_browser):
         <a href="#second" style="display:none">go to Heading 2</a>
         <h2 id="second">Heading 2</h2>'''
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 500
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.5
     )
     element = session_browser.element('a')
     # stamp_before = time.time_ns()
@@ -41,8 +41,8 @@ def test_waits_for_visibility_minimum_needed_time(session_browser):
     element.click()
 
     # stamp_after = time.time_ns()
-    # deviation_ms = 200
-    # assert stamp_after - stamp_before < (500 + deviation_ms) * 1000000
+    # deviation_sec = 0.2
+    # assert stamp_after - stamp_before < (0.5 + deviation_sec) * pow(10, 9)
     assert "second" in session_browser.driver.current_url
 
 
@@ -56,7 +56,7 @@ def test_waits_for_present_in_dom_and_visibility(session_browser):
         '''
         <a href="#second">go to Heading 2</a>
         <h2 id="second">Heading 2</h2>''',
-        500,
+        0.5,
     )
     element = session_browser.element('a')
 
@@ -75,9 +75,9 @@ def test_waits_first_for_present_in_dom_then_visibility(session_browser):
         '''
         <a href="#second" style="display:none">go to Heading 2</a>
         <h2 id="second">Heading 2</h2>''',
-        250,
+        0.25,
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 500
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.5
     )
     element = session_browser.element('a')
 
@@ -94,7 +94,7 @@ def test_fails_on_timeout_during_waiting_for_visibility(session_browser):
         <a href='#second' style='display:none'>go to Heading 2</a>
         <h2 id='second'>Heading 2</h2>'''
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 500
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.5
     )
     element = browser.element("a")
 
@@ -117,7 +117,7 @@ def test_fails_on_timeout_during_waits_for_present_in_dom_and_visibility(
         '''
         <a href="#second">go to Heading 2</a>
         <h2 id="second">Heading 2</h2>''',
-        500,
+        0.5,
     )
     element = browser.element("a")
 
@@ -140,9 +140,9 @@ def test_fails_on_timeout_during_waits_first_for_present_in_dom_then_visibility(
         '''
         <a href="#second" style="display:none">go to Heading 2</a>
         <h2 id="second">Heading 2</h2>''',
-        250,
+        0.25,
     ).execute_script_with_timeout(
-        'document.getElementsByTagName("a")[0].style = "display:block";', 500
+        'document.getElementsByTagName("a")[0].style = "display:block";', 0.5
     )
     element = browser.element("a")
 
diff --git a/tests/integration/helpers/givenpage.py b/tests/integration/helpers/givenpage.py
index 32925ac1..38d4dcec 100644
--- a/tests/integration/helpers/givenpage.py
+++ b/tests/integration/helpers/givenpage.py
@@ -21,6 +21,7 @@
 # SOFTWARE.
 
 import os
+from tests.helpers import convert_sec_to_ms
 
 EMPTY_PAGE_URL = (
     'file://'
@@ -48,7 +49,7 @@ def render_body(self, body, timeout=0):
             'setTimeout(function() { document.getElementsByTagName("body")[0].innerHTML = "'
             + body.replace('\n', ' ').replace('"', '\\"')
             + '";}, '
-            + str(timeout)
+            + str(convert_sec_to_ms(timeout))
             + ');'
         )
         return self
@@ -62,7 +63,7 @@ def execute_script_with_timeout(self, script, timeout):
             'setTimeout(function() { '
             + script.replace('\n', ' ')
             + ' }, '
-            + str(timeout)
+            + str(convert_sec_to_ms(timeout))
             + ');'
         )
         return self