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.
Files changed (91) hide show
  1. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/PKG-INFO +8 -8
  2. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/README.md +7 -7
  3. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/chromium/base.py +3 -0
  4. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/connection/managers/events_manager.py +6 -4
  5. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/interactions/scroll.py +25 -2
  6. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pyproject.toml +1 -1
  7. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/LICENSE +0 -0
  8. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/__init__.py +0 -0
  9. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/__init__.py +0 -0
  10. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/chromium/__init__.py +0 -0
  11. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/chromium/chrome.py +0 -0
  12. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/chromium/edge.py +0 -0
  13. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/interfaces.py +0 -0
  14. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/managers/__init__.py +0 -0
  15. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/managers/browser_options_manager.py +0 -0
  16. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/managers/browser_process_manager.py +0 -0
  17. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/managers/proxy_manager.py +0 -0
  18. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/managers/temp_dir_manager.py +0 -0
  19. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/options.py +0 -0
  20. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/requests/__init__.py +0 -0
  21. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/requests/request.py +0 -0
  22. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/requests/response.py +0 -0
  23. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/browser/tab.py +0 -0
  24. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/__init__.py +0 -0
  25. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/browser_commands.py +0 -0
  26. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/dom_commands.py +0 -0
  27. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/fetch_commands.py +0 -0
  28. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/input_commands.py +0 -0
  29. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/network_commands.py +0 -0
  30. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/page_commands.py +0 -0
  31. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/runtime_commands.py +0 -0
  32. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/storage_commands.py +0 -0
  33. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/commands/target_commands.py +0 -0
  34. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/connection/__init__.py +0 -0
  35. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/connection/connection_handler.py +0 -0
  36. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/connection/managers/__init__.py +0 -0
  37. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/connection/managers/commands_manager.py +0 -0
  38. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/constants.py +0 -0
  39. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/decorators.py +0 -0
  40. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/elements/__init__.py +0 -0
  41. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/elements/mixins/__init__.py +0 -0
  42. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/elements/mixins/find_elements_mixin.py +0 -0
  43. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/elements/web_element.py +0 -0
  44. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/exceptions.py +0 -0
  45. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/interactions/__init__.py +0 -0
  46. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/interactions/iframe.py +0 -0
  47. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/interactions/keyboard.py +0 -0
  48. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/__init__.py +0 -0
  49. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/base.py +0 -0
  50. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/browser/__init__.py +0 -0
  51. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/browser/events.py +0 -0
  52. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/browser/methods.py +0 -0
  53. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/browser/types.py +0 -0
  54. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/debugger/types.py +0 -0
  55. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/dom/__init__.py +0 -0
  56. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/dom/events.py +0 -0
  57. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/dom/methods.py +0 -0
  58. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/dom/types.py +0 -0
  59. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/emulation/types.py +0 -0
  60. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/fetch/__init__.py +0 -0
  61. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/fetch/events.py +0 -0
  62. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/fetch/methods.py +0 -0
  63. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/fetch/types.py +0 -0
  64. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/input/__init__.py +0 -0
  65. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/input/events.py +0 -0
  66. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/input/methods.py +0 -0
  67. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/input/types.py +0 -0
  68. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/io/types.py +0 -0
  69. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/network/__init__.py +0 -0
  70. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/network/events.py +0 -0
  71. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/network/methods.py +0 -0
  72. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/network/types.py +0 -0
  73. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/page/__init__.py +0 -0
  74. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/page/events.py +0 -0
  75. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/page/methods.py +0 -0
  76. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/page/types.py +0 -0
  77. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/runtime/__init__.py +0 -0
  78. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/runtime/events.py +0 -0
  79. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/runtime/methods.py +0 -0
  80. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/runtime/types.py +0 -0
  81. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/security/types.py +0 -0
  82. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/storage/__init__.py +0 -0
  83. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/storage/events.py +0 -0
  84. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/storage/methods.py +0 -0
  85. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/storage/types.py +0 -0
  86. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/target/__init__.py +0 -0
  87. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/target/events.py +0 -0
  88. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/target/methods.py +0 -0
  89. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/protocol/target/types.py +0 -0
  90. {pydoll_python-2.13.0 → pydoll_python-2.14.0}/pydoll/py.typed +0 -0
  91. {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.13.0
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>🆕 What's New</b></summary>
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
- ### Humanized Scroll with Physics Engine (`humanize=True`)
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>🆕 What's New</b></summary>
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
- ### Humanized Scroll with Physics Engine (`humanize=True`)
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 JavascriptDialogOpeningEvent
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(method='')
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(method='')
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 * 10
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 * 10
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.13.0"
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