Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions pydoll/browser/interfaces.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from abc import ABC, abstractmethod

from pydoll.constants import PageLoadState


class Options(ABC):
@property
Expand Down Expand Up @@ -36,6 +38,16 @@ def headless(self) -> bool:
def headless(self, headless: bool):
pass

@property
@abstractmethod
def page_load_state(self) -> PageLoadState:
pass

@page_load_state.setter
@abstractmethod
def page_load_state(self, state: PageLoadState):
pass


class BrowserOptionsManager(ABC):
@abstractmethod
Expand Down
10 changes: 10 additions & 0 deletions pydoll/browser/options.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from contextlib import suppress

from pydoll.browser.interfaces import Options
from pydoll.constants import PageLoadState
from pydoll.exceptions import (
ArgumentAlreadyExistsInOptions,
ArgumentNotFoundInOptions,
Expand Down Expand Up @@ -28,6 +29,7 @@ def __init__(self):
self._start_timeout = 10
self._browser_preferences = {}
self._headless = False
self._page_load_state = PageLoadState.COMPLETE

@property
def arguments(self) -> list[str]:
Expand Down Expand Up @@ -316,3 +318,11 @@ def headless(self, headless: bool):
if headless == has_argument:
return
methods_map[headless]('--headless')

@property
def page_load_state(self) -> PageLoadState:
return self._page_load_state

@page_load_state.setter
def page_load_state(self, state: PageLoadState):
self._page_load_state = state
5 changes: 4 additions & 1 deletion pydoll/browser/tab.py
Original file line number Diff line number Diff line change
Expand Up @@ -1044,7 +1044,10 @@ async def _wait_page_load(self, timeout: int = 300):
response: EvaluateResponse = await self._execute_command(
RuntimeCommands.evaluate(expression='document.readyState')
)
if response['result']['result']['value'] == 'complete':
if (
response['result']['result']['value']
== self._browser.options.page_load_state.value
):
break
if asyncio.get_event_loop().time() - start_time > timeout:
raise WaitElementTimeout('Page load timed out')
Expand Down
5 changes: 5 additions & 0 deletions pydoll/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ class By(str, Enum):
NAME = 'name'


class PageLoadState(str, Enum):
COMPLETE = 'complete'
INTERACTIVE = 'interactive'


class Scripts:
ELEMENT_VISIBLE = """
function() {
Expand Down
20 changes: 20 additions & 0 deletions tests/test_browser/test_browser_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from pydoll.browser.interfaces import Options as OptionsInterface
from pydoll.browser.options import ChromiumOptions as Options
from pydoll.constants import PageLoadState
from pydoll.exceptions import (
ArgumentAlreadyExistsInOptions,
ArgumentNotFoundInOptions,
Expand Down Expand Up @@ -31,6 +32,17 @@ def test_set_start_timeout():
assert options.start_timeout == 30


def test_initial_page_load_state():
options = Options()
assert options.page_load_state == PageLoadState.COMPLETE


def test_set_page_load_state():
options = Options()
options.page_load_state = PageLoadState.INTERACTIVE
assert options.page_load_state == PageLoadState.INTERACTIVE


def test_add_argument():
options = Options()
options.add_argument('--headless')
Expand Down Expand Up @@ -225,6 +237,14 @@ def browser_preferences(self):
def headless(self):
return False

@property
def page_load_state(self):
return PageLoadState.COMPLETE

@page_load_state.setter
def page_load_state(self, state):
pass

CompleteOptions()

def test_set_headless():
Expand Down
2 changes: 2 additions & 0 deletions tests/test_browser/test_browser_tab.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from unittest.mock import AsyncMock, MagicMock, patch, ANY
from pathlib import Path

from pydoll.browser.options import ChromiumOptions
from pydoll.protocol.network.types import ResourceType, RequestMethod
from pydoll.protocol.fetch.types import RequestStage
from pydoll.constants import By
Expand Down Expand Up @@ -45,6 +46,7 @@ async def mock_browser():
"""Mock browser instance."""
browser = MagicMock()
browser.close_tab = AsyncMock()
browser.options = ChromiumOptions()
return browser


Expand Down
Loading