Skip to content

Commit bc7d484

Browse files
committed
test: Created test to verify selected tabs can be pinned/unpinned
1 parent 575e758 commit bc7d484

File tree

3 files changed

+151
-20
lines changed

3 files changed

+151
-20
lines changed

modules/browser_object_tabbar.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,3 +326,41 @@ def verify_tab_focus_cycle(self, num_tabs: int):
326326
self.custom_wait(timeout=3).until(
327327
lambda d: target_tab.get_attribute("visuallyselected") == ""
328328
)
329+
330+
@BasePage.context_chrome
331+
def select_tabs_by_indices(
332+
self, indices: list[int], sys_platform: str
333+
) -> list[WebElement]:
334+
"""
335+
Selects multiple tabs based on their indices and returns list of tabs.
336+
337+
Preconditions:
338+
- len(indices) > 1
339+
- max(indices) < number of open tabs
340+
- min(indices) >= 1
341+
Notes:
342+
- Opens (clicks) the tab at the first index in indices
343+
- the first tab in the window is denoted by index 1 (1-based indexing)
344+
"""
345+
346+
start_tab = self.get_tab(indices[0])
347+
selected_tabs = [start_tab]
348+
start_tab.click()
349+
350+
actions = self.actions
351+
if sys_platform == "Darwin":
352+
actions.key_down(Keys.COMMAND).perform()
353+
else:
354+
actions.key_down(Keys.CONTROL).perform()
355+
356+
for i in range(1, len(indices)):
357+
tab = self.get_tab(indices[i])
358+
actions.click(tab).perform()
359+
selected_tabs.append(tab)
360+
361+
if sys_platform == "Darwin":
362+
actions.key_up(Keys.COMMAND).perform()
363+
else:
364+
actions.key_up(Keys.CONTROL).perform()
365+
366+
return selected_tabs

tests/reader_view/test_improved_type_control_panel.py

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import pytest
21
from typing import Literal
32

3+
import pytest
44
from selenium.webdriver import Firefox
55

66
from modules.browser_object import ReaderView
@@ -25,8 +25,16 @@ def test_case() -> str:
2525
SliderDirection = Literal["decrease", "increase"]
2626

2727
SIZE_CONTROLS: list[SizeControl] = ["minus", "plus"]
28-
FONTS: list[Literal["sans-serif", "serif", "monospace"]] = ["sans-serif", "serif", "monospace"]
29-
ALIGNMENTS: list[tuple[AlignKey, AlignCSS]] = [("left", "start"), ("right", "right"), ("center", "center")]
28+
FONTS: list[Literal["sans-serif", "serif", "monospace"]] = [
29+
"sans-serif",
30+
"serif",
31+
"monospace",
32+
]
33+
ALIGNMENTS: list[tuple[AlignKey, AlignCSS]] = [
34+
("left", "start"),
35+
("right", "right"),
36+
("center", "center"),
37+
]
3038
SLIDER_DIRS: list[SliderDirection] = ["decrease", "increase"]
3139

3240

@@ -49,7 +57,9 @@ def _css_int(util: Utilities, element, prop: str) -> int:
4957

5058
@pytest.mark.ci
5159
@pytest.mark.parametrize("font", FONTS)
52-
def test_type_control_panel_font(driver: Firefox, font: Literal["sans-serif", "serif", "monospace"]) -> None:
60+
def test_type_control_panel_font(
61+
driver: Firefox, font: Literal["sans-serif", "serif", "monospace"]
62+
) -> None:
5363
"""
5464
C130919.1: Ensure the functionality of the type control panels works (font family).
5565
"""
@@ -61,10 +71,14 @@ def test_type_control_panel_font(driver: Firefox, font: Literal["sans-serif", "s
6171
body = web_page.get_element("page-body")
6272

6373
# Ensure default is sans-serif first so the next wait has a stable baseline
64-
reader_view.wait.until(lambda _: "sans-serif" in body.value_of_css_property("font-family"))
74+
reader_view.wait.until(
75+
lambda _: "sans-serif" in body.value_of_css_property("font-family")
76+
)
6577

6678
font_dropdown_root = reader_view.get_element("toolbar-font-selector")
67-
font_dropdown = Dropdown(page=reader_view, require_shadow=False, root=font_dropdown_root)
79+
font_dropdown = Dropdown(
80+
page=reader_view, require_shadow=False, root=font_dropdown_root
81+
)
6882
font_dropdown.select_option(
6983
f"about-reader-font-type-{font}",
7084
option_tag="option",
@@ -91,16 +105,20 @@ def test_type_control_panel_size(driver: Firefox, control: SizeControl) -> None:
91105
reader_view.get_element(f"toolbar-textsize-{control}").click()
92106

93107
if control == "minus":
94-
reader_view.wait.until(lambda _: _css_int(util, body, "--font-size") < size_before)
108+
reader_view.wait.until(
109+
lambda _: _css_int(util, body, "--font-size") < size_before
110+
)
95111
else:
96-
reader_view.wait.until(lambda _: _css_int(util, body, "--font-size") > size_before)
112+
reader_view.wait.until(
113+
lambda _: _css_int(util, body, "--font-size") > size_before
114+
)
97115

98116

99117
@pytest.mark.parametrize("alignment,intended_alignment", ALIGNMENTS)
100118
def test_type_control_panel_text_alignment(
101-
driver: Firefox,
102-
alignment: AlignKey,
103-
intended_alignment: AlignCSS,
119+
driver: Firefox,
120+
alignment: AlignKey,
121+
intended_alignment: AlignCSS,
104122
) -> None:
105123
"""
106124
C130919.3: Ensure the functionality of the type control panels works (text alignment).
@@ -114,11 +132,16 @@ def test_type_control_panel_text_alignment(
114132
reader_view.open_advanced_options()
115133

116134
reader_view.get_element(f"toolbar-text-align-{alignment}").click()
117-
reader_view.wait.until(lambda _: container.value_of_css_property("--text-alignment") == intended_alignment)
135+
reader_view.wait.until(
136+
lambda _: container.value_of_css_property("--text-alignment")
137+
== intended_alignment
138+
)
118139

119140

120141
@pytest.mark.parametrize("direction", SLIDER_DIRS)
121-
def test_type_control_panel_content_width(driver: Firefox, direction: SliderDirection) -> None:
142+
def test_type_control_panel_content_width(
143+
driver: Firefox, direction: SliderDirection
144+
) -> None:
122145
"""
123146
C130919.4: Ensure the functionality of the type control panels works (content width slider).
124147
"""
@@ -137,13 +160,19 @@ def test_type_control_panel_content_width(driver: Firefox, direction: SliderDire
137160
reader_view.change_slider_value(slider, increase=(direction == "increase"))
138161

139162
if direction == "decrease":
140-
reader_view.wait.until(lambda _: _css_int(util, body, "--content-width") < width_before)
163+
reader_view.wait.until(
164+
lambda _: _css_int(util, body, "--content-width") < width_before
165+
)
141166
else:
142-
reader_view.wait.until(lambda _: _css_int(util, body, "--content-width") > width_before)
167+
reader_view.wait.until(
168+
lambda _: _css_int(util, body, "--content-width") > width_before
169+
)
143170

144171

145172
@pytest.mark.parametrize("direction", SLIDER_DIRS)
146-
def test_type_control_panel_line_spacing(driver: Firefox, direction: SliderDirection) -> None:
173+
def test_type_control_panel_line_spacing(
174+
driver: Firefox, direction: SliderDirection
175+
) -> None:
147176
"""
148177
C130919.5: Ensure the functionality of the type control panels works (line spacing slider).
149178
"""
@@ -162,9 +191,13 @@ def test_type_control_panel_line_spacing(driver: Firefox, direction: SliderDirec
162191
reader_view.change_slider_value(slider, increase=(direction == "increase"))
163192

164193
if direction == "decrease":
165-
reader_view.wait.until(lambda _: _css_int(util, body, "block-size") < block_before)
194+
reader_view.wait.until(
195+
lambda _: _css_int(util, body, "block-size") < block_before
196+
)
166197
else:
167-
reader_view.wait.until(lambda _: _css_int(util, body, "block-size") > block_before)
198+
reader_view.wait.until(
199+
lambda _: _css_int(util, body, "block-size") > block_before
200+
)
168201

169202

170203
def test_type_control_panel_character_spacing(driver: Firefox) -> None:
@@ -186,7 +219,9 @@ def test_type_control_panel_character_spacing(driver: Firefox) -> None:
186219

187220
reader_view.change_slider_value(slider, increase=True)
188221

189-
reader_view.wait.until(lambda _: _css_int(util, container, "--letter-spacing") > letter_before)
222+
reader_view.wait.until(
223+
lambda _: _css_int(util, container, "--letter-spacing") > letter_before
224+
)
190225

191226

192227
def test_type_control_panel_word_spacing(driver: Firefox) -> None:
@@ -208,4 +243,6 @@ def test_type_control_panel_word_spacing(driver: Firefox) -> None:
208243

209244
reader_view.change_slider_value(slider, increase=True)
210245

211-
reader_view.wait.until(lambda _: _css_int(util, container, "--word-spacing") > word_before)
246+
reader_view.wait.until(
247+
lambda _: _css_int(util, container, "--word-spacing") > word_before
248+
)
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import pytest
2+
from selenium.webdriver import Firefox
3+
4+
from modules.browser_object import ContextMenu, TabBar
5+
6+
7+
@pytest.fixture()
8+
def test_case():
9+
return "246978"
10+
11+
12+
URLS = [
13+
"about:about",
14+
"about:addons",
15+
"about:cache",
16+
"about:robots",
17+
]
18+
19+
20+
def test_pin_unpin_selected_tabs(driver: Firefox, sys_platform: str):
21+
"""
22+
C246978 - Verify that multiple tabs can be selected and pinned/unpinned from the context menu.
23+
"""
24+
25+
tabs = TabBar(driver)
26+
# Create 4 new tabs
27+
for i in range(4):
28+
tabs.new_tab_by_button()
29+
driver.switch_to.window(driver.window_handles[-1])
30+
driver.get(URLS[i])
31+
assert len(driver.window_handles) == 5
32+
33+
with driver.context(driver.CONTEXT_CHROME):
34+
select_indices = [1, 3, 5]
35+
selected_tabs = tabs.select_tabs_by_indices(select_indices, sys_platform)
36+
tab_context_menu = ContextMenu(driver)
37+
38+
# Pin
39+
tab_context_menu.context_click(selected_tabs[1])
40+
tab_context_menu.click_and_hide_menu(
41+
("css selector", "#context_pinSelectedTabs")
42+
)
43+
44+
# Verify pinned
45+
for tab in selected_tabs:
46+
assert tabs.is_pinned(tab)
47+
48+
# Unpin
49+
tab_context_menu.context_click(selected_tabs[1])
50+
tab_context_menu.click_and_hide_menu(
51+
("css selector", "#context_unpinSelectedTabs")
52+
)
53+
54+
# Verify unpinned
55+
for tab in selected_tabs:
56+
assert not tabs.is_pinned(tab)

0 commit comments

Comments
 (0)