Skip to content

Commit eef4a82

Browse files
vsangereanMOZphilimon-reset
authored andcommitted
vs/draft search perssists (#863)
* vs/draft search perssists * suggestions test rework * fix lint --------- Co-authored-by: Philimon Derib Ayalew <[email protected]>
1 parent 51754ae commit eef4a82

9 files changed

+153
-8
lines changed

SELECTOR_INFO.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2581,6 +2581,13 @@ Location: Any clickable area on the awesome bar
25812581
Path to .json: modules/data/navigation.components.json
25822582
```
25832583
```
2584+
Selector name: legacy-search-mode-suggestion-container
2585+
Selector Data: richlistbox[class='autocomplete-richlistbox search-panel-tree']
2586+
Description: Legacy search container
2587+
Location: Any clickable area on the awesome bar
2588+
Path to .json: modules/data/navigation.components.json
2589+
```
2590+
```
25842591
Selector name: results-dropdown
25852592
Selector Data: urlbar-results
25862593
Description: URL bar search results

modules/browser_object_navigation.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
22
import re
3+
import time
34
from typing import Literal
45

56
from selenium.common.exceptions import StaleElementReferenceException, TimeoutException
@@ -291,6 +292,52 @@ def open_tracker_panel(self) -> BasePage:
291292
self.get_element("shield-icon").click()
292293
return self
293294

295+
def search_and_check_if_suggestions_are_present(
296+
self, text, search_mode: str = "awesome", min_suggestions=0
297+
):
298+
"""
299+
Search in the given address bar and check if suggestions are present.
300+
301+
Args:
302+
text (str): Text to search for in the suggestions.
303+
search_mode(str): Search mode to use. Can be 'awesome' or 'search'. Defaults to 'awesome'.
304+
min_suggestions (int): Minimum number of suggestions to collect.
305+
"""
306+
if search_mode == "awesome":
307+
self.clear_awesome_bar()
308+
self.type_in_awesome_bar(text)
309+
time.sleep(0.5)
310+
return self.awesome_bar_has_suggestions()
311+
elif search_mode == "search":
312+
self.set_search_bar()
313+
self.type_in_search_bar(text)
314+
return self.search_bar_has_suggestions(min_suggestions)
315+
else:
316+
raise ValueError("search_mode must be either 'awesome' or 'search'")
317+
318+
def awesome_bar_has_suggestions(self) -> bool:
319+
"""Check if the awesome bar has any suggestions."""
320+
self.wait_for_suggestions_present(1)
321+
suggestions = self.get_all_children("results-dropdown")
322+
return len(suggestions) > 2
323+
324+
@BasePage.context_chrome
325+
def search_bar_has_suggestions(self, min_suggestions: int = 0) -> bool:
326+
"""Check if the legacy search bar has suggestions. if a style has max-height: 0px, then no suggestions are present."""
327+
suggestion_container = self.get_element(
328+
"legacy-search-mode-suggestion-container"
329+
)
330+
if min_suggestions > 2:
331+
return (
332+
suggestion_container.find_element(By.XPATH, "./*[1]").tag_name
333+
== "richlistitem"
334+
)
335+
else:
336+
has_children = self.driver.execute_script(
337+
"return arguments[0].children.length > 0;", suggestion_container
338+
)
339+
return has_children
340+
294341
def wait_for_suggestions_present(self, at_least: int = 1):
295342
"""Wait until the suggestion list has at least one visible item."""
296343
self.set_chrome_context()

modules/data/about_prefs.components.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"searchEngineDropdown"
1414
]
1515
},
16+
1617
"custom-tracker-options-parent": {
1718
"selectorData": "contentBlockingOptionCustom",
1819
"strategy": "id",
@@ -168,6 +169,16 @@
168169
"strategy": "css",
169170
"groups": []
170171
},
172+
"show-suggestions-in-address-bar": {
173+
"selectorData": "showSearchSuggestionsFirstCheckbox",
174+
"strategy": "id",
175+
"groups": []
176+
},
177+
"show-suggestions-awesomebar": {
178+
"selectorData": "urlBarSuggestion",
179+
"strategy": "id",
180+
"groups": []
181+
},
171182
"firefox-suggest-nonsponsored": {
172183
"selectorData": "firefoxSuggestNonsponsored",
173184
"strategy": "id",

modules/data/customize_firefox.components.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,15 @@
2828
"selectorData": "customization-container",
2929
"strategy": "id",
3030
"groups": []
31+
},
32+
"nav-searchbar": {
33+
"selectorData": "search-container",
34+
"strategy": "id",
35+
"groups": []
36+
},
37+
"done-button": {
38+
"selectorData": "customization-done-button",
39+
"strategy": "id",
40+
"groups": []
3141
}
3242
}

modules/data/navigation.components.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@
2929
"groups": []
3030
},
3131

32+
"legacy-search-mode-suggestion-container": {
33+
"selectorData": "richlistbox[class='autocomplete-richlistbox search-panel-tree']",
34+
"strategy": "css",
35+
"groups": []
36+
},
37+
3238
"overflow-item": {
3339
"selectorData": "[class='urlbarView-title urlbarView-overflowable']",
3440
"strategy": "css",

modules/page_object_customize_firefox.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ class CustomizeFirefox(BasePage):
1313

1414
URL_TEMPLATE = ""
1515

16+
@BasePage.context_chrome
1617
def add_widget_to_toolbar(
1718
self, reference: Union[str, tuple, WebElement], labels=[]
1819
) -> BasePage:
19-
with self.driver.context(self.driver.CONTEXT_CHROME):
20-
widget = self.fetch(reference, labels=labels)
21-
self.context_click(widget)
22-
ContextMenu(self.driver).click_and_hide_menu(
23-
"customize-firefox-add-toolbar"
24-
)
20+
widget = self.fetch(reference, labels=labels)
21+
self.context_click(widget)
22+
ContextMenu(self.driver).click_and_hide_menu("customize-firefox-add-toolbar")
23+
self.element_clickable("nav-searchbar")
24+
self.click_on("done-button")
2525
return self

modules/page_object_prefs.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,20 @@ def __init__(self):
5252

5353
# Function Organization
5454
# Search and Settings
55+
56+
def select_search_suggestions_in_address_bar(self, value: bool = True) -> BasePage:
57+
"""
58+
Selects the search suggestions in the Address Bar checkbox according to the value given.
59+
"""
60+
checkbox = self.get_element("show-suggestions")
61+
awesome_bar_checkbox = self.get_element("show-suggestions-awesomebar")
62+
checked = bool(checkbox.get_attribute("checked"))
63+
if value != checked:
64+
checkbox.click()
65+
if value and not awesome_bar_checkbox.get_attribute("checked"):
66+
awesome_bar_checkbox.click()
67+
return self
68+
5569
def search_engine_dropdown(self) -> Dropdown:
5670
"""Returns the Dropdown region for search engine prefs"""
5771
return Dropdown(

tests/address_bar_and_search/test_default_search_provider_change_legacy_search_bar.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,15 @@ def test_default_search_provider_change_legacy_search_bar(driver: Firefox):
3434
tabs.new_tab_by_button()
3535
nav.type_in_search_bar(SEARCH_TERM)
3636
nav.click_on_change_search_settings_button()
37-
driver.switch_to.window(driver.window_handles[2])
37+
driver.switch_to.window(driver.window_handles[1])
3838
assert driver.current_url == SEARCH_SETTINGS_URL
3939

4040
# Step 3: Open site, repeat nav to settings (validates correct tab handling)
4141
driver.get("https://9gag.com/")
4242
nav.type_in_search_bar(SEARCH_TERM)
4343
nav.click_on_change_search_settings_button()
4444
assert driver.current_url == "https://9gag.com/"
45-
driver.switch_to.window(driver.window_handles[3])
45+
driver.switch_to.window(driver.window_handles[2])
4646
assert driver.current_url == SEARCH_SETTINGS_URL
4747

4848
# Step 4: Change the default search engine
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import pytest
2+
from modules.browser_object import Navigation
3+
from modules.browser_object_panel_ui import PanelUi
4+
from modules.page_object_customize_firefox import CustomizeFirefox
5+
from modules.page_object_prefs import AboutPrefs
6+
7+
RANDOM_TEXT = "cluj"
8+
9+
10+
@pytest.fixture()
11+
def test_case():
12+
return "3028773"
13+
14+
15+
def test_search_suggestions_pref_affects_urlbar_and_searchbar(driver):
16+
nav = Navigation(driver)
17+
prefs = AboutPrefs(driver, category="search")
18+
panel_ui = PanelUi(driver)
19+
customize = CustomizeFirefox(driver)
20+
21+
# Add legacy search bar to toolbar.
22+
panel_ui.open_panel_menu()
23+
panel_ui.navigate_to_customize_toolbar()
24+
customize.add_widget_to_toolbar("search-bar")
25+
26+
# --- Step 1: Disable the pref
27+
prefs.open()
28+
prefs.select_search_suggestions_in_address_bar(False)
29+
30+
# --- Step 2: Validate NO suggestions when disabled (both in awesome and search bar)
31+
for search_mode in ["search", "awesome"]:
32+
has_suggestions = nav.search_and_check_if_suggestions_are_present(
33+
RANDOM_TEXT, search_mode
34+
)
35+
assert not has_suggestions, (
36+
"Suggestions should be disabled for the Address Bar."
37+
)
38+
39+
# --- Step 3: Re-enable to restore the original state
40+
prefs.open()
41+
prefs.select_search_suggestions_in_address_bar(True)
42+
43+
# --- Step 4: Validate that suggestions appear when enabled
44+
for search_mode in ["search", "awesome"]:
45+
has_suggestions = nav.search_and_check_if_suggestions_are_present(
46+
RANDOM_TEXT, search_mode, 3
47+
)
48+
assert has_suggestions, (
49+
f"{search_mode} Suggestions should be visible for the Address Bar when enabled."
50+
)

0 commit comments

Comments
 (0)