{ "info": { "author": "Levi Noecker", "author_email": "levi.noecker@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Testing" ], "description": "explicit\n========\n\n|PyPIVersion| |TravisCI| |CoverageStatus| |CodeHealth| |StoriesInReady| |PythonVersions| |Gitter|\n\nHelper class to make working with Selenium explicit waits easier and\nmore accessible\n\n.. |TravisCI| image:: https://travis-ci.org/levi-rs/explicit.svg?branch=master\n :target: https://travis-ci.org/levi-rs/explicit\n.. |CoverageStatus| image:: https://coveralls.io/repos/github/levi-rs/explicit/badge.svg\n :target: https://coveralls.io/github/levi-rs/explicit\n.. |CodeHealth| image:: https://landscape.io/github/levi-rs/explicit/master/landscape.svg?style=flat\n :target: https://landscape.io/github/levi-rs/explicit/master\n.. |StoriesInReady| image:: https://badge.waffle.io/levi-rs/explicit.svg?label=ready&title=Ready\n :target: http://waffle.io/levi-rs/explicit\n.. |PyPIVersion| image:: https://badge.fury.io/py/explicit.svg\n :target: https://badge.fury.io/py/explicit\n.. |PythonVersions| image:: https://img.shields.io/pypi/pyversions/explicit.svg\n :target: https://wiki.python.org/moin/Python2orPython3\n.. |Gitter| image:: https://badges.gitter.im/levi-rs/explicit.svg\n :alt: Join the chat at https://gitter.im/levi-rs/explicit\n :target: https://gitter.im/levi-rs/explicit?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge\n\nExplicit is designed to minimize or eleminate the common frustrations encountered when using\nSelenium on webpages with dynamicly loaded and/or javascript driven content. Typically, a developer\nwill try to use the webdriver's default ``find_element_by_`` to\nlocate an element, only to get hit with various exceptions like NoSuchElementException,\nStaleElementReferenceException, and so on.\n\nSelenium includes several tools to address these limitations, most notibly implicit and explicit\nwaits. While enabling the implicit wait is easy to do, it becomes increasingly problematic as\nscripts become more complex. Explicit waits offer a much more powerful alternative, giving the\ndeveloper more fine tuned controls, but at the expense of added complexity.\n\nThe Explicit package abstracts away the complexities associated with explicit waits by wrapping\ncommonly used functionality in an easy to use API.\n\nConsider this example:\nYou want to use Selenium to log into Github from the 404 page. You write a script like this to fill\nin the login credentials and click the login button:\n\n.. code-block:: python\n\n from selenium import webdriver\n\n driver = webdriver.Chrome()\n\n try:\n driver.get(\"https://github.com/this/doesntexist\")\n\n username_field = driver.find_element_by_id(\"login_field\")\n username_field.click()\n username_field.send_keys(\"my_username\")\n\n password_field = driver.find_element_by_id(\"password\")\n password_field.click()\n password_field.send_keys(\"my_password\")\n\n login_button = driver.find_element_by_css_selector(\"input.btn-primary\")\n login_button.click()\n\n finally:\n driver.quit()\n\nWhen you run the program, however, you get an immediate exception:\n\n::\n\n (.venv35) \u279c explicit \u2717 python example.py\n Traceback (most recent call last):\n File \"example.py\", line 9, in \n username_field = driver.find_element_by_id(\"login_field\")\n <...>\n raise exception_class(message, screen, stacktrace)\n selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {\"method\":\"id\",\"selector\":\"login_field\"}\n\nThe reason for the execption, which might not be readily apparent, is that the login modal on that\npage loads in after the page loads. When the script runs it attempts to immediately find the field\nelement after control is returned from the `driver.get` call. Since the element isn't in the DOM\nyet, Selenium throws the NoSuchElementException.\n\n|GithubLogin|\n\n.. |GithubLogin| image:: http://i.imgur.com/T3gnnhU.gif\n :target: https://github.com/this/doesntexist\n\nExplicit easily solves this by waiting for the element to load in:\n\n.. code-block:: python\n\n from explicit import waiter\n from explicit import ID, CSS\n from selenium import webdriver\n\n driver = webdriver.Chrome()\n\n try:\n driver.get(\"https://github.com/this/doesntexist\")\n\n username_field = waiter.find_element(driver, \"login_field\", by=ID)\n username_field.click()\n username_field.send_keys(\"my_username\")\n\n password_field = waiter.find_element(driver, \"password\", by=ID)\n password_field.click()\n password_field.send_keys(\"my_password\")\n\n login_button = waiter.find_element(driver, \"input.btn-primary\", by=CSS)\n login_button.click()\n finally:\n driver.quit()\n\nAdditionally, you can use explicit to handle the writing:\n\n.. code-block:: python\n\n from explicit import waiter\n from explicit import ID, CSS\n from selenium import webdriver\n\n driver = webdriver.Chrome()\n\n try:\n driver.get(\"https://github.com/this/doesntexist\")\n\n waiter.find_write(driver, \"login_field\", \"my_username\", by=ID)\n\n waiter.find_write(driver, \"password\", \"my_password\", by=ID, send_enter=True)\n\n finally:\n driver.quit()", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/levi-rs/explicit", "keywords": "selenium explicit wait implicit", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "explicit", "package_url": "https://pypi.org/project/explicit/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/explicit/", "project_urls": { "Homepage": "https://github.com/levi-rs/explicit" }, "release_url": "https://pypi.org/project/explicit/0.1.3/", "requires_dist": [ "pbr (>=2.0)", "selenium", "six" ], "requires_python": "", "summary": "Easy explicit wait helpers for Selenium", "version": "0.1.3" }, "last_serial": 2905338, "releases": { "0.0.0": [], "0.0.1": [ { "comment_text": "", "digests": { "md5": "b8874853c77838d28067cd29784ec241", "sha256": "c0a5a1add885ebc0a94243271d417f9fbe0cd31577aa62a31ea9995a867c4781" }, "downloads": -1, "filename": "explicit-0.0.1.tar.gz", "has_sig": false, "md5_digest": "b8874853c77838d28067cd29784ec241", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17652, "upload_time": "2016-10-04T22:59:23", "url": "https://files.pythonhosted.org/packages/d7/f7/26f4cbb4be99a44b066a60fe3191a4a3cc2eda448d937b8cc0d38007dbeb/explicit-0.0.1.tar.gz" } ], "0.0.2": [], "0.0.3": [ { "comment_text": "", "digests": { "md5": "8f04331199eb8d18882972e8507e4e87", "sha256": "ab9ae7821e0d9f75ee0add6eaed4d5df01e1a8396997a276d68819b1070adee0" }, "downloads": -1, "filename": "explicit-0.0.3.tar.gz", "has_sig": false, "md5_digest": "8f04331199eb8d18882972e8507e4e87", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19592, "upload_time": "2016-10-05T16:26:23", "url": "https://files.pythonhosted.org/packages/da/c1/bd5115f17c75cdb031752c451f154cf9bc75027907ead9c96794bd76257e/explicit-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "6cc4b3706537aa98012881acf39b6581", "sha256": "0c68e46f1ee44ca9ed97e5837396dc164379b88c3c95371dc922e8ac593e3002" }, "downloads": -1, "filename": "explicit-0.0.4.tar.gz", "has_sig": false, "md5_digest": "6cc4b3706537aa98012881acf39b6581", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22406, "upload_time": "2016-10-07T16:03:52", "url": "https://files.pythonhosted.org/packages/fb/3b/38d5fee8f88d8806a19f7e9616b16d7212d92bcb2097b15e28e762fb236e/explicit-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "ac4cfc68fcfc57c52b15695f660c772f", "sha256": "dfcf9ed88e08fc9065b73072eb94dd5ac94dd169c5aabef8855dd1132c237d81" }, "downloads": -1, "filename": "explicit-0.0.5.tar.gz", "has_sig": false, "md5_digest": "ac4cfc68fcfc57c52b15695f660c772f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23323, "upload_time": "2016-10-10T16:11:31", "url": "https://files.pythonhosted.org/packages/33/ac/0e9dd1f84e18e59e07401010d0b77bf904cd4c613a059330cc88131272fa/explicit-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "203250b66bb5e4ea6d1566ffef7bdb15", "sha256": "88e80c1dca12babfd2f070c7ad8976df809796272c9359eae21d27cb8e099f75" }, "downloads": -1, "filename": "explicit-0.0.6.tar.gz", "has_sig": false, "md5_digest": "203250b66bb5e4ea6d1566ffef7bdb15", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23462, "upload_time": "2016-10-17T02:03:12", "url": "https://files.pythonhosted.org/packages/3a/c7/541de1618d71a5a2a801e4b43549ca0d56653e5986e7a1ec42f838307320/explicit-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "731f10c5741955c9e6718b4f0d673e56", "sha256": "a420013efcc07035d16226be0c92a05e3b18ef8cd010b5ea39f91b03ae50f345" }, "downloads": -1, "filename": "explicit-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "731f10c5741955c9e6718b4f0d673e56", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9169, "upload_time": "2016-12-18T20:47:05", "url": "https://files.pythonhosted.org/packages/ff/a7/80c269c8c97884acbcbf0c053fa9e4ff77dc3f79f7d9a13529ca8b9ab908/explicit-0.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2ead433b4f739e20bb4d43332d6fc0d0", "sha256": "2ebd95602590792c6c57313b0025ba367d754bad84ca5b90584b761194e64042" }, "downloads": -1, "filename": "explicit-0.0.7.tar.gz", "has_sig": false, "md5_digest": "2ead433b4f739e20bb4d43332d6fc0d0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23468, "upload_time": "2016-12-18T20:47:07", "url": "https://files.pythonhosted.org/packages/1d/35/329306e0fcfb6ae287cab511cfc74ea213503a05e1cd5a2a6b21c7360483/explicit-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "53b60d8cf4684048af912bd86f226e90", "sha256": "153bd073fedc5b1ca90ee16775a82b0542bed225efeca115c15e8bfc937a3fdc" }, "downloads": -1, "filename": "explicit-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "53b60d8cf4684048af912bd86f226e90", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9120, "upload_time": "2017-01-11T13:30:22", "url": "https://files.pythonhosted.org/packages/2f/cc/d2fdcb63e060eade35ea9ffeb22b9e874572a8005dcb3b93ebe6546c75c6/explicit-0.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "10a71d8f228942d374945933cfabbeb9", "sha256": "9cb96910e0efbeaab14f8278db0cc7f9cf2c3a8d9fcf5ad1784cf562a6832bf9" }, "downloads": -1, "filename": "explicit-0.0.8.tar.gz", "has_sig": false, "md5_digest": "10a71d8f228942d374945933cfabbeb9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23429, "upload_time": "2017-01-11T13:30:24", "url": "https://files.pythonhosted.org/packages/1d/2e/b819affd18875b688c126a78b7f812df78342e1fe0924c982e62b3642721/explicit-0.0.8.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "5bb2e69a6d44618b31dbecceaa1537cb", "sha256": "0e252063decbcc1c9037668882fec31a230c06c0dbf2c47d32406045e0a77457" }, "downloads": -1, "filename": "explicit-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "5bb2e69a6d44618b31dbecceaa1537cb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9842, "upload_time": "2017-04-16T18:00:34", "url": "https://files.pythonhosted.org/packages/c9/34/0ecf30a25f6a3d416091b28d265a7bfab3473df89ced46f26eb14d2ea69e/explicit-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3ecb7c7436d881faafda4d153cda0133", "sha256": "e69cdf15a94528001a9e605cad24045b4dd567b4a2eabeb23aa9bf0a82d93a42" }, "downloads": -1, "filename": "explicit-0.1.0.tar.gz", "has_sig": false, "md5_digest": "3ecb7c7436d881faafda4d153cda0133", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24070, "upload_time": "2017-04-16T18:00:36", "url": "https://files.pythonhosted.org/packages/91/a3/f7e9a7de555b998460aee972a70a18378ec887847b462d0d9318e1fab2a3/explicit-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "fd1f3f37ea5530f2ea3512abf9432c2d", "sha256": "4cd0567f4414ad07b338a96775c5c86d3a1222f81e75679fdeeadcd30a82a9db" }, "downloads": -1, "filename": "explicit-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fd1f3f37ea5530f2ea3512abf9432c2d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 7566, "upload_time": "2017-05-07T02:00:40", "url": "https://files.pythonhosted.org/packages/ea/73/265db6bf6e8c18f94f037e72bb979bab6bb968e5ba55e26dca6d3edce33a/explicit-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1c2cb713acd838620edc6d4575aff028", "sha256": "488b0ff63de45813575cf284c9bbfeedec6a20f310c2b084f29a0a2a403ad14d" }, "downloads": -1, "filename": "explicit-0.1.1.tar.gz", "has_sig": false, "md5_digest": "1c2cb713acd838620edc6d4575aff028", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16058, "upload_time": "2017-05-07T02:00:42", "url": "https://files.pythonhosted.org/packages/28/43/5b5990bbe8e5ac412948ba04d98ac009c4b04243854bd999d4de6e03b6d3/explicit-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "bb0bf0cbcac75b3b95bd2bb094bbb34f", "sha256": "e83c8ec2f2d8ecb33500560dd2da5a92faeb29d1f197bc9ddc808f2691d60390" }, "downloads": -1, "filename": "explicit-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bb0bf0cbcac75b3b95bd2bb094bbb34f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 7548, "upload_time": "2017-05-20T13:22:30", "url": "https://files.pythonhosted.org/packages/24/00/12d26af0648cf5fc31894e0e46cff56dc887310017e24efbff2580e34dac/explicit-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b3eb0ebbb9f4518d278b866e8cca588a", "sha256": "cd34d324b33bdcd2f0fd204780fa6ec430c2cfa627f2db86777d0648231ae091" }, "downloads": -1, "filename": "explicit-0.1.2.tar.gz", "has_sig": false, "md5_digest": "b3eb0ebbb9f4518d278b866e8cca588a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16066, "upload_time": "2017-05-20T13:22:32", "url": "https://files.pythonhosted.org/packages/43/82/eee4472f1c9c017310446f593da690024154f256df493096ff8c25199e3f/explicit-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "f2978ab24b91e4547f345c52bdf5e3dc", "sha256": "bb025f19bf5a2baf19b632275980224f1b24854dc0f2c69b9136ff2fe9f0262a" }, "downloads": -1, "filename": "explicit-0.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f2978ab24b91e4547f345c52bdf5e3dc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 7999, "upload_time": "2017-05-28T23:37:12", "url": "https://files.pythonhosted.org/packages/d1/47/b586118021544b0e716fd14fe81444c4398212a9ed0f42819e1c78955c8d/explicit-0.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b5a09d3b59809ca1c75e6ac3970820ec", "sha256": "3e70c7365b73171467b11fce734fecad19f1a5cced4d17a85d90bc18d49545a5" }, "downloads": -1, "filename": "explicit-0.1.3.tar.gz", "has_sig": false, "md5_digest": "b5a09d3b59809ca1c75e6ac3970820ec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16069, "upload_time": "2017-05-28T23:37:14", "url": "https://files.pythonhosted.org/packages/12/4e/d6eafe657717a08f245b5f7439cb91b81862ddeedeba9193f731a19d83a8/explicit-0.1.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "f2978ab24b91e4547f345c52bdf5e3dc", "sha256": "bb025f19bf5a2baf19b632275980224f1b24854dc0f2c69b9136ff2fe9f0262a" }, "downloads": -1, "filename": "explicit-0.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f2978ab24b91e4547f345c52bdf5e3dc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 7999, "upload_time": "2017-05-28T23:37:12", "url": "https://files.pythonhosted.org/packages/d1/47/b586118021544b0e716fd14fe81444c4398212a9ed0f42819e1c78955c8d/explicit-0.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b5a09d3b59809ca1c75e6ac3970820ec", "sha256": "3e70c7365b73171467b11fce734fecad19f1a5cced4d17a85d90bc18d49545a5" }, "downloads": -1, "filename": "explicit-0.1.3.tar.gz", "has_sig": false, "md5_digest": "b5a09d3b59809ca1c75e6ac3970820ec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16069, "upload_time": "2017-05-28T23:37:14", "url": "https://files.pythonhosted.org/packages/12/4e/d6eafe657717a08f245b5f7439cb91b81862ddeedeba9193f731a19d83a8/explicit-0.1.3.tar.gz" } ] }