pydoll-python 2.13.0__tar.gz → 2.14.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/PKG-INFO +8 -8
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/README.md +7 -7
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/chromium/base.py +3 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/connection/managers/events_manager.py +6 -4
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/interactions/scroll.py +25 -2
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pyproject.toml +1 -1
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/LICENSE +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/chromium/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/chromium/chrome.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/chromium/edge.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/interfaces.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/managers/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/managers/browser_options_manager.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/managers/browser_process_manager.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/managers/proxy_manager.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/managers/temp_dir_manager.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/options.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/requests/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/requests/request.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/requests/response.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/tab.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/browser_commands.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/dom_commands.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/fetch_commands.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/input_commands.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/network_commands.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/page_commands.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/runtime_commands.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/storage_commands.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/target_commands.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/connection/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/connection/connection_handler.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/connection/managers/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/connection/managers/commands_manager.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/constants.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/decorators.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/elements/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/elements/mixins/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/elements/mixins/find_elements_mixin.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/elements/web_element.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/exceptions.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/interactions/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/interactions/iframe.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/interactions/keyboard.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/base.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/browser/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/browser/events.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/browser/methods.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/browser/types.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/debugger/types.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/dom/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/dom/events.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/dom/methods.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/dom/types.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/emulation/types.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/fetch/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/fetch/events.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/fetch/methods.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/fetch/types.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/input/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/input/events.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/input/methods.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/input/types.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/io/types.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/network/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/network/events.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/network/methods.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/network/types.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/page/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/page/events.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/page/methods.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/page/types.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/runtime/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/runtime/events.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/runtime/methods.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/runtime/types.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/security/types.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/storage/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/storage/events.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/storage/methods.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/storage/types.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/target/__init__.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/target/events.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/target/methods.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/target/types.py +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/py.typed +0 -0
- {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pydoll-python
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.14.0
|
|
4
4
|
Summary: Pydoll is a library for automating chromium-based browsers without a WebDriver, offering realistic interactions.
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Author: Thalison Fernandes
|
|
@@ -59,12 +59,12 @@ pip install pydoll-python
|
|
|
59
59
|
```
|
|
60
60
|
That's it. No `webdrivers`. No external dependencies.
|
|
61
61
|
|
|
62
|
+
## 🆕 What's New
|
|
63
|
+
|
|
62
64
|
<details>
|
|
63
|
-
<summary><b
|
|
65
|
+
<summary><b>Humanized Keyboard Input (<code>humanize=True</code>)</b></summary>
|
|
64
66
|
<br>
|
|
65
67
|
|
|
66
|
-
### Humanized Keyboard Input (`humanize=True`)
|
|
67
|
-
|
|
68
68
|
Pydoll now includes a **humanized typing engine** that simulates realistic human typing behavior:
|
|
69
69
|
|
|
70
70
|
- **Variable keystroke timing**: 30-120ms between keys (not fixed intervals)
|
|
@@ -78,10 +78,11 @@ await element.type_text("hello", interval=0.1)
|
|
|
78
78
|
# New way (human-like, anti-bot)
|
|
79
79
|
await element.type_text("hello", humanize=True)
|
|
80
80
|
```
|
|
81
|
+
</details>
|
|
81
82
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
<details>
|
|
84
|
+
<summary><b>Humanized Scroll with Physics Engine (<code>humanize=True</code>)</b></summary>
|
|
85
|
+
<br>
|
|
85
86
|
|
|
86
87
|
The scroll API now features a **Cubic Bezier curve physics engine** for realistic scrolling:
|
|
87
88
|
|
|
@@ -106,7 +107,6 @@ await tab.scroll.to_bottom(humanize=True)
|
|
|
106
107
|
| **Humanized** | `humanize=True` | **Anti-bot evasion** |
|
|
107
108
|
|
|
108
109
|
[**📖 Human-Like Interactions Docs**](https://pydoll.tech/docs/features/automation/human-interactions/)
|
|
109
|
-
|
|
110
110
|
</details>
|
|
111
111
|
|
|
112
112
|
## 🚀 Getting Started in 60 Seconds
|
|
@@ -39,12 +39,12 @@ pip install pydoll-python
|
|
|
39
39
|
```
|
|
40
40
|
That's it. No `webdrivers`. No external dependencies.
|
|
41
41
|
|
|
42
|
+
## 🆕 What's New
|
|
43
|
+
|
|
42
44
|
<details>
|
|
43
|
-
<summary><b
|
|
45
|
+
<summary><b>Humanized Keyboard Input (<code>humanize=True</code>)</b></summary>
|
|
44
46
|
<br>
|
|
45
47
|
|
|
46
|
-
### Humanized Keyboard Input (`humanize=True`)
|
|
47
|
-
|
|
48
48
|
Pydoll now includes a **humanized typing engine** that simulates realistic human typing behavior:
|
|
49
49
|
|
|
50
50
|
- **Variable keystroke timing**: 30-120ms between keys (not fixed intervals)
|
|
@@ -58,10 +58,11 @@ await element.type_text("hello", interval=0.1)
|
|
|
58
58
|
# New way (human-like, anti-bot)
|
|
59
59
|
await element.type_text("hello", humanize=True)
|
|
60
60
|
```
|
|
61
|
+
</details>
|
|
61
62
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
<details>
|
|
64
|
+
<summary><b>Humanized Scroll with Physics Engine (<code>humanize=True</code>)</b></summary>
|
|
65
|
+
<br>
|
|
65
66
|
|
|
66
67
|
The scroll API now features a **Cubic Bezier curve physics engine** for realistic scrolling:
|
|
67
68
|
|
|
@@ -86,7 +87,6 @@ await tab.scroll.to_bottom(humanize=True)
|
|
|
86
87
|
| **Humanized** | `humanize=True` | **Anti-bot evasion** |
|
|
87
88
|
|
|
88
89
|
[**📖 Human-Like Interactions Docs**](https://pydoll.tech/docs/features/automation/human-interactions/)
|
|
89
|
-
|
|
90
90
|
</details>
|
|
91
91
|
|
|
92
92
|
## 🚀 Getting Started in 60 Seconds
|
|
@@ -357,6 +357,9 @@ class Browser(ABC): # noqa: PLR0904
|
|
|
357
357
|
)
|
|
358
358
|
return existing_tabs + new_tabs
|
|
359
359
|
|
|
360
|
+
async def get_tab_by_target(self, target: TargetInfo) -> Tab:
|
|
361
|
+
return Tab(self, **self._get_tab_kwargs(target['targetId']))
|
|
362
|
+
|
|
360
363
|
async def set_download_path(self, path: str, browser_context_id: Optional[str] = None):
|
|
361
364
|
"""Set download directory path (convenience method for set_download_behavior)."""
|
|
362
365
|
logger.info(f'Setting download path: {path} (context={browser_context_id})')
|
|
@@ -4,14 +4,16 @@ import asyncio
|
|
|
4
4
|
import logging
|
|
5
5
|
from typing import TYPE_CHECKING, cast
|
|
6
6
|
|
|
7
|
-
from pydoll.protocol.page.events import
|
|
7
|
+
from pydoll.protocol.page.events import (
|
|
8
|
+
JavascriptDialogOpeningEvent,
|
|
9
|
+
JavascriptDialogOpeningEventParams,
|
|
10
|
+
)
|
|
8
11
|
|
|
9
12
|
if TYPE_CHECKING:
|
|
10
13
|
from typing import Any, Callable
|
|
11
14
|
|
|
12
15
|
from pydoll.protocol.base import CDPEvent
|
|
13
16
|
from pydoll.protocol.network.events import RequestWillBeSentEvent
|
|
14
|
-
from pydoll.protocol.page.events import JavascriptDialogOpeningEventParams
|
|
15
17
|
|
|
16
18
|
logger = logging.getLogger(__name__)
|
|
17
19
|
|
|
@@ -29,7 +31,7 @@ class EventsManager:
|
|
|
29
31
|
self._event_callbacks: dict[int, dict] = {}
|
|
30
32
|
self._callback_id = 0
|
|
31
33
|
self.network_logs: list[RequestWillBeSentEvent] = []
|
|
32
|
-
self.dialog = JavascriptDialogOpeningEvent(
|
|
34
|
+
self.dialog = JavascriptDialogOpeningEvent() # type: ignore
|
|
33
35
|
logger.info('EventsManager initialized')
|
|
34
36
|
logger.debug('Initial state: callbacks=0, logs=0, dialog=empty')
|
|
35
37
|
|
|
@@ -96,7 +98,7 @@ class EventsManager:
|
|
|
96
98
|
)
|
|
97
99
|
|
|
98
100
|
if 'Page.javascriptDialogClosed' in event_name:
|
|
99
|
-
self.dialog = JavascriptDialogOpeningEvent(
|
|
101
|
+
self.dialog = JavascriptDialogOpeningEvent() # type: ignore
|
|
100
102
|
|
|
101
103
|
await self._trigger_callbacks(event_name, event_data)
|
|
102
104
|
|
|
@@ -206,6 +206,13 @@ class Scroll:
|
|
|
206
206
|
"""
|
|
207
207
|
max_flick_distance = random.uniform(600, 1200)
|
|
208
208
|
min_remaining_threshold = 30
|
|
209
|
+
min_stuck_threshold = 5
|
|
210
|
+
min_flick_distance = 100
|
|
211
|
+
|
|
212
|
+
# Failsafe for stuck scroll
|
|
213
|
+
last_remaining = float('inf')
|
|
214
|
+
stuck_counter = 0
|
|
215
|
+
max_stuck_attempts = 10
|
|
209
216
|
|
|
210
217
|
while True:
|
|
211
218
|
if position == ScrollPosition.DOWN:
|
|
@@ -216,7 +223,23 @@ class Scroll:
|
|
|
216
223
|
if remaining <= min_remaining_threshold:
|
|
217
224
|
break
|
|
218
225
|
|
|
226
|
+
# Check if we are stuck
|
|
227
|
+
has_progressed = abs(remaining - last_remaining) >= min_stuck_threshold
|
|
228
|
+
|
|
229
|
+
if has_progressed:
|
|
230
|
+
stuck_counter = 0
|
|
231
|
+
|
|
232
|
+
if not has_progressed:
|
|
233
|
+
stuck_counter += 1
|
|
234
|
+
if stuck_counter >= max_stuck_attempts:
|
|
235
|
+
break
|
|
236
|
+
|
|
237
|
+
last_remaining = remaining
|
|
238
|
+
|
|
219
239
|
flick_distance = min(remaining, max_flick_distance)
|
|
240
|
+
if flick_distance < min_flick_distance and remaining > min_flick_distance:
|
|
241
|
+
flick_distance = min_flick_distance
|
|
242
|
+
|
|
220
243
|
await self._scroll_humanized(position, flick_distance)
|
|
221
244
|
|
|
222
245
|
pause = random.uniform(0.05, 0.15)
|
|
@@ -403,11 +426,11 @@ class Scroll:
|
|
|
403
426
|
if position in {ScrollPosition.UP, ScrollPosition.DOWN}:
|
|
404
427
|
axis = 'top'
|
|
405
428
|
scroll_distance = -distance if position == ScrollPosition.UP else distance
|
|
406
|
-
return axis, scroll_distance
|
|
429
|
+
return axis, scroll_distance
|
|
407
430
|
|
|
408
431
|
axis = 'left'
|
|
409
432
|
scroll_distance = -distance if position == ScrollPosition.LEFT else distance
|
|
410
|
-
return axis, scroll_distance
|
|
433
|
+
return axis, scroll_distance
|
|
411
434
|
|
|
412
435
|
@staticmethod
|
|
413
436
|
def _get_behavior(smooth: bool) -> str:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "pydoll-python"
|
|
3
|
-
version = "2.
|
|
3
|
+
version = "2.14.0"
|
|
4
4
|
description = "Pydoll is a library for automating chromium-based browsers without a WebDriver, offering realistic interactions."
|
|
5
5
|
authors = ["Thalison Fernandes <thalissfernandes99@gmail.com>"]
|
|
6
6
|
readme = "README.md"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/managers/browser_options_manager.py
RENAMED
|
File without changes
|
{pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/managers/browser_process_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/connection/managers/commands_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|