# PlaywrightSafeThread
use [playwright](https://github.com/microsoft/playwright-python) as async and sync safe thread
used in [WPP_Whatsapp](https://github.com/3mora2/WPP_Whatsapp)
use sync in only one at time, else use async
in events like `page.on` use async and wait
from [minet](https://github.com/medialab/minet/blob/master/minet/browser/threadsafe_browser.py)
### Installation
```
pip install PlaywrightSafeThread
```
```
pip install git+https://www.github.com/3mora2/PlaywrightSafeThread@main
```
### Example
- to run async method in like page, user `await th.create_task` or `th.run_threadsafe`
- can't run async method from page outside ThreadsafeBrowser Loop, use `await th.create_task`
- can't run method `run_threadsafe` in ThreadsafeBrowser Loop
#### Sync
```python
from PlaywrightSafeThread import ThreadsafeBrowser
th = ThreadsafeBrowser(
install=False,
no_context=False,
browser="chromium", channel="chrome", headless=False,
no_viewport=True, bypass_csp=True
)
th.goto_sync("https://web.whatsapp.com/", wait_until="networkidle")
# or
th.run_threadsafe(th.page.goto("https://web.whatsapp.com/", wait_until="networkidle"))
th.sync_close()
```
#### Async
Use asyncio.run
```python
import asyncio
from PlaywrightSafeThread import ThreadsafeBrowser
async def main():
th = ThreadsafeBrowser(
install=False,
no_context=False,
browser="chromium", channel="chrome", headless=False,
no_viewport=True, bypass_csp=True, # loop=loop
)
# Work Only When start from th loop, not in (asyncio.run(main()))
# await th.page.goto("https://web.whatsapp.com/", wait_until="networkidle")
await th.goto("https://web.whatsapp.com/")
# or
await th.create_task(
th.page.goto("https://web.whatsapp.com/")
)
# Not Work when start from th loop, work in only (asyncio.run(main()))
th.goto_sync("https://web.whatsapp.com/", wait_until="networkidle")
await th.close()
asyncio.run(main())
```
Use ThreadsafeBrowser.loop
```python
import asyncio
from PlaywrightSafeThread import ThreadsafeBrowser
th = ThreadsafeBrowser(
install=False,
no_context=False,
browser="chromium", channel="chrome", headless=False,
no_viewport=True, bypass_csp=True, # loop=loop
)
loop = th.loop
async def main():
await th.page.goto("https://web.whatsapp.com/", wait_until="networkidle")
await th.create_task(
th.page.goto("https://web.whatsapp.com/")
)
await th.goto("https://web.whatsapp.com/")
# Not Work when start from th loop, work in only (asyncio.run(main()))
# th.goto_sync("https://web.whatsapp.com/", wait_until="networkidle")
await th.close()
task = asyncio.run_coroutine_threadsafe(main(), loop=loop)
task.result()
```
Raw data
{
"_id": null,
"home_page": "https://github.com/3mora2/PlaywrightSafeThread",
"name": "PlaywrightSafeThread",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": null,
"author": "Ammar Alkotb",
"author_email": "ammar.alkotb@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/41/f2/af2b7493f6584b96c8b3f24487cb0c581fc44a7458a57eba93daffdfb63d/playwrightsafethread-0.5.5.tar.gz",
"platform": null,
"description": "# PlaywrightSafeThread\nuse [playwright](https://github.com/microsoft/playwright-python) as async and sync safe thread\n\nused in [WPP_Whatsapp](https://github.com/3mora2/WPP_Whatsapp)\n\nuse sync in only one at time, else use async\n\nin events like `page.on` use async and wait\n\nfrom [minet](https://github.com/medialab/minet/blob/master/minet/browser/threadsafe_browser.py)\n\n### Installation\n```\npip install PlaywrightSafeThread\n```\n```\npip install git+https://www.github.com/3mora2/PlaywrightSafeThread@main\n```\n\n\n\n### Example\n\n- to run async method in like page, user `await th.create_task` or `th.run_threadsafe`\n- can't run async method from page outside ThreadsafeBrowser Loop, use `await th.create_task`\n- can't run method `run_threadsafe` in ThreadsafeBrowser Loop\n\n#### Sync\n\n```python\nfrom PlaywrightSafeThread import ThreadsafeBrowser\n\n\nth = ThreadsafeBrowser(\n install=False,\n no_context=False,\n browser=\"chromium\", channel=\"chrome\", headless=False,\n no_viewport=True, bypass_csp=True\n)\nth.goto_sync(\"https://web.whatsapp.com/\", wait_until=\"networkidle\")\n# or\nth.run_threadsafe(th.page.goto(\"https://web.whatsapp.com/\", wait_until=\"networkidle\"))\nth.sync_close()\n```\n\n#### Async\n\nUse asyncio.run\n```python\nimport asyncio\nfrom PlaywrightSafeThread import ThreadsafeBrowser\n\n\n\n\nasync def main():\n \n th = ThreadsafeBrowser(\n install=False,\n no_context=False,\n browser=\"chromium\", channel=\"chrome\", headless=False,\n no_viewport=True, bypass_csp=True, # loop=loop\n )\n \n # Work Only When start from th loop, not in (asyncio.run(main()))\n # await th.page.goto(\"https://web.whatsapp.com/\", wait_until=\"networkidle\")\n\n await th.goto(\"https://web.whatsapp.com/\")\n # or \n\n await th.create_task(\n th.page.goto(\"https://web.whatsapp.com/\")\n )\n\n\n # Not Work when start from th loop, work in only (asyncio.run(main()))\n th.goto_sync(\"https://web.whatsapp.com/\", wait_until=\"networkidle\")\n\n await th.close()\n\nasyncio.run(main())\n```\n\nUse ThreadsafeBrowser.loop\n```python\nimport asyncio\nfrom PlaywrightSafeThread import ThreadsafeBrowser\n\n\nth = ThreadsafeBrowser(\n install=False,\n no_context=False,\n browser=\"chromium\", channel=\"chrome\", headless=False,\n no_viewport=True, bypass_csp=True, # loop=loop\n)\nloop = th.loop\n\n\nasync def main():\n \n await th.page.goto(\"https://web.whatsapp.com/\", wait_until=\"networkidle\")\n\n await th.create_task(\n th.page.goto(\"https://web.whatsapp.com/\")\n )\n await th.goto(\"https://web.whatsapp.com/\")\n\n # Not Work when start from th loop, work in only (asyncio.run(main()))\n # th.goto_sync(\"https://web.whatsapp.com/\", wait_until=\"networkidle\")\n\n await th.close()\n\n\ntask = asyncio.run_coroutine_threadsafe(main(), loop=loop)\ntask.result()\n```\n",
"bugtrack_url": null,
"license": "MIT License",
"summary": "PlaywrightSafeThread",
"version": "0.5.5",
"project_urls": {
"Bug Report": "https://github.com/3mora2/PlaywrightSafeThread/issues/new",
"Homepage": "https://github.com/3mora2/PlaywrightSafeThread"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "35aed86abb887a6b908942786811d4f2daefe0f5d11a16484d286c67f990375f",
"md5": "ea7db50e284b28d9550926bd19ea7aaf",
"sha256": "6225a7cb55d1661c334fa034c4f270f018e455f67badf5af12031469f31091a5"
},
"downloads": -1,
"filename": "PlaywrightSafeThread-0.5.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "ea7db50e284b28d9550926bd19ea7aaf",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 12251,
"upload_time": "2024-07-22T10:09:04",
"upload_time_iso_8601": "2024-07-22T10:09:04.769774Z",
"url": "https://files.pythonhosted.org/packages/35/ae/d86abb887a6b908942786811d4f2daefe0f5d11a16484d286c67f990375f/PlaywrightSafeThread-0.5.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "41f2af2b7493f6584b96c8b3f24487cb0c581fc44a7458a57eba93daffdfb63d",
"md5": "51c7d2ec0183a557800124ee5a297c24",
"sha256": "8bb25cdec2a4c6c6b8a1c784f37028ee1d6d3c4b505b76c041eeada9cbc2c880"
},
"downloads": -1,
"filename": "playwrightsafethread-0.5.5.tar.gz",
"has_sig": false,
"md5_digest": "51c7d2ec0183a557800124ee5a297c24",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 12083,
"upload_time": "2024-07-22T10:09:06",
"upload_time_iso_8601": "2024-07-22T10:09:06.150460Z",
"url": "https://files.pythonhosted.org/packages/41/f2/af2b7493f6584b96c8b3f24487cb0c581fc44a7458a57eba93daffdfb63d/playwrightsafethread-0.5.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-07-22 10:09:06",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "3mora2",
"github_project": "PlaywrightSafeThread",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "playwrightsafethread"
}