Skip to content

Commit 200f70a

Browse files
Vs/refactor reader v 1 (#832)
* vs/ReaderView1
1 parent 2469906 commit 200f70a

File tree

1 file changed

+100
-143
lines changed

1 file changed

+100
-143
lines changed
Lines changed: 100 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import pytest
2+
from typing import Literal
3+
24
from selenium.webdriver import Firefox
35

46
from modules.browser_object import ReaderView
@@ -8,247 +10,202 @@
810

911

1012
@pytest.fixture()
11-
def test_case():
13+
def test_case() -> str:
1214
return "130919"
1315

1416

15-
size_controllers = ["minus", "plus"]
16-
themes = [
17-
("light", "rgb(255, 255, 255)"),
18-
("dark", "rgb(28, 27, 34)"),
19-
("sepia", "rgb(244, 236, 216)"),
20-
("contrast", "rgb(0, 0, 0)"),
21-
("gray", "rgb(215, 215, 219)"),
22-
]
23-
fonts = ["sans-serif", "serif", "monospace"]
24-
alignments = [("left", "start"), ("right", "right"), ("center", "center")]
25-
slider_options = ["decrease", "increase"]
26-
27-
28-
READER_VIEW_URL = (
17+
# Constants / parametrization
18+
READER_VIEW_URL: str = (
2919
"https://support.mozilla.org/en-US/kb/firefox-reader-view-clutter-free-web-pages"
3020
)
3121

22+
SizeControl = Literal["minus", "plus"]
23+
AlignKey = Literal["left", "right", "center"]
24+
AlignCSS = Literal["start", "right", "center"]
25+
SliderDirection = Literal["decrease", "increase"]
26+
27+
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")]
30+
SLIDER_DIRS: list[SliderDirection] = ["decrease", "increase"]
31+
3232

33-
def prep_test(web_page: GenericPage, reader_view: ReaderView) -> None:
33+
# Helpers
34+
def _open_reader_type_panel(web_page: GenericPage, reader_view: ReaderView) -> None:
35+
"""
36+
Open the target page, enter Reader View, and open the 'Type' panel.
37+
"""
3438
web_page.open()
3539
reader_view.open_reader_view_searchbar()
3640
reader_view.click_toolbar_option("toolbar-type")
3741

3842

43+
def _css_int(util: Utilities, element, prop: str) -> int:
44+
"""
45+
Read a CSS property and normalize it to an integer by stripping non-numeric chars.
46+
"""
47+
return int(util.remove_all_non_numbers(element.value_of_css_property(prop)))
48+
49+
3950
@pytest.mark.ci
40-
@pytest.mark.parametrize("font", fonts)
41-
def test_type_control_panel_font(driver: Firefox, font: str):
51+
@pytest.mark.parametrize("font", FONTS)
52+
def test_type_control_panel_font(driver: Firefox, font: Literal["sans-serif", "serif", "monospace"]) -> None:
4253
"""
43-
C130919.1: Ensure the functionality of the type control panels works
54+
C130919.1: Ensure the functionality of the type control panels works (font family).
4455
"""
4556
web_page = GenericPage(driver, url=READER_VIEW_URL)
4657
reader_view = ReaderView(driver)
4758

48-
prep_test(web_page, reader_view)
59+
_open_reader_type_panel(web_page, reader_view)
4960

5061
body = web_page.get_element("page-body")
5162

52-
reader_view.wait.until(
53-
lambda _: "sans-serif" in body.value_of_css_property("font-family")
54-
)
63+
# 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"))
65+
5566
font_dropdown_root = reader_view.get_element("toolbar-font-selector")
56-
font_dropdown = Dropdown(
57-
page=reader_view, require_shadow=False, root=font_dropdown_root
58-
)
67+
font_dropdown = Dropdown(page=reader_view, require_shadow=False, root=font_dropdown_root)
5968
font_dropdown.select_option(
60-
f"about-reader-font-type-{font}", option_tag="option", label_name="data-l10n-id"
69+
f"about-reader-font-type-{font}",
70+
option_tag="option",
71+
label_name="data-l10n-id",
6172
)
73+
6274
reader_view.wait.until(lambda _: font in body.value_of_css_property("font-family"))
6375

6476

65-
@pytest.mark.parametrize("type", size_controllers)
66-
def test_type_control_panel_size(driver: Firefox, type: str):
77+
@pytest.mark.parametrize("control", SIZE_CONTROLS)
78+
def test_type_control_panel_size(driver: Firefox, control: SizeControl) -> None:
6779
"""
68-
C130919.2: Ensure the functionality of the type control panels works
80+
C130919.2: Ensure the functionality of the type control panels works (text size).
6981
"""
7082
web_page = GenericPage(driver, url=READER_VIEW_URL)
7183
reader_view = ReaderView(driver)
7284
util = Utilities()
7385

74-
prep_test(web_page, reader_view)
86+
_open_reader_type_panel(web_page, reader_view)
7587

7688
body = web_page.get_element("page-body")
77-
font_before = int(
78-
util.remove_all_non_numbers(body.value_of_css_property("--font-size"))
79-
)
80-
reader_view.get_element(f"toolbar-textsize-{type}").click()
81-
if type == "minus":
82-
reader_view.wait.until(
83-
lambda _: int(
84-
util.remove_all_non_numbers(body.value_of_css_property("--font-size"))
85-
)
86-
< font_before
87-
)
89+
size_before = _css_int(util, body, "--font-size")
90+
91+
reader_view.get_element(f"toolbar-textsize-{control}").click()
92+
93+
if control == "minus":
94+
reader_view.wait.until(lambda _: _css_int(util, body, "--font-size") < size_before)
8895
else:
89-
reader_view.wait.until(
90-
lambda _: int(
91-
util.remove_all_non_numbers(body.value_of_css_property("--font-size"))
92-
)
93-
> font_before
94-
)
96+
reader_view.wait.until(lambda _: _css_int(util, body, "--font-size") > size_before)
9597

9698

97-
@pytest.mark.parametrize("alignment, intended_alignment", alignments)
99+
@pytest.mark.parametrize("alignment,intended_alignment", ALIGNMENTS)
98100
def test_type_control_panel_text_alignment(
99-
driver: Firefox, alignment: str, intended_alignment: str
100-
):
101+
driver: Firefox,
102+
alignment: AlignKey,
103+
intended_alignment: AlignCSS,
104+
) -> None:
101105
"""
102-
C130919.3: Ensure the functionality of the type control panels works
106+
C130919.3: Ensure the functionality of the type control panels works (text alignment).
103107
"""
104108
web_page = GenericPage(driver, url=READER_VIEW_URL)
105109
reader_view = ReaderView(driver)
106110

107-
prep_test(web_page, reader_view)
111+
_open_reader_type_panel(web_page, reader_view)
108112

109113
container = web_page.get_element("container-div")
110114
reader_view.open_advanced_options()
111115

112116
reader_view.get_element(f"toolbar-text-align-{alignment}").click()
113-
reader_view.wait.until(
114-
lambda _: container.value_of_css_property("--text-alignment")
115-
== intended_alignment
116-
)
117+
reader_view.wait.until(lambda _: container.value_of_css_property("--text-alignment") == intended_alignment)
117118

118119

119-
@pytest.mark.parametrize("width", slider_options)
120-
def test_type_control_panel_content_width(driver: Firefox, width: str):
120+
@pytest.mark.parametrize("direction", SLIDER_DIRS)
121+
def test_type_control_panel_content_width(driver: Firefox, direction: SliderDirection) -> None:
121122
"""
122-
C130919.4: Ensure the functionality of the type control panels works
123+
C130919.4: Ensure the functionality of the type control panels works (content width slider).
123124
"""
124125
web_page = GenericPage(driver, url=READER_VIEW_URL)
125126
reader_view = ReaderView(driver)
126127
util = Utilities()
127128

128-
prep_test(web_page, reader_view)
129+
_open_reader_type_panel(web_page, reader_view)
129130

130131
reader_view.change_slider_element_shadow_parent("toolbar-content-width")
131132

132133
body = web_page.get_element("page-body")
133-
before_content_width = int(
134-
util.remove_all_non_numbers(body.value_of_css_property("--content-width"))
135-
)
136-
content_width_slider = reader_view.get_element("slider")
137-
138-
if width == "decrease":
139-
reader_view.change_slider_value(content_width_slider, increase=False)
140-
reader_view.wait.until(
141-
lambda _: int(
142-
util.remove_all_non_numbers(
143-
body.value_of_css_property("--content-width")
144-
)
145-
)
146-
< before_content_width
147-
)
134+
width_before = _css_int(util, body, "--content-width")
135+
slider = reader_view.get_element("slider")
136+
137+
reader_view.change_slider_value(slider, increase=(direction == "increase"))
138+
139+
if direction == "decrease":
140+
reader_view.wait.until(lambda _: _css_int(util, body, "--content-width") < width_before)
148141
else:
149-
reader_view.change_slider_value(content_width_slider)
150-
reader_view.wait.until(
151-
lambda _: int(
152-
util.remove_all_non_numbers(
153-
body.value_of_css_property("--content-width")
154-
)
155-
)
156-
> before_content_width
157-
)
142+
reader_view.wait.until(lambda _: _css_int(util, body, "--content-width") > width_before)
158143

159144

160-
@pytest.mark.parametrize("line_height", slider_options)
161-
def test_type_control_panel_line_spacing(driver: Firefox, line_height: str):
145+
@pytest.mark.parametrize("direction", SLIDER_DIRS)
146+
def test_type_control_panel_line_spacing(driver: Firefox, direction: SliderDirection) -> None:
162147
"""
163-
C130919.5: Ensure the functionality of the type control panels works
148+
C130919.5: Ensure the functionality of the type control panels works (line spacing slider).
164149
"""
165150
web_page = GenericPage(driver, url=READER_VIEW_URL)
166151
reader_view = ReaderView(driver)
167152
util = Utilities()
168153

169-
prep_test(web_page, reader_view)
154+
_open_reader_type_panel(web_page, reader_view)
170155

171156
reader_view.change_slider_element_shadow_parent("toolbar-line-spacing")
172157

173158
body = web_page.get_element("page-body")
174-
before_block_size = int(
175-
util.remove_all_non_numbers(body.value_of_css_property("block-size"))
176-
)
177-
content_line_spacer_slider = reader_view.get_element("slider")
178-
179-
if line_height == "decrease":
180-
reader_view.change_slider_value(content_line_spacer_slider, increase=False)
181-
reader_view.wait.until(
182-
lambda _: int(
183-
util.remove_all_non_numbers(body.value_of_css_property("block-size"))
184-
)
185-
< before_block_size
186-
)
159+
block_before = _css_int(util, body, "block-size")
160+
slider = reader_view.get_element("slider")
161+
162+
reader_view.change_slider_value(slider, increase=(direction == "increase"))
163+
164+
if direction == "decrease":
165+
reader_view.wait.until(lambda _: _css_int(util, body, "block-size") < block_before)
187166
else:
188-
reader_view.change_slider_value(content_line_spacer_slider)
189-
reader_view.wait.until(
190-
lambda _: int(
191-
util.remove_all_non_numbers(body.value_of_css_property("block-size"))
192-
)
193-
> before_block_size
194-
)
167+
reader_view.wait.until(lambda _: _css_int(util, body, "block-size") > block_before)
195168

196169

197-
def test_type_control_panel_character_spacing(driver: Firefox):
170+
def test_type_control_panel_character_spacing(driver: Firefox) -> None:
198171
"""
199-
C130919.6: Ensure the functionality of the type control panels works
172+
C130919.6: Ensure the functionality of the type control panels works (character spacing slider).
200173
"""
201174
web_page = GenericPage(driver, url=READER_VIEW_URL)
202175
reader_view = ReaderView(driver)
203176
util = Utilities()
204177

205-
prep_test(web_page, reader_view)
178+
_open_reader_type_panel(web_page, reader_view)
206179
reader_view.open_advanced_options()
207180

208181
reader_view.change_slider_element_shadow_parent("toolbar-character-spacing")
209182

210183
container = web_page.get_element("container-div")
211-
before_character_spacing = int(
212-
util.remove_all_non_numbers(container.value_of_css_property("--letter-spacing"))
213-
)
214-
content_character_spacing_slider = reader_view.get_element("slider")
215-
reader_view.change_slider_value(content_character_spacing_slider)
216-
217-
reader_view.wait.until(
218-
lambda _: int(
219-
util.remove_all_non_numbers(
220-
container.value_of_css_property("--letter-spacing")
221-
)
222-
)
223-
> before_character_spacing
224-
)
184+
letter_before = _css_int(util, container, "--letter-spacing")
185+
slider = reader_view.get_element("slider")
186+
187+
reader_view.change_slider_value(slider, increase=True)
188+
189+
reader_view.wait.until(lambda _: _css_int(util, container, "--letter-spacing") > letter_before)
225190

226191

227-
def test_type_control_panel_word_spacing(driver: Firefox):
192+
def test_type_control_panel_word_spacing(driver: Firefox) -> None:
228193
"""
229-
C130919.7: Ensure the functionality of the type control panels works
194+
C130919.7: Ensure the functionality of the type control panels works (word spacing slider).
230195
"""
231196
web_page = GenericPage(driver, url=READER_VIEW_URL)
232197
reader_view = ReaderView(driver)
233198
util = Utilities()
234199

235-
prep_test(web_page, reader_view)
200+
_open_reader_type_panel(web_page, reader_view)
236201
reader_view.open_advanced_options()
237202

238203
reader_view.change_slider_element_shadow_parent("toolbar-word-spacing")
239204

240205
container = web_page.get_element("container-div")
241-
before_word_spacing = int(
242-
util.remove_all_non_numbers(container.value_of_css_property("--word-spacing"))
243-
)
244-
content_word_spacing_slider = reader_view.get_element("slider")
245-
reader_view.change_slider_value(content_word_spacing_slider)
246-
247-
reader_view.wait.until(
248-
lambda _: int(
249-
util.remove_all_non_numbers(
250-
container.value_of_css_property("--word-spacing")
251-
)
252-
)
253-
> before_word_spacing
254-
)
206+
word_before = _css_int(util, container, "--word-spacing")
207+
slider = reader_view.get_element("slider")
208+
209+
reader_view.change_slider_value(slider, increase=True)
210+
211+
reader_view.wait.until(lambda _: _css_int(util, container, "--word-spacing") > word_before)

0 commit comments

Comments
 (0)