Skip to content

Commit 3939649

Browse files
cgoldbergnavin772
andauthored
[py][bidi] Allow resetting viewport (#16623)
Co-authored-by: Navin Chandra <navinchandra772@gmail.com>
1 parent 95969c5 commit 3939649

File tree

2 files changed

+88
-21
lines changed

2 files changed

+88
-21
lines changed

py/selenium/webdriver/common/bidi/browsing_context.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,13 @@
2020
from dataclasses import dataclass
2121
from typing import Any
2222

23+
from typing_extensions import Sentinel
24+
2325
from selenium.webdriver.common.bidi.common import command_builder
2426
from selenium.webdriver.common.bidi.session import Session
2527

28+
UNDEFINED = Sentinel("UNDEFINED")
29+
2630

2731
class ReadinessState:
2832
"""Represents the stage of document loading at which a navigation command will return."""
@@ -980,30 +984,38 @@ def reload(
980984
def set_viewport(
981985
self,
982986
context: str | None = None,
983-
viewport: dict | None = None,
984-
device_pixel_ratio: float | None = None,
987+
viewport: dict | None | UNDEFINED = UNDEFINED,
988+
device_pixel_ratio: float | None | UNDEFINED = UNDEFINED,
985989
user_contexts: list[str] | None = None,
986990
) -> None:
987991
"""Modifies specific viewport characteristics on the given top-level traversable.
988992
989993
Args:
990994
context: The browsing context ID.
991-
viewport: The viewport parameters.
992-
device_pixel_ratio: The device pixel ratio.
995+
viewport: The viewport parameters - {"width": <int>, "height": <int>} (`None` resets to default).
996+
device_pixel_ratio: The device pixel ratio (`None` resets to default).
993997
user_contexts: The user context IDs.
994998
995999
Raises:
996-
Exception: If the browsing context is not a top-level traversable.
1000+
Exception: If the browsing context is not a top-level traversable
1001+
ValueError: If neither `context` nor `user_contexts` is provided
1002+
ValueError: If both `context` and `user_contexts` are provided
9971003
"""
1004+
if context is not None and user_contexts is not None:
1005+
raise ValueError("Cannot specify both context and user_contexts")
1006+
1007+
if context is None and user_contexts is None:
1008+
raise ValueError("Must specify either context or user_contexts")
1009+
9981010
params: dict[str, Any] = {}
9991011
if context is not None:
10001012
params["context"] = context
1001-
if viewport is not None:
1013+
elif user_contexts is not None:
1014+
params["userContexts"] = user_contexts
1015+
if viewport is not UNDEFINED:
10021016
params["viewport"] = viewport
1003-
if device_pixel_ratio is not None:
1017+
if device_pixel_ratio is not UNDEFINED:
10041018
params["devicePixelRatio"] = device_pixel_ratio
1005-
if user_contexts is not None:
1006-
params["userContexts"] = user_contexts
10071019

10081020
self.conn.execute(command_builder("browsingContext.setViewport", params))
10091021

py/test/selenium/webdriver/common/bidi_browsing_context_tests.py

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -348,31 +348,86 @@ def test_set_viewport(driver, pages):
348348
context_id = driver.current_window_handle
349349
driver.get(pages.url("formPage.html"))
350350

351-
driver.browsing_context.set_viewport(context=context_id, viewport={"width": 250, "height": 300})
351+
try:
352+
driver.browsing_context.set_viewport(context=context_id, viewport={"width": 251, "height": 301})
352353

353-
viewport_size = driver.execute_script("return [window.innerWidth, window.innerHeight];")
354+
viewport_size = driver.execute_script("return [window.innerWidth, window.innerHeight];")
354355

355-
assert viewport_size[0] == 250
356-
assert viewport_size[1] == 300
356+
assert viewport_size[0] == 251
357+
assert viewport_size[1] == 301
358+
finally:
359+
driver.browsing_context.set_viewport(context=context_id, viewport=None, device_pixel_ratio=None)
357360

358361

359362
def test_set_viewport_with_device_pixel_ratio(driver, pages):
360363
"""Test setting the viewport with device pixel ratio."""
361364
context_id = driver.current_window_handle
362365
driver.get(pages.url("formPage.html"))
363366

364-
driver.browsing_context.set_viewport(
365-
context=context_id, viewport={"width": 250, "height": 300}, device_pixel_ratio=5
366-
)
367+
try:
368+
driver.browsing_context.set_viewport(
369+
context=context_id, viewport={"width": 252, "height": 302}, device_pixel_ratio=5
370+
)
371+
372+
viewport_size = driver.execute_script("return [window.innerWidth, window.innerHeight];")
373+
374+
assert viewport_size[0] == 252
375+
assert viewport_size[1] == 302
376+
377+
device_pixel_ratio = driver.execute_script("return window.devicePixelRatio")
378+
379+
assert device_pixel_ratio == 5
380+
finally:
381+
driver.browsing_context.set_viewport(context=context_id, viewport=None, device_pixel_ratio=None)
382+
383+
384+
def test_set_viewport_with_no_args_doesnt_change_values(driver, pages):
385+
"""Test setting the viewport with no args doesn't change viewport or device pixel ratio."""
386+
context_id = driver.current_window_handle
387+
driver.get(pages.url("formPage.html"))
388+
389+
try:
390+
driver.browsing_context.set_viewport(
391+
context=context_id, viewport={"width": 253, "height": 303}, device_pixel_ratio=6
392+
)
393+
394+
driver.browsing_context.set_viewport(context=context_id)
395+
396+
viewport_size = driver.execute_script("return [window.innerWidth, window.innerHeight];")
397+
398+
assert viewport_size[0] == 253
399+
assert viewport_size[1] == 303
400+
401+
device_pixel_ratio = driver.execute_script("return window.devicePixelRatio")
402+
403+
assert device_pixel_ratio == 6
404+
finally:
405+
driver.browsing_context.set_viewport(context=context_id, viewport=None, device_pixel_ratio=None)
367406

368-
viewport_size = driver.execute_script("return [window.innerWidth, window.innerHeight];")
369407

370-
assert viewport_size[0] == 250
371-
assert viewport_size[1] == 300
408+
def test_set_viewport_back_to_default(driver, pages):
409+
"""Test resetting the viewport and device pixel ratio to defaults."""
410+
context_id = driver.current_window_handle
411+
driver.get(pages.url("formPage.html"))
412+
413+
default_viewport_size = driver.execute_script("return [window.innerWidth, window.innerHeight];")
414+
default_device_pixel_ratio = driver.execute_script("return window.devicePixelRatio")
415+
416+
try:
417+
driver.browsing_context.set_viewport(
418+
context=context_id, viewport={"width": 254, "height": 304}, device_pixel_ratio=10
419+
)
420+
421+
driver.browsing_context.set_viewport(context=context_id, viewport=None, device_pixel_ratio=None)
372422

373-
device_pixel_ratio = driver.execute_script("return window.devicePixelRatio")
423+
viewport_size = driver.execute_script("return [window.innerWidth, window.innerHeight];")
424+
device_pixel_ratio = driver.execute_script("return window.devicePixelRatio")
374425

375-
assert device_pixel_ratio == 5
426+
assert viewport_size[0] == default_viewport_size[0]
427+
assert viewport_size[1] == default_viewport_size[1]
428+
assert device_pixel_ratio == default_device_pixel_ratio
429+
finally:
430+
driver.browsing_context.set_viewport(context=context_id, viewport=None, device_pixel_ratio=None)
376431

377432

378433
def test_print_page(driver, pages):

0 commit comments

Comments
 (0)