Skip to content

Commit 9907af2

Browse files
authored
Merge pull request #253 from autoscrape-labs/codex/add-page_load_state-enum-to-options
feat: add configurable page load state
2 parents 7d68de9 + f649b4c commit 9907af2

File tree

6 files changed

+53
-1
lines changed

6 files changed

+53
-1
lines changed

pydoll/browser/interfaces.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from abc import ABC, abstractmethod
22

3+
from pydoll.constants import PageLoadState
4+
35

46
class Options(ABC):
57
@property
@@ -36,6 +38,16 @@ def headless(self) -> bool:
3638
def headless(self, headless: bool):
3739
pass
3840

41+
@property
42+
@abstractmethod
43+
def page_load_state(self) -> PageLoadState:
44+
pass
45+
46+
@page_load_state.setter
47+
@abstractmethod
48+
def page_load_state(self, state: PageLoadState):
49+
pass
50+
3951

4052
class BrowserOptionsManager(ABC):
4153
@abstractmethod

pydoll/browser/options.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from contextlib import suppress
22

33
from pydoll.browser.interfaces import Options
4+
from pydoll.constants import PageLoadState
45
from pydoll.exceptions import (
56
ArgumentAlreadyExistsInOptions,
67
ArgumentNotFoundInOptions,
@@ -28,6 +29,7 @@ def __init__(self):
2829
self._start_timeout = 10
2930
self._browser_preferences = {}
3031
self._headless = False
32+
self._page_load_state = PageLoadState.COMPLETE
3133

3234
@property
3335
def arguments(self) -> list[str]:
@@ -316,3 +318,11 @@ def headless(self, headless: bool):
316318
if headless == has_argument:
317319
return
318320
methods_map[headless]('--headless')
321+
322+
@property
323+
def page_load_state(self) -> PageLoadState:
324+
return self._page_load_state
325+
326+
@page_load_state.setter
327+
def page_load_state(self, state: PageLoadState):
328+
self._page_load_state = state

pydoll/browser/tab.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,10 @@ async def _wait_page_load(self, timeout: int = 300):
10441044
response: EvaluateResponse = await self._execute_command(
10451045
RuntimeCommands.evaluate(expression='document.readyState')
10461046
)
1047-
if response['result']['result']['value'] == 'complete':
1047+
if (
1048+
response['result']['result']['value']
1049+
== self._browser.options.page_load_state.value
1050+
):
10481051
break
10491052
if asyncio.get_event_loop().time() - start_time > timeout:
10501053
raise WaitElementTimeout('Page load timed out')

pydoll/constants.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ class By(str, Enum):
1010
NAME = 'name'
1111

1212

13+
class PageLoadState(str, Enum):
14+
COMPLETE = 'complete'
15+
INTERACTIVE = 'interactive'
16+
17+
1318
class Scripts:
1419
ELEMENT_VISIBLE = """
1520
function() {

tests/test_browser/test_browser_options.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from pydoll.browser.interfaces import Options as OptionsInterface
44
from pydoll.browser.options import ChromiumOptions as Options
5+
from pydoll.constants import PageLoadState
56
from pydoll.exceptions import (
67
ArgumentAlreadyExistsInOptions,
78
ArgumentNotFoundInOptions,
@@ -31,6 +32,17 @@ def test_set_start_timeout():
3132
assert options.start_timeout == 30
3233

3334

35+
def test_initial_page_load_state():
36+
options = Options()
37+
assert options.page_load_state == PageLoadState.COMPLETE
38+
39+
40+
def test_set_page_load_state():
41+
options = Options()
42+
options.page_load_state = PageLoadState.INTERACTIVE
43+
assert options.page_load_state == PageLoadState.INTERACTIVE
44+
45+
3446
def test_add_argument():
3547
options = Options()
3648
options.add_argument('--headless')
@@ -225,6 +237,14 @@ def browser_preferences(self):
225237
def headless(self):
226238
return False
227239

240+
@property
241+
def page_load_state(self):
242+
return PageLoadState.COMPLETE
243+
244+
@page_load_state.setter
245+
def page_load_state(self, state):
246+
pass
247+
228248
CompleteOptions()
229249

230250
def test_set_headless():

tests/test_browser/test_browser_tab.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from unittest.mock import AsyncMock, MagicMock, patch, ANY
77
from pathlib import Path
88

9+
from pydoll.browser.options import ChromiumOptions
910
from pydoll.protocol.network.types import ResourceType, RequestMethod
1011
from pydoll.protocol.fetch.types import RequestStage
1112
from pydoll.constants import By
@@ -45,6 +46,7 @@ async def mock_browser():
4546
"""Mock browser instance."""
4647
browser = MagicMock()
4748
browser.close_tab = AsyncMock()
49+
browser.options = ChromiumOptions()
4850
return browser
4951

5052

0 commit comments

Comments
 (0)