Skip to content
Open
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):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe you could add a log warning the user if its setting interactive mode.
something like this: "Running code at 'interactive' state may cause issues — CSS, images, or external scripts might not be fully loaded yet."

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 @@ -1065,7 +1065,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
Loading