Skip to content

Commit d1b24c6

Browse files
Type Control Panels (#163)
* add changes in * add json * format * add clickable check * lint fix * make suite faster * format * sanitize filename * format * finish * format * added shadowparent dynamic changing * format * remove print * add unstables * format unstable * add unstables * fix glean * gitignore --------- Co-authored-by: Ben Chatterton <[email protected]>
1 parent 3181618 commit d1b24c6

16 files changed

+649
-11
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
/venv/
22
test*.txt
33
fx_location
4+
test*txt
5+
test*png
46
results.txt
57
err_log.txt
68
**/report.html

modules/browser_object_reader_view.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import logging
2+
13
from selenium.webdriver import Keys
4+
from selenium.webdriver.remote.webelement import WebElement
25

36
from modules.page_base import BasePage
47

@@ -77,3 +80,40 @@ def wait_for_reader_view_closed(self) -> BasePage:
7780
"""
7881
self.element_does_not_exist("reader-toolbar")
7982
return self
83+
84+
def click_toolbar_option(self, option: str) -> BasePage:
85+
"""
86+
Clicks on the toolbar option
87+
"""
88+
toolbar_option = self.get_element(option)
89+
self.element_clickable(option)
90+
toolbar_option.click()
91+
return self
92+
93+
def open_advanced_options(self) -> BasePage:
94+
"""
95+
Assuming the type panel is already open, this method will press the advanced accordian
96+
"""
97+
self.get_element("toolbar-advanced").click()
98+
self.element_clickable("toolbar-text-align-left")
99+
return self
100+
101+
def change_slider_value(self, slider: WebElement, increase=True) -> BasePage:
102+
"""
103+
Sends the Right and Left keys to the slider to move the selected point.
104+
"""
105+
if increase:
106+
slider.send_keys(Keys.RIGHT)
107+
else:
108+
slider.send_keys(Keys.LEFT)
109+
return self
110+
111+
def change_slider_element_shadow_parent(self, slider_parent: str) -> BasePage:
112+
"""
113+
Dynamically modifies the shadow parent of the slider.
114+
"""
115+
if "slider" in self.elements:
116+
self.elements["slider"]["shadowParent"] = slider_parent
117+
return self
118+
logging.error("Could not find slider element.")
119+
return self

modules/data/generic_page.components.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55
"groups": []
66
},
77

8+
"container-div": {
9+
"selectorData": "container",
10+
"strategy": "class",
11+
"groups": []
12+
},
13+
814
"authorize-notifications-button": {
915
"selectorData": "button[onclick='notify.authorize()']",
1016
"strategy": "css",

modules/data/reader_view.components.json

Lines changed: 146 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,153 @@
1111
"groups": []
1212
},
1313

14-
"reader-toolbar-close": {
15-
"selectorData": "button[class='close-button toolbar-button']",
14+
"reader-toolbar-panel": {
15+
"selectorData": "dropdown-popup",
16+
"strategy": "class",
17+
"groups": []
18+
},
19+
20+
"reader-toolbar-panel-serif": {
21+
"selectorData": "serif-button",
22+
"strategy": "class",
23+
"groups": []
24+
},
25+
26+
"reader-toolbar-panel-sans-serif": {
27+
"selectorData": "sans-serif-button",
28+
"strategy": "class",
29+
"groups": []
30+
},
31+
32+
"toolbar-type": {
33+
"selectorData": "button.dropdown-toggle.toolbar-button[class$='style-button']",
1634
"strategy": "css",
1735
"groups": []
36+
},
37+
38+
"toolbar-size-minus": {
39+
"selectorData": "minus-button",
40+
"strategy": "class",
41+
"groups": []
42+
},
43+
44+
"toolbar-textsize-minus": {
45+
"selectorData": "text-size-minus-button",
46+
"strategy": "class",
47+
"groups": []
48+
},
49+
50+
"toolbar-size-plus": {
51+
"selectorData": "plus-button",
52+
"strategy": "class",
53+
"groups": []
54+
},
55+
56+
"toolbar-textsize-plus": {
57+
"selectorData": "text-size-plus-button",
58+
"strategy": "class",
59+
"groups": []
60+
},
61+
62+
"toolbar-width-minus": {
63+
"selectorData": "content-width-minus-button",
64+
"strategy": "class",
65+
"groups": []
66+
},
67+
68+
"toolbar-width-plus": {
69+
"selectorData": "content-width-plus-button",
70+
"strategy": "class",
71+
"groups": []
72+
},
73+
74+
"toolbar-line-height-minus": {
75+
"selectorData": "line-height-minus-button",
76+
"strategy": "class",
77+
"groups": []
78+
},
79+
80+
"toolbar-line-height-plus": {
81+
"selectorData": "line-height-plus-button",
82+
"strategy": "class",
83+
"groups": []
84+
},
85+
86+
"toolbar-theme-light": {
87+
"selectorData": "light-button",
88+
"strategy": "class",
89+
"groups": []
90+
},
91+
92+
"toolbar-theme-dark": {
93+
"selectorData": "dark-button",
94+
"strategy": "class",
95+
"groups": []
96+
},
97+
98+
"toolbar-theme-sepia": {
99+
"selectorData": "sepia-button",
100+
"strategy": "class",
101+
"groups": []
102+
},
103+
104+
"toolbar-font-selector": {
105+
"selectorData": "font-type-selector",
106+
"strategy": "id",
107+
"groups": []
108+
},
109+
110+
"toolbar-text-align-left": {
111+
"selectorData": "left-align-button",
112+
"strategy": "class",
113+
"groups": []
114+
},
115+
116+
"toolbar-text-align-center": {
117+
"selectorData": "center-align-button",
118+
"strategy": "class",
119+
"groups": []
120+
},
121+
122+
"toolbar-text-align-right": {
123+
"selectorData": "right-align-button",
124+
"strategy": "class",
125+
"groups": []
126+
},
127+
128+
"toolbar-advanced": {
129+
"selectorData": "about-reader-advanced-layout-header",
130+
"strategy": "id",
131+
"groups": []
132+
},
133+
134+
"toolbar-content-width": {
135+
"selectorData": "moz-slider[data-l10n-id='about-reader-content-width-label']",
136+
"strategy": "css",
137+
"groups": []
138+
},
139+
140+
"toolbar-line-spacing": {
141+
"selectorData": "moz-slider[data-l10n-id='about-reader-line-spacing-label']",
142+
"strategy": "css",
143+
"groups": []
144+
},
145+
146+
"toolbar-character-spacing": {
147+
"selectorData": "moz-slider[data-l10n-id='about-reader-character-spacing-label']",
148+
"strategy": "css",
149+
"groups": []
150+
},
151+
152+
"toolbar-word-spacing": {
153+
"selectorData": "moz-slider[data-l10n-id='about-reader-word-spacing-label']",
154+
"strategy": "css",
155+
"groups": []
156+
},
157+
158+
"slider": {
159+
"selectorData": "inputSlider",
160+
"strategy": "id",
161+
"groups": []
18162
}
19163
}

modules/page_object_about_prefs.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,28 +34,38 @@ class Dropdown(Region):
3434
PyPOM Region factory for Dropdown menus in about:prefs. See PyPOM docs on Regions.
3535
"""
3636

37-
def __init__(self, page, **kwargs):
37+
def __init__(self, page, require_shadow=True, **kwargs):
3838
super().__init__(page, **kwargs)
3939
self.utils = PomUtils(self.driver)
40-
self.shadow_elements = self.utils.get_shadow_content(self.root)
41-
self.dropmarker = next(
42-
el for el in self.shadow_elements if el.tag_name == "dropmarker"
43-
)
40+
if require_shadow:
41+
self.shadow_elements = self.utils.get_shadow_content(self.root)
42+
self.dropmarker = next(
43+
el for el in self.shadow_elements if el.tag_name == "dropmarker"
44+
)
4445

4546
@property
4647
def loaded(self):
4748
return self.root if EC.element_to_be_clickable(self.root) else False
4849

4950
def select_option(
50-
self, option_name: str, double_click=False, wait_for_selection=True
51+
self,
52+
option_name: str,
53+
double_click=False,
54+
wait_for_selection=True,
55+
option_tag="menuitem",
56+
label_name="label",
5157
):
5258
"""Select an option in the dropdown. Does not return self."""
53-
if not self.dropmarker.get_attribute("open") == "true":
59+
try:
60+
if not self.dropmarker.get_attribute("open") == "true":
61+
self.root.click()
62+
except AttributeError:
5463
self.root.click()
64+
5565
matching_menuitems = [
5666
el
57-
for el in self.root.find_elements(By.CSS_SELECTOR, "menuitem")
58-
if el.get_attribute("label") == option_name
67+
for el in self.root.find_elements(By.CSS_SELECTOR, option_tag)
68+
if el.get_attribute(label_name) == option_name
5969
]
6070
if len(matching_menuitems) == 0:
6171
return False

modules/util.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,9 @@ def get_domain_from_url(self, url: str) -> str:
381381
domain_parsed_url = parsed_url._replace(path="")
382382
return urlunparse(domain_parsed_url)
383383

384+
def remove_all_non_numbers(self, item: str) -> str:
385+
return re.sub(r"[^\d-]", "", item)
386+
384387

385388
class BrowserActions:
386389
"""

tests/address_bar_and_search/test_default_search_provider_change.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
from time import sleep
22

3+
import pytest
34
from selenium.webdriver import Firefox
45
from selenium.webdriver.common.by import By
56

67
from modules.browser_object import Navigation
78
from modules.page_object import AboutConfig, AboutPrefs
89

910

11+
# NOTE: Need to fix, failing in 130+ Firefox due to legacy search bar being deprecated
12+
@pytest.mark.unstable
1013
def test_default_search_provider_change(driver: Firefox):
1114
"""
1215
C1365245 - This test makes sure that the default search

tests/address_bar_and_search/test_glean_basic.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ def glean_handler(rq: Request) -> Response:
5252

5353

5454
@pytest.mark.ci
55+
@pytest.mark.unstable
5556
def test_glean_ping(driver: Firefox, httpserver: HTTPServer):
5657
"""C2234689: Test that Glean pings contain expected info"""
5758
global PINGS_WITH_ID

tests/address_bar_and_search/test_search_bar_result.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import pytest
12
from selenium.webdriver import Firefox
23
from selenium.webdriver.common.by import By
34

@@ -9,6 +10,8 @@
910
SEARCH_TERM = "saxophone"
1011

1112

13+
# NOTE: Need to fix, failing in 130+ Firefox due to legacy search bar being deprecated
14+
@pytest.mark.unstable
1215
def test_search_bar_results(driver: Firefox):
1316
"""
1417
C1365213 - The Search Bar provides valid results for specific search terms

tests/address_bar_and_search/test_search_code_google_non_us.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ def overwrite_prefs():
1919
SEARCH_BAR_PREF = "browser.search.widget.inNavBar"
2020

2121

22+
# NOTE: Need to fix, failing in 130+ Firefox due to legacy search bar being deprecated
23+
@pytest.mark.unstable
2224
def test_search_code_google_non_us(driver: Firefox):
2325
"""
2426
C1365269 - Default Search Code: Google - non-US

0 commit comments

Comments
 (0)