From 4f6c003bca5f6af7efe7d1896925ab277e7df80a Mon Sep 17 00:00:00 2001 From: Sarina Li Date: Mon, 22 Jul 2024 16:04:44 -0400 Subject: [PATCH 01/11] grab changes from other branch --- modules/browser_object.py | 1 + modules/browser_object_navigation.py | 7 +++ modules/browser_object_tracker_panel.py | 62 ++++++++++++++++++++++ modules/data/navigation.components.json | 12 ++++- modules/data/tracker_panel.components.json | 56 +++++++++++++++++++ 5 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 modules/browser_object_tracker_panel.py create mode 100644 modules/data/tracker_panel.components.json diff --git a/modules/browser_object.py b/modules/browser_object.py index a716e669..0dbd2924 100644 --- a/modules/browser_object.py +++ b/modules/browser_object.py @@ -10,3 +10,4 @@ from modules.browser_object_search_bar_context_menu import * from modules.browser_object_tab_context_menu import * from modules.browser_object_tabbar import * +from modules.browser_object_tracker_panel import * diff --git a/modules/browser_object_navigation.py b/modules/browser_object_navigation.py index d7f54f57..f0fd25e4 100644 --- a/modules/browser_object_navigation.py +++ b/modules/browser_object_navigation.py @@ -183,3 +183,10 @@ def wait_for_download_animation_finish( ) except TimeoutException: logging.warning("Animation did not finish or did not play.") + + def open_tracker_panel(self) -> BasePage: + """ + Clicks the shield icon and opens the panel associated with it + """ + self.get_element("shield-icon").click() + return self diff --git a/modules/browser_object_tracker_panel.py b/modules/browser_object_tracker_panel.py new file mode 100644 index 00000000..fca1733f --- /dev/null +++ b/modules/browser_object_tracker_panel.py @@ -0,0 +1,62 @@ +from typing import List + +from selenium.webdriver.remote.webelement import WebElement + +from modules.browser_object_navigation import Navigation +from modules.page_base import BasePage + + +class TrackerPanel(BasePage): + """ + BOM for the panel that shows up after clicking the shield + """ + + URL_TEMPLATE = "" + + def wait_for_blocked_tracking_icon( + self, nav: Navigation, page: BasePage + ) -> BasePage: + """ + Waits for the shield icon to indicate that cookies/trackers are being blocked by continuously refresing the page + + Remember to open the passed in page beforehand, this waits for the page to load. + + Example Usage: + first_tracker_website.open() + tracker_panel.wait_for_blocked_tracking_icon(nav, first_tracker_website) + """ + self.driver.set_context(self.driver.CONTEXT_CHROME) + try: + while 1: + nav.get_element("refresh-button").click() + + self.driver.set_context(self.driver.CONTEXT_CONTENT) + page.wait_for_page_to_load() + + self.driver.set_context(self.driver.CONTEXT_CHROME) + shield_icon = nav.get_element("shield-icon") + + if ( + shield_icon.get_attribute("data-l10n-id") + == "tracking-protection-icon-active-container" + ): + return + finally: + self.driver.set_context(self.driver.CONTEXT_CONTENT) + return self + + def verify_tracker_shield_indicator(self, nav: Navigation) -> BasePage: + with self.driver.context(self.driver.CONTEXT_CHROME): + shield_icon = nav.get_element("shield-icon") + assert ( + shield_icon.get_attribute("data-l10n-id") + == "tracking-protection-icon-active-container" + ), "The label detected did not correspond to the expected one: tracking-protection-icon-no-trackers-detected-container" + + def open_and_return_cross_site_trackers(self) -> List[WebElement]: + self.get_element("tracker-cross-site-tracking").click() + return self.get_elements("tracking-cross-site-tracking-item") + + def open_and_return_allowed_trackers(self) -> List[WebElement]: + self.get_element("tracker-tracking-content").click() + return self.get_elements("tracking-allowed-content-item") diff --git a/modules/data/navigation.components.json b/modules/data/navigation.components.json index 04739036..8851643a 100644 --- a/modules/data/navigation.components.json +++ b/modules/data/navigation.components.json @@ -189,7 +189,9 @@ "shield-icon": { "selectorData": "tracking-protection-icon-container", "strategy": "id", - "groups": [] + "groups": [ + "doNotCache" + ] }, "cryptominers": { @@ -220,5 +222,13 @@ "selectorData": "identity-popup-more-info", "strategy": "id", "groups": [] + }, + + "refresh-button": { + "selectorData": "reload-button", + "strategy": "id", + "groups": [ + "doNotCache" + ] } } diff --git a/modules/data/tracker_panel.components.json b/modules/data/tracker_panel.components.json new file mode 100644 index 00000000..ce74bedf --- /dev/null +++ b/modules/data/tracker_panel.components.json @@ -0,0 +1,56 @@ +{ + "context": "chrome", + "tracker-title": { + "selectorData": "protections-popup-mainView-panel-header-span", + "strategy": "id", + "groups": [] + }, + + "tracker-cross-site-tracking": { + "selectorData": "protections-popup-category-cookies", + "strategy": "id", + "groups": [] + }, + + "tracker-tracking-content": { + "selectorData": "protections-popup-category-trackers", + "strategy": "id", + "groups": [] + }, + + "tracking-social-media": { + "selectorData": "protections-popup-category-socialblock", + "strategy": "id", + "groups": [] + }, + + "tracking-finger-prints": { + "selectorData": "protections-popup-category-fingerprinters", + "strategy": "id", + "groups": [] + }, + + "tracking-crypto-miners": { + "selectorData": "protections-popup-category-cryptominers", + "strategy": "id", + "groups": [] + }, + + "tracking-cross-site-tracking-items": { + "selectorData": "vbox[class='protections-popup-cookiesView-list-section']", + "strategy": "css", + "groups": [] + }, + + "tracking-cross-site-tracking-item": { + "selectorData": "protections-popup-list-host-label", + "strategy": "class", + "groups": [] + }, + + "tracking-allowed-content-item": { + "selectorData": "protections-popup-list-host-label", + "strategy": "class", + "groups": [] + } +} \ No newline at end of file From 1acbfc66dad7ed27b0beccabbe66118dc5a4be73 Mon Sep 17 00:00:00 2001 From: Sarina Li Date: Mon, 22 Jul 2024 16:17:50 -0400 Subject: [PATCH 02/11] format --- ...est_trackers_crypto_fingerprint_blocked.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py diff --git a/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py b/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py new file mode 100644 index 00000000..73354a1b --- /dev/null +++ b/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py @@ -0,0 +1,20 @@ +from time import sleep + +import pytest +from selenium.webdriver import Firefox + +from modules.browser_object import Navigation, TrackerPanel +from modules.page_object import GenericPage + +TRACKER_URL = "https://senglehardt.com/test/trackingprotection/test_pages/fingerprinting_and_cryptomining_and_cookies.html" + + +def test_cross_site_trackrs_crypto_fingerprinter_blocked(driver: Firefox): + """ + C446393: Ensures that some trackers are blocked on certain website + """ + tracker_page = GenericPage(driver, url=TRACKER_URL).open() + tracker_panel = TrackerPanel(driver) + nav = Navigation(driver) + + nav.open_tracker_panel() From bc1ee4e03de1f18959fd4128fd22ccc26d3fcf61 Mon Sep 17 00:00:00 2001 From: Sarina Li Date: Tue, 23 Jul 2024 15:17:11 -0400 Subject: [PATCH 03/11] for now --- modules/browser_object_navigation.py | 6 +-- modules/data/tracker_panel.components.json | 12 ++++++ ...est_trackers_crypto_fingerprint_blocked.py | 37 ++++++++++++++++++- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/modules/browser_object_navigation.py b/modules/browser_object_navigation.py index 558469a7..9c93a32b 100644 --- a/modules/browser_object_navigation.py +++ b/modules/browser_object_navigation.py @@ -188,6 +188,6 @@ def open_tracker_panel(self) -> BasePage: """ Clicks the shield icon and opens the panel associated with it """ - # self.set_chrome_context() - self.get_element("shield-icon").click() - return self + with self.driver.context(self.context_id): + self.get_element("shield-icon").click() + return self diff --git a/modules/data/tracker_panel.components.json b/modules/data/tracker_panel.components.json index 72eb5847..ff4669b7 100644 --- a/modules/data/tracker_panel.components.json +++ b/modules/data/tracker_panel.components.json @@ -54,6 +54,18 @@ "groups": [] }, + "tracking-item-container": { + "selectorData": "protections-popup-category-list", + "strategy": "id", + "groups": [] + }, + + "tracking-item-container-label": { + "selectorData": "protections-popup-cookies-category-label", + "strategy": "id", + "groups": [] + }, + "shield-icon": { "selectorData": "tracking-protection-icon-container", "strategy": "id", diff --git a/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py b/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py index 73354a1b..2bccfcfd 100644 --- a/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py +++ b/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py @@ -1,3 +1,4 @@ +import logging from time import sleep import pytest @@ -13,8 +14,40 @@ def test_cross_site_trackrs_crypto_fingerprinter_blocked(driver: Firefox): """ C446393: Ensures that some trackers are blocked on certain website """ - tracker_page = GenericPage(driver, url=TRACKER_URL).open() + tracker_page = GenericPage(driver, url=TRACKER_URL) tracker_panel = TrackerPanel(driver) - nav = Navigation(driver) + nav = Navigation(driver).open() + tracker_page.open() + tracker_page.open() + tracker_panel.wait_for_blocked_tracking_icon(nav, tracker_page) nav.open_tracker_panel() + + driver.set_context(driver.CONTEXT_CHROME) + tracker_item_container = tracker_panel.get_element("tracking-item-container") + all_tracking_items = tracker_panel.get_all_children(tracker_item_container) + + blocked = set() + add_blocked = False + allowed = set() + add_allowed = False + + for item in all_tracking_items: + # encounter a blocked header (everything after it is blocked in the list) + if item.get_attribute("id") == "protections-popup-blocking-section-header": + add_allowed = False + add_blocked = True + elif item.get_attribute("id") == "protections-popup-not-blocking-section-header": + add_allowed = True + add_blocked = False + else: + child_labels = tracker_panel.get_element("tracking-item-container-label", multiple=True, parent_element=item) + for child in child_labels: + label = child.get_attribute("innerHTML") + if add_blocked: + blocked.add(label) + elif add_allowed: + allowed.add(label) + + logging.info(blocked) + logging.info(allowed) \ No newline at end of file From 2f6ce0c924d2ee0692a578f5cb12abfce285d5aa Mon Sep 17 00:00:00 2001 From: Sarina Li Date: Tue, 23 Jul 2024 15:17:18 -0400 Subject: [PATCH 04/11] format --- .../test_trackers_crypto_fingerprint_blocked.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py b/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py index 2bccfcfd..eeef8fe3 100644 --- a/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py +++ b/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py @@ -37,11 +37,15 @@ def test_cross_site_trackrs_crypto_fingerprinter_blocked(driver: Firefox): if item.get_attribute("id") == "protections-popup-blocking-section-header": add_allowed = False add_blocked = True - elif item.get_attribute("id") == "protections-popup-not-blocking-section-header": + elif ( + item.get_attribute("id") == "protections-popup-not-blocking-section-header" + ): add_allowed = True add_blocked = False else: - child_labels = tracker_panel.get_element("tracking-item-container-label", multiple=True, parent_element=item) + child_labels = tracker_panel.get_element( + "tracking-item-container-label", multiple=True, parent_element=item + ) for child in child_labels: label = child.get_attribute("innerHTML") if add_blocked: @@ -50,4 +54,4 @@ def test_cross_site_trackrs_crypto_fingerprinter_blocked(driver: Firefox): allowed.add(label) logging.info(blocked) - logging.info(allowed) \ No newline at end of file + logging.info(allowed) From a58efde0e0e8bbad490df5ceae448c3bbdeb034c Mon Sep 17 00:00:00 2001 From: Sarina Li Date: Wed, 24 Jul 2024 10:16:08 -0400 Subject: [PATCH 05/11] format --- .../test_blocking_cryptominers.py | 12 ++-- ...ominers_blocked_and_shown_in_info_panel.py | 12 ++-- ...est_trackers_crypto_fingerprint_blocked.py | 69 ++++++++++--------- 3 files changed, 51 insertions(+), 42 deletions(-) diff --git a/tests/security_and_privacy/test_blocking_cryptominers.py b/tests/security_and_privacy/test_blocking_cryptominers.py index 3e14dc1f..74029bb7 100644 --- a/tests/security_and_privacy/test_blocking_cryptominers.py +++ b/tests/security_and_privacy/test_blocking_cryptominers.py @@ -1,9 +1,7 @@ -from time import sleep - from selenium.webdriver import Firefox -from modules.browser_object_navigation import Navigation -from modules.page_object_about_prefs import AboutPrefs +from modules.browser_object import Navigation, TrackerPanel +from modules.page_object import AboutPrefs, GenericPage CRYPTOMINERS_URL = "https://senglehardt.com/test/trackingprotection/test_pages/fingerprinting_and_cryptomining.html" @@ -12,6 +10,8 @@ def test_blocking_cryptominers(driver: Firefox): # instantiate objects nav = Navigation(driver).open() about_prefs = AboutPrefs(driver, category="privacy").open() + tracker_panel = TrackerPanel(driver) + tracking_page = GenericPage(driver, url=CRYPTOMINERS_URL) # Select custom option and keep just cryptominers checked about_prefs.get_element("custom-radio").click() @@ -19,10 +19,10 @@ def test_blocking_cryptominers(driver: Firefox): about_prefs.get_element("tracking-checkbox").click() about_prefs.get_element("known-fingerprints-checkbox").click() about_prefs.get_element("suspected-fingerprints-checkbox").click() - sleep(2) # Access url and click on the shield icon and verify that cryptominers are blocked - driver.get(CRYPTOMINERS_URL) + tracking_page.open() + tracker_panel.wait_for_blocked_tracking_icon(nav, tracking_page) with driver.context(driver.CONTEXT_CHROME): nav.get_element("shield-icon").click() assert nav.get_element("cryptominers").is_displayed() diff --git a/tests/security_and_privacy/test_cryptominers_blocked_and_shown_in_info_panel.py b/tests/security_and_privacy/test_cryptominers_blocked_and_shown_in_info_panel.py index 0f8a23a9..138b1a5f 100644 --- a/tests/security_and_privacy/test_cryptominers_blocked_and_shown_in_info_panel.py +++ b/tests/security_and_privacy/test_cryptominers_blocked_and_shown_in_info_panel.py @@ -1,8 +1,7 @@ -from time import sleep - from selenium.webdriver import Firefox -from modules.browser_object_navigation import Navigation +from modules.browser_object import Navigation, TrackerPanel +from modules.page_object import GenericPage CRYPTOMINERS_URL = "https://senglehardt.com/test/trackingprotection/test_pages/fingerprinting_and_cryptomining.html" @@ -13,8 +12,11 @@ def test_cryptominers_blocked_and_shown_in_info_panel(driver: Firefox): """ # Access URL, needed sleep otherwise cryptomining will be displayed as unblocked nav = Navigation(driver) - sleep(4) - driver.get(CRYPTOMINERS_URL) + tracking_page = GenericPage(driver, url=CRYPTOMINERS_URL) + tracker_panel = TrackerPanel(driver) + + tracking_page.open() + tracker_panel.wait_for_blocked_tracking_icon(nav, tracking_page) # Click on the shield icon and verify that cryptominers are blocked with driver.context(driver.CONTEXT_CHROME): diff --git a/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py b/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py index eeef8fe3..7a85fec8 100644 --- a/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py +++ b/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py @@ -1,7 +1,3 @@ -import logging -from time import sleep - -import pytest from selenium.webdriver import Firefox from modules.browser_object import Navigation, TrackerPanel @@ -14,44 +10,55 @@ def test_cross_site_trackrs_crypto_fingerprinter_blocked(driver: Firefox): """ C446393: Ensures that some trackers are blocked on certain website """ + # instantiate objs tracker_page = GenericPage(driver, url=TRACKER_URL) tracker_panel = TrackerPanel(driver) nav = Navigation(driver).open() - tracker_page.open() + # wait for the shield icon tracker_page.open() tracker_panel.wait_for_blocked_tracking_icon(nav, tracker_page) nav.open_tracker_panel() + # get children driver.set_context(driver.CONTEXT_CHROME) tracker_item_container = tracker_panel.get_element("tracking-item-container") all_tracking_items = tracker_panel.get_all_children(tracker_item_container) - blocked = set() - add_blocked = False - allowed = set() - add_allowed = False + # instantiate test specific objs + blocked = set(["Cross-Site Tracking Cookies", "Fingerprinters", "Cryptominers"]) + allowed = set(["Tracking Content"]) + rm_blocked = False + rm_allowed = False for item in all_tracking_items: - # encounter a blocked header (everything after it is blocked in the list) - if item.get_attribute("id") == "protections-popup-blocking-section-header": - add_allowed = False - add_blocked = True - elif ( - item.get_attribute("id") == "protections-popup-not-blocking-section-header" - ): - add_allowed = True - add_blocked = False - else: - child_labels = tracker_panel.get_element( - "tracking-item-container-label", multiple=True, parent_element=item - ) - for child in child_labels: - label = child.get_attribute("innerHTML") - if add_blocked: - blocked.add(label) - elif add_allowed: - allowed.add(label) - - logging.info(blocked) - logging.info(allowed) + # encounter a header (everything after it is blocked/allowed in the list) + inner_html = item.get_attribute("innerHTML") + if "Blocked" in inner_html: + rm_blocked = True + continue + elif "Allowed" in inner_html: + rm_allowed = True + rm_blocked = False + continue + + # assign a temp memory location, assign the set to it depending on the header seen earlier + rm_set = set() + to_rm_item = "" + if rm_blocked: + rm_set = blocked + elif rm_allowed: + rm_set = allowed + + # go through the possible strings to look for, remove it if appropriate + for item in rm_set: + if item in inner_html: + to_rm_item = item + break + if to_rm_item != "": + rm_set.remove(to_rm_item) + + # ensure that we have seen all of the expected items in each section + assert ( + len(blocked) == 0 and len(allowed) == 0 + ), "Not all of the expected items were found in each of the Blocked/Allowed sections." From a8a25eab596c6119151cb016abe2fd3b6036d819 Mon Sep 17 00:00:00 2001 From: Sarina Li Date: Wed, 24 Jul 2024 10:17:57 -0400 Subject: [PATCH 06/11] add requireforpage --- modules/data/generic_page.components.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/data/generic_page.components.json b/modules/data/generic_page.components.json index 39f56e0f..69c0a581 100644 --- a/modules/data/generic_page.components.json +++ b/modules/data/generic_page.components.json @@ -26,7 +26,9 @@ "wiki-search-bar": { "selectorData": "cdx-text-input__input", "strategy": "class", - "groups": [] + "groups": [ + "requiredForPage" + ] }, "wiki-search-button": { From 439e6a05fa867c000313773255ecfe8222a63c10 Mon Sep 17 00:00:00 2001 From: Sarina Li Date: Wed, 24 Jul 2024 11:19:35 -0400 Subject: [PATCH 07/11] remove required for page --- modules/data/generic_page.components.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/data/generic_page.components.json b/modules/data/generic_page.components.json index 69c0a581..39f56e0f 100644 --- a/modules/data/generic_page.components.json +++ b/modules/data/generic_page.components.json @@ -26,9 +26,7 @@ "wiki-search-bar": { "selectorData": "cdx-text-input__input", "strategy": "class", - "groups": [ - "requiredForPage" - ] + "groups": [] }, "wiki-search-button": { From 98063c8753d67e79d9dbc53c7759284b1deddbcb Mon Sep 17 00:00:00 2001 From: Sarina Li Date: Wed, 24 Jul 2024 15:18:52 -0400 Subject: [PATCH 08/11] add usntable --- .../test_cookies_not_saved_private_browsing.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/security_and_privacy/test_cookies_not_saved_private_browsing.py b/tests/security_and_privacy/test_cookies_not_saved_private_browsing.py index df4cd99c..0f69c469 100644 --- a/tests/security_and_privacy/test_cookies_not_saved_private_browsing.py +++ b/tests/security_and_privacy/test_cookies_not_saved_private_browsing.py @@ -1,10 +1,11 @@ +import pytest from selenium.webdriver import Firefox from modules.browser_object import Navigation, PanelUi from modules.page_object import AboutPrefs, GenericPage from modules.util import BrowserActions - +@pytest.mark.unstable def test_cookies_not_saved_private_browsing(driver: Firefox): """ C101677: ensure that cookies are not saved after using private browsing From 1ad0579bc6a0bc2afc0570d7a7410ca1a5e63cce Mon Sep 17 00:00:00 2001 From: Sarina Li Date: Wed, 24 Jul 2024 15:19:06 -0400 Subject: [PATCH 09/11] format --- .../test_cookies_not_saved_private_browsing.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/security_and_privacy/test_cookies_not_saved_private_browsing.py b/tests/security_and_privacy/test_cookies_not_saved_private_browsing.py index 0f69c469..a5f06c54 100644 --- a/tests/security_and_privacy/test_cookies_not_saved_private_browsing.py +++ b/tests/security_and_privacy/test_cookies_not_saved_private_browsing.py @@ -5,6 +5,7 @@ from modules.page_object import AboutPrefs, GenericPage from modules.util import BrowserActions + @pytest.mark.unstable def test_cookies_not_saved_private_browsing(driver: Firefox): """ From 29f060786d9d97b7f447365c8d3d693729bd2710 Mon Sep 17 00:00:00 2001 From: Sarina Li Date: Fri, 26 Jul 2024 14:49:12 -0400 Subject: [PATCH 10/11] add hard wait --- .../test_trackers_crypto_fingerprint_blocked.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py b/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py index 7a85fec8..7f840324 100644 --- a/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py +++ b/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py @@ -1,3 +1,4 @@ +from time import sleep from selenium.webdriver import Firefox from modules.browser_object import Navigation, TrackerPanel @@ -15,6 +16,9 @@ def test_cross_site_trackrs_crypto_fingerprinter_blocked(driver: Firefox): tracker_panel = TrackerPanel(driver) nav = Navigation(driver).open() + # hard wait for fingerprinter blocker + sleep(4) + # wait for the shield icon tracker_page.open() tracker_panel.wait_for_blocked_tracking_icon(nav, tracker_page) From 1003d4c4f93efe7ee466bdb757819b3b00872111 Mon Sep 17 00:00:00 2001 From: Sarina Li Date: Fri, 26 Jul 2024 14:49:20 -0400 Subject: [PATCH 11/11] format --- .../test_trackers_crypto_fingerprint_blocked.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py b/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py index 7f840324..3d554169 100644 --- a/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py +++ b/tests/security_and_privacy/test_trackers_crypto_fingerprint_blocked.py @@ -1,4 +1,5 @@ from time import sleep + from selenium.webdriver import Firefox from modules.browser_object import Navigation, TrackerPanel