# Driverless (Non-commercial use only!)
Note: This project is moving away from the selenium syntax
[![Downloads](https://static.pepy.tech/badge/selenium-driverless)](https://pepy.tech/project/selenium-driverless) [![](https://img.shields.io/pypi/v/selenium-driverless.svg?color=3399EE)](https://pypi.org/project/selenium-driverless/)
[Documentation](https://kaliiiiiiiiii.github.io/Selenium-Driverless/#)
- Use Selenium __without chromedriver__
- Currently passes __Cloudflare__, __Bet365__, [Turnstile](https://github.com/kaliiiiiiiiii/Selenium-Driverless/tree/master/dev#bypass-turnstile), and others
- Multiple tabs simultaneously
- Multiple Incognito-contexts with isolated cookies & local storage
- Proxy-auth support ([example code](https://github.com/kaliiiiiiiiii/Selenium-Driverless/blob/dev/examples/proxy_with_auth.py))
- Network-interception ([documentation](https://kaliiiiiiiiii.github.io/Selenium-Driverless/api/RequestInterception/))
- Single requests ([documentation](https://kaliiiiiiiiii.github.io/Selenium-Driverless/api/Target/#selenium_driverless.types.target.Target.fetch))
## Getting detected with interactions?
[CDP-Patches](https://vinyzu.gitbook.io/cdp-patches-documentation) (headfull only) should fix this \
(will integrate it at some time)
### Questions?
Feel free to join the [Driverless-Community](https://discord.com/invite/MzZZjr2ZM3) on **Discord**:)
Also, see [dev-branch](https://github.com/kaliiiiiiiiii/Selenium-Driverless/tree/dev) for the latest implementations.
<details>
<summary>dev-installation (click to expand)</summary>
```shell
pip uninstall -y selenium-driverless
pip install https://github.com/kaliiiiiiiiii/Selenium-Driverless/archive/refs/heads/dev.zip
```
</details>
#### Also, feel free to
<a href="https://www.buymeacoffee.com/kaliiii">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://www.buymeacoffee.com/assets/img/custom_images/black_img.png" />
<source media="(prefers-color-scheme: light)" srcset="https://www.buymeacoffee.com/assets/img/custom_images/white_img.png" />
<img alt="Star History Chart" src="https://www.buymeacoffee.com/assets/img/custom_images/black_img.png" />
</picture>
</a>
## Sponsors
### [Capsolver](https://is.gd/pNs507)
<a href="https://is.gd/IcYvAB" >
<img src="assets/CapSolver Ads.png" alt="drawing" width="60%"/>
</a>
<!---
https://is.gd/stats.php?url=IcYvAB
--->
An AI-powered captcha-solver service.
### Dependencies
* [Python >= 3.8](https://www.python.org/downloads/)
* [Google-Chrome](https://www.google.de/chrome/) installed (Chromium not tested)
### Installing
* Install [Google-Chrome](https://www.google.de/chrome/)
* ```pip install selenium-driverless```
### Usage
### with asyncio
```python
from selenium_driverless import webdriver
from selenium_driverless.types.by import By
import asyncio
async def main():
options = webdriver.ChromeOptions()
async with webdriver.Chrome(options=options) as driver:
await driver.get('http://nowsecure.nl#relax', wait_load=True)
await driver.sleep(0.5)
await driver.wait_for_cdp("Page.domContentEventFired", timeout=15)
# wait 10s for elem to exist
elem = await driver.find_element(By.XPATH, '/html/body/div[2]/div/main/p[2]/a', timeout=10)
await elem.click(move_to=True)
alert = await driver.switch_to.alert
print(alert.text)
await alert.accept()
print(await driver.title)
asyncio.run(main())
```
### synchronous
asyncified, bugs are to expect
<details>
<summary>example code</summary>
```python
from selenium_driverless.sync import webdriver
options = webdriver.ChromeOptions()
with webdriver.Chrome(options=options) as driver:
driver.get('http://nowsecure.nl#relax')
driver.sleep(0.5)
driver.wait_for_cdp("Page.domContentEventFired", timeout=15)
title = driver.title
url = driver.current_url
source = driver.page_source
print(title)
```
</details>
### custom debugger address
```python
from selenium_driverless import webdriver
options = webdriver.ChromeOptions()
options.debugger_address = "127.0.0.1:2005"
# specify if you don't want to run remote
# options.add_argument("--remote-debugging-port=2005")
async with webdriver.Chrome(options=options) as driver:
await driver.get('http://nowsecure.nl#relax', wait_load=True)
```
## Multiple tabs simultaneously
Note: asyncio is recommended, threading only works on independent webdriver.Chrome instances.
<details>
<summary>Example Code (Click to expand)</summary>
```python
from selenium_driverless.sync import webdriver
from selenium_driverless.utils.utils import read
from selenium_driverless import webdriver
import asyncio
async def target_1_handler(target):
await target.get('https://abrahamjuliot.github.io/creepjs/')
print(await target.title)
async def target_2_handler(target):
await target.get("about:blank")
await target.execute_script(await script=read("/files/js/show_mousemove.js"))
await target.pointer.move_to(500, 500, total_time=2)
async def main():
options = webdriver.ChromeOptions()
async with webdriver.Chrome(options=options) as driver:
target_1 = await driver.current_target
target_2 = await driver.new_window("tab", activate=False)
await asyncio.gather(
target_1_handler(target_1),
target_2_handler(target_2)
)
await target_1.focus()
input("press ENTER to exit")
asyncio.run(main())
```
</details>
### Isolated execution contexts
- execute `javascript` without getting detected ( in a **isolated world**)
<details>
<summary>Example Code (Click to expand)</summary>
```python
from selenium_driverless.sync import webdriver
from selenium_driverless import webdriver
import asyncio
async def main():
options = webdriver.ChromeOptions()
async with webdriver.Chrome(options=options) as driver:
await driver.get('chrome://version')
script = """
const proxy = new Proxy(document.documentElement, {
get(target, prop, receiver) {
if(prop === "outerHTML"){
console.log('detected access on "'+prop+'"', receiver)
return "mocked value:)"
}
else{return Reflect.get(...arguments)}
},
});
Object.defineProperty(document, "documentElement", {
value: proxy
})
"""
await driver.execute_script(script)
src = await driver.execute_script("return document.documentElement.outerHTML", unique_context=True)
mocked = await driver.execute_script("return document.documentElement.outerHTML", unique_context=False)
print(src, mocked)
asyncio.run(main())
```
</details>
### Pointer Interaction
see [@master/dev/show_mousemove.py](https://github.com/kaliiiiiiiiii/Selenium-Driverless/blob/master/dev/show_mousemove.py) for visualization
```python
pointer = driver.current_pointer
move_kwargs = {"total_time": 0.7, "accel": 2, "smooth_soft": 20}
await pointer.move_to(100, 500)
await pointer.click(500, 50, move_kwargs=move_kwargs, move_to=True)
```
### Iframes / Frames
due `swtich_to.frame()` being deprecated for driverless, use this instead
```python
iframes = await driver.find_elements(By.TAG_NAME, "iframe")
await asyncio.sleep(0.5)
iframe_document = await iframes[0].content_document
# iframe_document.find_elements(...)
```
### use preferences
```python
from selenium_driverless import webdriver
options = webdriver.ChromeOptions()
# recommended usage
options.update_pref("download.prompt_for_download", False)
# or
options.prefs.update({"download": {"prompt_for_download": False}})
# supported
options.add_experimental_option("prefs", {"download.prompt_for_download": False})
```
### Multiple Contexts
- different cookies for each context
- A context can have multiple windows and tabs within
- different proxy for each context
- opens as a window as incognito
<details>
<summary>Example Code (Click to expand)</summary>
```python
from selenium_driverless import webdriver
import asyncio
async def main():
options = webdriver.ChromeOptions()
async with webdriver.Chrome(options=options) as driver:
context_1 = driver.current_context
await driver.set_auth("username", "password", "localhost:5000")
# proxy not supported on windows due to https://bugs.chromium.org/p/chromium/issues/detail?id=1310057
context_2 = await driver.new_context(proxy_bypass_list=["localhost"], proxy_server="http://localhost:5000")
await context_1.current_target.get("https://examle.com")
await context_2.get("https://examle.com")
input("press ENTER to exit:)")
asyncio.run(main())
```
</details>
#### Custom exception handling
You can implement custom exception handling as following
```python
import selenium_driverless
import sys
handler = (lambda e: print(f'Exception in event-handler:\n{e.__class__.__module__}.{e.__class__.__name__}: {e}',
file=sys.stderr))
sys.modules["selenium_driverless"].EXC_HANDLER = handler
sys.modules["cdp_socket"].EXC_HANDLER = handler
```
## Help
You found a bug? Feel free to open an issue:)
You've got other questions or proposials? feel free to join the [Driverless-Community](https://discord.com/invite/MzZZjr2ZM3) on **Discord** or open a discusion\
## Copyright and Author
[Aurin Aegerter](mailto:aurinliun@gmx.ch) (aka **Steve**)
## License
[![CC BY-NC-SA 4.0][cc-by-nc-sa-shield]][cc-by-nc-sa]
This work is licensed under a
[Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License][cc-by-nc-sa] with an **addition for `Section 1(k)`** in the [LEGAL CODE](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.en):
> Commercial means primarily intended for or directed
> towards commercial advantage or monetary compensation. \
> A business, project or public agreement with a commercial intent of any kind
> which profits more than, or equal to 7'000 US-Dollar per month,
> or any monetary equivalent to that, is not subject to this definition
> of NonCommercial.
[cc-by-nc-sa]: http://creativecommons.org/licenses/by-nc-sa/4.0/
[cc-by-nc-sa-image]: https://licensebuttons.net/l/by-nc-sa/4.0/88x31.png
[cc-by-nc-sa-shield]: https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg
---
If you wish to use this project commercially, you can contact the author for a custom License.
This usually includes a fee of around 5-6% based on your current profit.
## Disclaimer
This project is meant for **educational purposes only**. Use it responsibly. \
**The Author** does **not provide any warranty** and is **not liable** in any way for what or how it gets used.
## Acknowledgments
Inspiration, code snippets, etc.
* [selenium_driverless/utils/find_chrome_executable](https://github.com/ultrafunkamsterdam/undetected-chromedriver/blob/1c704a71cf4f29181a59ecf19ddff32f1b4fbfc0/undetected_chromedriver/__init__.py#L844)
* [cdp-socket](https://github.com/kaliiiiiiiiii/CDP-Socket)
* [jsobject](https://pypi.org/project/jsobject/)
* [pycdp/browser.py](https://github.com/HMaker/python-cdp/blob/master/pycdp/browser.py)
Raw data
{
"_id": null,
"home_page": "https://github.com/kaliiiiiiiiii/Selenium-Driverless",
"name": "selenium-driverless",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "Selenium, webautomation",
"author": "Aurin Aegerter",
"author_email": "aurinliun@gmx.ch",
"download_url": "https://files.pythonhosted.org/packages/5e/92/3fcf637eebbc334543de61b319c4f00d01526053edf33c2f25aa08f05c13/selenium_driverless-1.9.4.tar.gz",
"platform": null,
"description": "# Driverless (Non-commercial use only!)\r\n\r\nNote: This project is moving away from the selenium syntax\r\n\r\n[![Downloads](https://static.pepy.tech/badge/selenium-driverless)](https://pepy.tech/project/selenium-driverless) [![](https://img.shields.io/pypi/v/selenium-driverless.svg?color=3399EE)](https://pypi.org/project/selenium-driverless/)\r\n[Documentation](https://kaliiiiiiiiii.github.io/Selenium-Driverless/#)\r\n\r\n\r\n- Use Selenium __without chromedriver__\r\n- Currently passes __Cloudflare__, __Bet365__, [Turnstile](https://github.com/kaliiiiiiiiii/Selenium-Driverless/tree/master/dev#bypass-turnstile), and others\r\n- Multiple tabs simultaneously\r\n- Multiple Incognito-contexts with isolated cookies & local storage\r\n- Proxy-auth support ([example code](https://github.com/kaliiiiiiiiii/Selenium-Driverless/blob/dev/examples/proxy_with_auth.py))\r\n- Network-interception ([documentation](https://kaliiiiiiiiii.github.io/Selenium-Driverless/api/RequestInterception/))\r\n- Single requests ([documentation](https://kaliiiiiiiiii.github.io/Selenium-Driverless/api/Target/#selenium_driverless.types.target.Target.fetch))\r\n\r\n## Getting detected with interactions?\r\n[CDP-Patches](https://vinyzu.gitbook.io/cdp-patches-documentation) (headfull only) should fix this \\\r\n(will integrate it at some time)\r\n\r\n### Questions? \r\nFeel free to join the [Driverless-Community](https://discord.com/invite/MzZZjr2ZM3) on **Discord**:)\r\n\r\nAlso, see [dev-branch](https://github.com/kaliiiiiiiiii/Selenium-Driverless/tree/dev) for the latest implementations.\r\n<details>\r\n<summary>dev-installation (click to expand)</summary>\r\n\r\n```shell\r\npip uninstall -y selenium-driverless\r\npip install https://github.com/kaliiiiiiiiii/Selenium-Driverless/archive/refs/heads/dev.zip\r\n```\r\n</details>\r\n\r\n\r\n#### Also, feel free to\r\n<a href=\"https://www.buymeacoffee.com/kaliiii\">\r\n <picture>\r\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://www.buymeacoffee.com/assets/img/custom_images/black_img.png\" />\r\n <source media=\"(prefers-color-scheme: light)\" srcset=\"https://www.buymeacoffee.com/assets/img/custom_images/white_img.png\" />\r\n <img alt=\"Star History Chart\" src=\"https://www.buymeacoffee.com/assets/img/custom_images/black_img.png\" />\r\n </picture>\r\n</a>\r\n\r\n## Sponsors\r\n\r\n### [Capsolver](https://is.gd/pNs507)\r\n\r\n<a href=\"https://is.gd/IcYvAB\" >\r\n <img src=\"assets/CapSolver Ads.png\" alt=\"drawing\" width=\"60%\"/>\r\n</a>\r\n\r\n<!--- \r\nhttps://is.gd/stats.php?url=IcYvAB\r\n--->\r\n\r\nAn AI-powered captcha-solver service.\r\n\r\n\r\n### Dependencies\r\n\r\n* [Python >= 3.8](https://www.python.org/downloads/)\r\n* [Google-Chrome](https://www.google.de/chrome/) installed (Chromium not tested)\r\n\r\n### Installing\r\n\r\n* Install [Google-Chrome](https://www.google.de/chrome/)\r\n* ```pip install selenium-driverless```\r\n\r\n\r\n### Usage\r\n\r\n### with asyncio\r\n```python\r\nfrom selenium_driverless import webdriver\r\nfrom selenium_driverless.types.by import By\r\nimport asyncio\r\n\r\n\r\nasync def main():\r\n options = webdriver.ChromeOptions()\r\n async with webdriver.Chrome(options=options) as driver:\r\n await driver.get('http://nowsecure.nl#relax', wait_load=True)\r\n await driver.sleep(0.5)\r\n await driver.wait_for_cdp(\"Page.domContentEventFired\", timeout=15)\r\n \r\n # wait 10s for elem to exist\r\n elem = await driver.find_element(By.XPATH, '/html/body/div[2]/div/main/p[2]/a', timeout=10)\r\n await elem.click(move_to=True)\r\n\r\n alert = await driver.switch_to.alert\r\n print(alert.text)\r\n await alert.accept()\r\n\r\n print(await driver.title)\r\n\r\n\r\nasyncio.run(main())\r\n\r\n```\r\n\r\n### synchronous\r\nasyncified, bugs are to expect\r\n\r\n<details>\r\n\r\n<summary>example code</summary>\r\n\r\n```python\r\nfrom selenium_driverless.sync import webdriver\r\n\r\noptions = webdriver.ChromeOptions()\r\nwith webdriver.Chrome(options=options) as driver:\r\n driver.get('http://nowsecure.nl#relax')\r\n driver.sleep(0.5)\r\n driver.wait_for_cdp(\"Page.domContentEventFired\", timeout=15)\r\n\r\n title = driver.title\r\n url = driver.current_url\r\n source = driver.page_source\r\n print(title)\r\n```\r\n\r\n</details>\r\n\r\n### custom debugger address\r\n```python\r\nfrom selenium_driverless import webdriver\r\n\r\noptions = webdriver.ChromeOptions()\r\noptions.debugger_address = \"127.0.0.1:2005\"\r\n\r\n# specify if you don't want to run remote\r\n# options.add_argument(\"--remote-debugging-port=2005\")\r\n\r\nasync with webdriver.Chrome(options=options) as driver:\r\n await driver.get('http://nowsecure.nl#relax', wait_load=True)\r\n```\r\n\r\n## Multiple tabs simultaneously\r\nNote: asyncio is recommended, threading only works on independent webdriver.Chrome instances.\r\n\r\n<details>\r\n<summary>Example Code (Click to expand)</summary>\r\n\r\n```python\r\nfrom selenium_driverless.sync import webdriver\r\nfrom selenium_driverless.utils.utils import read\r\nfrom selenium_driverless import webdriver\r\nimport asyncio\r\n\r\n\r\nasync def target_1_handler(target):\r\n await target.get('https://abrahamjuliot.github.io/creepjs/')\r\n print(await target.title)\r\n\r\n\r\nasync def target_2_handler(target):\r\n await target.get(\"about:blank\")\r\n await target.execute_script(await script=read(\"/files/js/show_mousemove.js\"))\r\n await target.pointer.move_to(500, 500, total_time=2)\r\n\r\n\r\nasync def main():\r\n options = webdriver.ChromeOptions()\r\n async with webdriver.Chrome(options=options) as driver:\r\n target_1 = await driver.current_target\r\n target_2 = await driver.new_window(\"tab\", activate=False)\r\n await asyncio.gather(\r\n target_1_handler(target_1),\r\n target_2_handler(target_2)\r\n )\r\n await target_1.focus()\r\n input(\"press ENTER to exit\")\r\n\r\n\r\nasyncio.run(main())\r\n```\r\n\r\n</details>\r\n\r\n### Isolated execution contexts\r\n- execute `javascript` without getting detected ( in a **isolated world**)\r\n<details>\r\n<summary>Example Code (Click to expand)</summary>\r\n\r\n```python\r\nfrom selenium_driverless.sync import webdriver\r\nfrom selenium_driverless import webdriver\r\nimport asyncio\r\n\r\n\r\nasync def main():\r\n options = webdriver.ChromeOptions()\r\n async with webdriver.Chrome(options=options) as driver:\r\n await driver.get('chrome://version')\r\n script = \"\"\"\r\n const proxy = new Proxy(document.documentElement, {\r\n get(target, prop, receiver) {\r\n if(prop === \"outerHTML\"){\r\n console.log('detected access on \"'+prop+'\"', receiver)\r\n return \"mocked value:)\"\r\n }\r\n else{return Reflect.get(...arguments)}\r\n },\r\n });\r\n Object.defineProperty(document, \"documentElement\", {\r\n value: proxy\r\n })\r\n \"\"\"\r\n await driver.execute_script(script)\r\n src = await driver.execute_script(\"return document.documentElement.outerHTML\", unique_context=True)\r\n mocked = await driver.execute_script(\"return document.documentElement.outerHTML\", unique_context=False)\r\n print(src, mocked)\r\n\r\n\r\nasyncio.run(main())\r\n```\r\n\r\n</details>\r\n\r\n### Pointer Interaction\r\nsee [@master/dev/show_mousemove.py](https://github.com/kaliiiiiiiiii/Selenium-Driverless/blob/master/dev/show_mousemove.py) for visualization\r\n\r\n```python\r\npointer = driver.current_pointer\r\nmove_kwargs = {\"total_time\": 0.7, \"accel\": 2, \"smooth_soft\": 20}\r\n\r\nawait pointer.move_to(100, 500)\r\nawait pointer.click(500, 50, move_kwargs=move_kwargs, move_to=True)\r\n```\r\n### Iframes / Frames\r\ndue `swtich_to.frame()` being deprecated for driverless, use this instead\r\n\r\n```python\r\niframes = await driver.find_elements(By.TAG_NAME, \"iframe\")\r\nawait asyncio.sleep(0.5)\r\niframe_document = await iframes[0].content_document\r\n# iframe_document.find_elements(...)\r\n```\r\n\r\n### use preferences\r\n```python\r\nfrom selenium_driverless import webdriver\r\noptions = webdriver.ChromeOptions()\r\n\r\n # recommended usage\r\noptions.update_pref(\"download.prompt_for_download\", False)\r\n# or\r\noptions.prefs.update({\"download\": {\"prompt_for_download\": False}})\r\n\r\n# supported\r\noptions.add_experimental_option(\"prefs\", {\"download.prompt_for_download\": False})\r\n```\r\n\r\n### Multiple Contexts\r\n- different cookies for each context\r\n- A context can have multiple windows and tabs within\r\n- different proxy for each context\r\n- opens as a window as incognito\r\n<details>\r\n<summary>Example Code (Click to expand)</summary>\r\n\r\n```python\r\nfrom selenium_driverless import webdriver\r\nimport asyncio\r\n\r\n\r\nasync def main():\r\n options = webdriver.ChromeOptions()\r\n async with webdriver.Chrome(options=options) as driver:\r\n context_1 = driver.current_context\r\n \r\n await driver.set_auth(\"username\", \"password\", \"localhost:5000\")\r\n # proxy not supported on windows due to https://bugs.chromium.org/p/chromium/issues/detail?id=1310057\r\n context_2 = await driver.new_context(proxy_bypass_list=[\"localhost\"], proxy_server=\"http://localhost:5000\")\r\n \r\n await context_1.current_target.get(\"https://examle.com\")\r\n await context_2.get(\"https://examle.com\")\r\n input(\"press ENTER to exit:)\")\r\n\r\n\r\nasyncio.run(main())\r\n```\r\n</details>\r\n\r\n#### Custom exception handling\r\nYou can implement custom exception handling as following\r\n\r\n```python\r\nimport selenium_driverless\r\nimport sys\r\nhandler = (lambda e: print(f'Exception in event-handler:\\n{e.__class__.__module__}.{e.__class__.__name__}: {e}',\r\n file=sys.stderr))\r\nsys.modules[\"selenium_driverless\"].EXC_HANDLER = handler\r\nsys.modules[\"cdp_socket\"].EXC_HANDLER = handler\r\n```\r\n\r\n## Help\r\n\r\nYou found a bug? Feel free to open an issue:)\r\nYou've got other questions or proposials? feel free to join the [Driverless-Community](https://discord.com/invite/MzZZjr2ZM3) on **Discord** or open a discusion\\\r\n\r\n## Copyright and Author\r\n[Aurin Aegerter](mailto:aurinliun@gmx.ch) (aka **Steve**)\r\n\r\n## License\r\n\r\n[![CC BY-NC-SA 4.0][cc-by-nc-sa-shield]][cc-by-nc-sa]\r\n\r\nThis work is licensed under a\r\n[Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License][cc-by-nc-sa] with an **addition for `Section 1(k)`** in the [LEGAL CODE](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.en):\r\n\r\n> Commercial means primarily intended for or directed \r\n> towards commercial advantage or monetary compensation. \\\r\n> A business, project or public agreement with a commercial intent of any kind\r\n> which profits more than, or equal to 7'000 US-Dollar per month,\r\n> or any monetary equivalent to that, is not subject to this definition\r\n> of NonCommercial.\r\n\r\n[cc-by-nc-sa]: http://creativecommons.org/licenses/by-nc-sa/4.0/\r\n[cc-by-nc-sa-image]: https://licensebuttons.net/l/by-nc-sa/4.0/88x31.png\r\n[cc-by-nc-sa-shield]: https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg\r\n\r\n--- \r\nIf you wish to use this project commercially, you can contact the author for a custom License.\r\nThis usually includes a fee of around 5-6% based on your current profit.\r\n\r\n## Disclaimer\r\n\r\nThis project is meant for **educational purposes only**. Use it responsibly. \\\r\n**The Author** does **not provide any warranty** and is **not liable** in any way for what or how it gets used.\r\n\r\n## Acknowledgments\r\n\r\nInspiration, code snippets, etc.\r\n* [selenium_driverless/utils/find_chrome_executable](https://github.com/ultrafunkamsterdam/undetected-chromedriver/blob/1c704a71cf4f29181a59ecf19ddff32f1b4fbfc0/undetected_chromedriver/__init__.py#L844)\r\n* [cdp-socket](https://github.com/kaliiiiiiiiii/CDP-Socket)\r\n* [jsobject](https://pypi.org/project/jsobject/)\r\n* [pycdp/browser.py](https://github.com/HMaker/python-cdp/blob/master/pycdp/browser.py)\r\n",
"bugtrack_url": null,
"license": "https://github.com/kaliiiiiiiiii/Selenium-Driverless/blob/master/LICENSE.md",
"summary": "Undetected selenium without chromedriver usage (Non-commercial use only!)",
"version": "1.9.4",
"project_urls": {
"Bug Reports": "https://github.com/kaliiiiiiiiii/Selenium-Driverless/issues",
"Documentation": "https://github.com/kaliiiiiiiiii/Selenium-Driverless",
"Homepage": "https://github.com/kaliiiiiiiiii/Selenium-Driverless",
"LICENSE": "https://github.com/kaliiiiiiiiii/Selenium-Driverless/blob/master/LICENSE.md",
"Source Code": "https://github.com/kaliiiiiiiiii/Selenium-Driverless"
},
"split_keywords": [
"selenium",
" webautomation"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "5e923fcf637eebbc334543de61b319c4f00d01526053edf33c2f25aa08f05c13",
"md5": "b9e00054fe56d1df3c7e0fa36d49d668",
"sha256": "151ccf57d399691ec4e943a941a496dbe575d0154a520cc2eca988ebe5d07a76"
},
"downloads": -1,
"filename": "selenium_driverless-1.9.4.tar.gz",
"has_sig": false,
"md5_digest": "b9e00054fe56d1df3c7e0fa36d49d668",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 90220,
"upload_time": "2024-10-22T01:41:19",
"upload_time_iso_8601": "2024-10-22T01:41:19.487936Z",
"url": "https://files.pythonhosted.org/packages/5e/92/3fcf637eebbc334543de61b319c4f00d01526053edf33c2f25aa08f05c13/selenium_driverless-1.9.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-10-22 01:41:19",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "kaliiiiiiiiii",
"github_project": "Selenium-Driverless",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "selenium-driverless"
}