summaryrefslogtreecommitdiffstats
path: root/testing/webcompat/interventions
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /testing/webcompat/interventions
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/webcompat/interventions')
-rw-r--r--testing/webcompat/interventions/__init__.py0
-rw-r--r--testing/webcompat/interventions/conftest.py56
-rw-r--r--testing/webcompat/interventions/pytest.ini7
-rw-r--r--testing/webcompat/interventions/tests/__init__.py0
-rw-r--r--testing/webcompat/interventions/tests/test_1385206_rakuten_co_jp.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1448747_bathpublishing_com.py32
-rw-r--r--testing/webcompat/interventions/tests/test_1448747_bluetokaicoffee_com.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1448747_co2meter_com.py40
-rw-r--r--testing/webcompat/interventions/tests/test_1448747_discountcoffee_co_uk.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1448747_dylantalkstone_com.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1448747_fourbarrelcoffee_com.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1448747_franmar_com.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1448747_gofreeconcepts_de.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1448747_renewd_com_au.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1448747_thehawksmoor_com.py31
-rw-r--r--testing/webcompat/interventions/tests/test_1452707_absa.py19
-rw-r--r--testing/webcompat/interventions/tests/test_1457335_histography.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1472075_bankofamerica.py19
-rw-r--r--testing/webcompat/interventions/tests/test_1509873_viewer_zmags_com.py21
-rw-r--r--testing/webcompat/interventions/tests/test_1570108_steamcommunity.py136
-rw-r--r--testing/webcompat/interventions/tests/test_1570328_developer_apple_com.py29
-rw-r--r--testing/webcompat/interventions/tests/test_1574522_enuri_com.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1575000_lloydsbank.py41
-rw-r--r--testing/webcompat/interventions/tests/test_1577267_metfone_com_kh.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1577519_stream_directv_com.py37
-rw-r--r--testing/webcompat/interventions/tests/test_1579159_m_tailieu_vn.py26
-rw-r--r--testing/webcompat/interventions/tests/test_1582582_sling_com.py26
-rw-r--r--testing/webcompat/interventions/tests/test_1595215_uniqlo_com.py21
-rw-r--r--testing/webcompat/interventions/tests/test_1605611_maps_google_com.py34
-rw-r--r--testing/webcompat/interventions/tests/test_1610026_mobilesuica.py49
-rw-r--r--testing/webcompat/interventions/tests/test_1610344_directv_com_co.py47
-rw-r--r--testing/webcompat/interventions/tests/test_1622063_wp1-ext_usps_gov.py21
-rw-r--r--testing/webcompat/interventions/tests/test_1628455_autotrader_ca.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1631811_datastudio.py21
-rw-r--r--testing/webcompat/interventions/tests/test_1644830_missingmail_usps.py63
-rw-r--r--testing/webcompat/interventions/tests/test_1650317_livescience_com.py40
-rw-r--r--testing/webcompat/interventions/tests/test_1651292_www_jp_square-enix_com.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1651917_www_teletrader_com.py27
-rw-r--r--testing/webcompat/interventions/tests/test_1654877_preev_com.py32
-rw-r--r--testing/webcompat/interventions/tests/test_1654907_reactine_ca.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1694470_m_myvidster_com.py31
-rw-r--r--testing/webcompat/interventions/tests/test_1697324_mobile2_bmo_com.py21
-rw-r--r--testing/webcompat/interventions/tests/test_1704673_app_xiaomi_com.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1712807_www_dealnews_com.py31
-rw-r--r--testing/webcompat/interventions/tests/test_1712833_desuca.py18
-rw-r--r--testing/webcompat/interventions/tests/test_1719846_covid_cdc_gov.py21
-rw-r--r--testing/webcompat/interventions/tests/test_1719859_saxoinvestor.py28
-rw-r--r--testing/webcompat/interventions/tests/test_1722954_granbluefantasy_jp.py27
-rw-r--r--testing/webcompat/interventions/tests/test_1722955_frontgate_com.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1738317_vmos_cn.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1738319_yebocasino_co_za.py29
-rw-r--r--testing/webcompat/interventions/tests/test_1741234_alphalabs.py35
-rw-r--r--testing/webcompat/interventions/tests/test_1743627_renrenaud-bray_com.py25
-rw-r--r--testing/webcompat/interventions/tests/test_1743751_slrclub_com.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1743754_workflow_base_vn.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1753461_naver.py22
-rw-r--r--testing/webcompat/interventions/tests/test_1756872_www_dolcegabbana_com.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1765947_veniceincoming_com.py42
-rw-r--r--testing/webcompat/interventions/tests/test_1774490_rainews_it.py34
-rw-r--r--testing/webcompat/interventions/tests/test_1776897_www_edencast_fr.py59
-rw-r--r--testing/webcompat/interventions/tests/test_1778168_watch_antennaplus_gr.py22
-rw-r--r--testing/webcompat/interventions/tests/test_1784141_acuvue_com.py22
-rw-r--r--testing/webcompat/interventions/tests/test_1784141_aveeno_com.py22
-rw-r--r--testing/webcompat/interventions/tests/test_1784199_aptsovation_com.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1784199_avanabayview_com.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1784199_breakpointeandcoronado_com.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1784199_entrata_platform.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1784199_liveatlasathens_com.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1784199_liveobserverpark_com.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1784199_midwayurban_com.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1784199_nhcalaska_com.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1784199_securityproperties_com.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1784199_theloftsorlando_com.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1784199_thepointeatcentral_prospectportal_com.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1784199_vanallenapartments_com.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1784302_open_toutiao_com.py20
-rw-r--r--testing/webcompat/interventions/tests/test_1784361_coldwellbankerhomes_com.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1786404_business_help_royalmail_com.py46
-rw-r--r--testing/webcompat/interventions/tests/test_1793761_schoolnutritionandfitness_com.py32
-rw-r--r--testing/webcompat/interventions/tests/test_1795490_www_china-airlines_com.py25
-rw-r--r--testing/webcompat/interventions/tests/test_1797400_mobilevikings_be.py31
-rw-r--r--testing/webcompat/interventions/tests/test_1799968_samsung_com.py21
-rw-r--r--testing/webcompat/interventions/tests/test_1799994_vivobarefoot_com.py45
-rw-r--r--testing/webcompat/interventions/tests/test_1800000_www_honda_co_uk.py50
-rw-r--r--testing/webcompat/interventions/tests/test_1800241_mms_telekom_de.py19
-rw-r--r--testing/webcompat/interventions/tests/test_1800936_cov19ent_kdca_go_kr.py26
-rw-r--r--testing/webcompat/interventions/tests/test_1803131_www_argaam_com.py23
-rw-r--r--testing/webcompat/interventions/tests/test_1803976_youtube_com.py62
-rw-r--r--testing/webcompat/interventions/tests/test_1811325_inmac_wstore_com.py43
-rw-r--r--testing/webcompat/interventions/tests/test_1817520_ersthelfer_tv.py36
-rw-r--r--testing/webcompat/interventions/tests/test_1818818_marksandspencer_com.py33
-rw-r--r--testing/webcompat/interventions/tests/test_1818818_wellcare_com.py26
-rw-r--r--testing/webcompat/interventions/tests/test_1819450_cmbchina_com.py21
-rw-r--r--testing/webcompat/interventions/tests/test_1819476_axis_bank.py19
-rw-r--r--testing/webcompat/interventions/tests/test_1819476_axisbank_com.py18
-rw-r--r--testing/webcompat/interventions/tests/test_1819702_feelgoodcontacts_com.py21
-rw-r--r--testing/webcompat/interventions/tests/test_969844_mobile_de.py25
97 files changed, 2711 insertions, 0 deletions
diff --git a/testing/webcompat/interventions/__init__.py b/testing/webcompat/interventions/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/testing/webcompat/interventions/__init__.py
diff --git a/testing/webcompat/interventions/conftest.py b/testing/webcompat/interventions/conftest.py
new file mode 100644
index 0000000000..3cfd25436b
--- /dev/null
+++ b/testing/webcompat/interventions/conftest.py
@@ -0,0 +1,56 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+from ..fixtures import * # noqa: F403
+
+
+def pytest_generate_tests(metafunc):
+ """Generate tests based on markers."""
+
+ if "session" not in metafunc.fixturenames:
+ return
+
+ marks = [mark.name for mark in metafunc.function.pytestmark]
+
+ otherargs = {}
+ argvalues = []
+ ids = []
+
+ if "only_platforms" in marks:
+ for mark in metafunc.function.pytestmark:
+ if mark.name == "only_platforms":
+ otherargs["only_platforms"] = mark.args
+
+ if "skip_platforms" in marks:
+ for mark in metafunc.function.pytestmark:
+ if mark.name == "skip_platforms":
+ otherargs["skip_platforms"] = mark.args
+
+ if "with_interventions" in marks:
+ argvalues.append([dict({"interventions": True}, **otherargs)])
+ ids.append("with_interventions")
+
+ if "without_interventions" in marks:
+ argvalues.append([dict({"interventions": False}, **otherargs)])
+ ids.append("without_interventions")
+
+ metafunc.parametrize(["session"], argvalues, ids=ids, indirect=True)
+
+
+@pytest.fixture(scope="function") # noqa: F405
+async def test_config(request, driver):
+ params = request.node.callspec.params.get("session")
+
+ use_interventions = params.get("interventions")
+ print(f"use_interventions {use_interventions}")
+ if use_interventions is None:
+ raise ValueError(
+ "Missing intervention marker in %s:%s"
+ % (request.fspath, request.function.__name__)
+ )
+
+ return {
+ "use_interventions": use_interventions,
+ }
diff --git a/testing/webcompat/interventions/pytest.ini b/testing/webcompat/interventions/pytest.ini
new file mode 100644
index 0000000000..270690aed7
--- /dev/null
+++ b/testing/webcompat/interventions/pytest.ini
@@ -0,0 +1,7 @@
+[pytest]
+console_output_style = classic
+markers =
+ only_platforms: only run tests on specific platforms (mac, linux, windows, android)
+ skip_platforms: skip tests on specific platforms (mac, linux, windows, android)
+ with_interventions: enable web-compat interventions
+ without_interventions: disable web-compat interventions
diff --git a/testing/webcompat/interventions/tests/__init__.py b/testing/webcompat/interventions/tests/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/testing/webcompat/interventions/tests/__init__.py
diff --git a/testing/webcompat/interventions/tests/test_1385206_rakuten_co_jp.py b/testing/webcompat/interventions/tests/test_1385206_rakuten_co_jp.py
new file mode 100644
index 0000000000..a5dec6d9d8
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1385206_rakuten_co_jp.py
@@ -0,0 +1,23 @@
+import pytest
+
+URL = "http://www.rakuten.co.jp/"
+MOBILE_CSS = "#top-area"
+DESKTOP_CSS = "#header-group"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(MOBILE_CSS)
+ assert not client.find_css(DESKTOP_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_css(DESKTOP_CSS)
+ assert not client.find_css(MOBILE_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1448747_bathpublishing_com.py b/testing/webcompat/interventions/tests/test_1448747_bathpublishing_com.py
new file mode 100644
index 0000000000..0d6877ed15
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1448747_bathpublishing_com.py
@@ -0,0 +1,32 @@
+import pytest
+from webdriver.error import NoSuchElementException
+
+URL = "https://bathpublishing.com/products/clinical-negligence-made-clear-a-guide-for-patients-professionals"
+POPUP_CSS = "button.recommendation-modal__close-button"
+SELECT_CSS = "select#productSelect--product-template-option-0"
+
+
+async def is_fastclick_active(client):
+ await client.navigate(URL)
+
+ try:
+ client.soft_click(client.await_css(POPUP_CSS, timeout=3))
+ client.await_element_hidden(client.css(POPUP_CSS))
+ except NoSuchElementException:
+ pass
+
+ return client.test_for_fastclick(client.await_css(SELECT_CSS))
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert not await is_fastclick_active(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert await is_fastclick_active(client)
diff --git a/testing/webcompat/interventions/tests/test_1448747_bluetokaicoffee_com.py b/testing/webcompat/interventions/tests/test_1448747_bluetokaicoffee_com.py
new file mode 100644
index 0000000000..9f4bdc0959
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1448747_bluetokaicoffee_com.py
@@ -0,0 +1,23 @@
+import pytest
+
+URL = "https://bluetokaicoffee.com/collections/cold-brew-can"
+SELECT_CSS = "select#SortBy"
+
+
+async def is_fastclick_active(client):
+ await client.navigate(URL)
+ return client.test_for_fastclick(client.await_css(SELECT_CSS))
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert not await is_fastclick_active(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert await is_fastclick_active(client)
diff --git a/testing/webcompat/interventions/tests/test_1448747_co2meter_com.py b/testing/webcompat/interventions/tests/test_1448747_co2meter_com.py
new file mode 100644
index 0000000000..2932e9cb03
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1448747_co2meter_com.py
@@ -0,0 +1,40 @@
+import pytest
+from webdriver.error import NoSuchElementException
+
+URL = "https://www.co2meter.com/collections/restaurants-food"
+ITEM_CSS = "a.grid__image"
+ADD_CSS = "#AddToCart"
+SELECT_CSS = "select#address_country"
+POPUP_CLOSE_CSS = "button.needsclick.klaviyo-close-form"
+
+
+async def is_fastclick_active(client):
+ await client.navigate(URL)
+
+ client.soft_click(client.await_css(ITEM_CSS))
+ client.soft_click(client.await_css(ADD_CSS))
+
+ try:
+ popup_close_finder = client.css(POPUP_CLOSE_CSS)
+ popup_close = client.await_element(popup_close_finder, timeout=5)
+ if popup_close:
+ client.soft_click(popup_close)
+ client.await_element_hidden(popup_close_finder)
+ except NoSuchElementException:
+ pass
+
+ return client.test_for_fastclick(client.await_css(SELECT_CSS))
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert not await is_fastclick_active(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert await is_fastclick_active(client)
diff --git a/testing/webcompat/interventions/tests/test_1448747_discountcoffee_co_uk.py b/testing/webcompat/interventions/tests/test_1448747_discountcoffee_co_uk.py
new file mode 100644
index 0000000000..beb4f48ff9
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1448747_discountcoffee_co_uk.py
@@ -0,0 +1,23 @@
+import pytest
+
+URL = "https://www.discountcoffee.co.uk/collections/wholesale-coffee-beans"
+SELECT_CSS = "#collection-filter-type select"
+
+
+async def is_fastclick_active(client):
+ await client.navigate(URL)
+ return client.test_for_fastclick(client.await_css(SELECT_CSS))
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert not await is_fastclick_active(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert await is_fastclick_active(client)
diff --git a/testing/webcompat/interventions/tests/test_1448747_dylantalkstone_com.py b/testing/webcompat/interventions/tests/test_1448747_dylantalkstone_com.py
new file mode 100644
index 0000000000..af397a9ff0
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1448747_dylantalkstone_com.py
@@ -0,0 +1,23 @@
+import pytest
+
+URL = "https://dylantalkstone.com/collections/tele-pickups/products/flat-6-tele-pickups"
+SELECT_CSS = "select#productSelect-option-0"
+
+
+async def is_fastclick_active(client):
+ await client.navigate(URL)
+ return client.test_for_fastclick(client.await_css(SELECT_CSS))
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert not await is_fastclick_active(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert await is_fastclick_active(client)
diff --git a/testing/webcompat/interventions/tests/test_1448747_fourbarrelcoffee_com.py b/testing/webcompat/interventions/tests/test_1448747_fourbarrelcoffee_com.py
new file mode 100644
index 0000000000..2103853b27
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1448747_fourbarrelcoffee_com.py
@@ -0,0 +1,23 @@
+import pytest
+
+URL = "https://www.fourbarrelcoffee.com/"
+ADD_TO_CART_CSS = "#container a#menu-link"
+
+
+async def is_fastclick_active(client):
+ await client.navigate(URL)
+ return client.test_for_fastclick(client.await_css(ADD_TO_CART_CSS))
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert not await is_fastclick_active(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert await is_fastclick_active(client)
diff --git a/testing/webcompat/interventions/tests/test_1448747_franmar_com.py b/testing/webcompat/interventions/tests/test_1448747_franmar_com.py
new file mode 100644
index 0000000000..38690667ef
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1448747_franmar_com.py
@@ -0,0 +1,23 @@
+import pytest
+
+URL = "https://products.franmar.com/collections/consumer-products/"
+SELECT_CSS = "#sortBy"
+
+
+async def is_fastclick_active(client):
+ await client.navigate(URL)
+ return client.test_for_fastclick(client.await_css(SELECT_CSS))
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert not await is_fastclick_active(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert await is_fastclick_active(client)
diff --git a/testing/webcompat/interventions/tests/test_1448747_gofreeconcepts_de.py b/testing/webcompat/interventions/tests/test_1448747_gofreeconcepts_de.py
new file mode 100644
index 0000000000..dd51bff9da
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1448747_gofreeconcepts_de.py
@@ -0,0 +1,23 @@
+import pytest
+
+URL = "https://gofreeconcepts.de/collections/shamma-sandals/products/shamma-sandals-warriors-maximus-mit-lederfussbett"
+SELECT_CSS = "#productSelect"
+
+
+async def is_fastclick_active(client):
+ await client.navigate(URL)
+ return client.test_for_fastclick(client.await_css(SELECT_CSS))
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert not await is_fastclick_active(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert await is_fastclick_active(client)
diff --git a/testing/webcompat/interventions/tests/test_1448747_renewd_com_au.py b/testing/webcompat/interventions/tests/test_1448747_renewd_com_au.py
new file mode 100644
index 0000000000..b5ad4f90c7
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1448747_renewd_com_au.py
@@ -0,0 +1,23 @@
+import pytest
+
+URL = "https://renewd.com.au"
+ADD_TO_CART_CSS = "button[id].btn.add_to_cart"
+
+
+async def is_fastclick_active(client):
+ await client.navigate(URL)
+ return client.test_for_fastclick(client.await_css(ADD_TO_CART_CSS))
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert not await is_fastclick_active(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert await is_fastclick_active(client)
diff --git a/testing/webcompat/interventions/tests/test_1448747_thehawksmoor_com.py b/testing/webcompat/interventions/tests/test_1448747_thehawksmoor_com.py
new file mode 100644
index 0000000000..0f7efe2d0e
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1448747_thehawksmoor_com.py
@@ -0,0 +1,31 @@
+import pytest
+from webdriver.error import NoSuchElementException
+
+URL = "https://thehawksmoor.com/book-a-table/?location=11335"
+POPUP_CSS = ".pum-overlay button.pum-close"
+SELECT_CSS = "select#booktable_restaurants"
+
+
+async def is_fastclick_active(client):
+ await client.navigate(URL)
+
+ try:
+ client.soft_click(client.await_css(POPUP_CSS, timeout=3))
+ except NoSuchElementException:
+ pass
+
+ return client.test_for_fastclick(client.await_css(SELECT_CSS))
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert not await is_fastclick_active(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert await is_fastclick_active(client)
diff --git a/testing/webcompat/interventions/tests/test_1452707_absa.py b/testing/webcompat/interventions/tests/test_1452707_absa.py
new file mode 100644
index 0000000000..2c0a1ad35a
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1452707_absa.py
@@ -0,0 +1,19 @@
+import pytest
+
+URL = "https://ib.absa.co.za/absa-online/login.jsp"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.find_css("html.gecko")
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.alert.text == "Browser unsupported"
+ client.alert.dismiss()
+ assert client.find_css("html.unknown")
diff --git a/testing/webcompat/interventions/tests/test_1457335_histography.py b/testing/webcompat/interventions/tests/test_1457335_histography.py
new file mode 100644
index 0000000000..9e437d52b6
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1457335_histography.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "http://histography.io/"
+SUPPORT_URL = "http://histography.io/browser_support.htm"
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.current_url == URL
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.current_url == SUPPORT_URL
diff --git a/testing/webcompat/interventions/tests/test_1472075_bankofamerica.py b/testing/webcompat/interventions/tests/test_1472075_bankofamerica.py
new file mode 100644
index 0000000000..d49c141c46
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1472075_bankofamerica.py
@@ -0,0 +1,19 @@
+import pytest
+
+URL = "https://www.bankofamerica.com/"
+
+
+@pytest.mark.asyncio
+@pytest.mark.skip_platforms("android", "windows")
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert not client.find_css("#browserUpgradeNoticeBar")
+
+
+@pytest.mark.asyncio
+@pytest.mark.skip_platforms("android", "windows")
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.is_displayed(client.await_css("#browserUpgradeNoticeBar"))
diff --git a/testing/webcompat/interventions/tests/test_1509873_viewer_zmags_com.py b/testing/webcompat/interventions/tests/test_1509873_viewer_zmags_com.py
new file mode 100644
index 0000000000..50a48f1ccd
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1509873_viewer_zmags_com.py
@@ -0,0 +1,21 @@
+import pytest
+
+URL = "https://secure.viewer.zmags.com/services/htmlviewer/content/ddc3f3b9?pubVersion=46&locale=en&viewerID=85cfd72f#/ddc3f3b9/1"
+BLOCKED_TEXT = "This browser is not supported"
+UNBLOCKED_CSS = "#viewer .MainViewEnabled"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(UNBLOCKED_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_text(BLOCKED_TEXT)
diff --git a/testing/webcompat/interventions/tests/test_1570108_steamcommunity.py b/testing/webcompat/interventions/tests/test_1570108_steamcommunity.py
new file mode 100644
index 0000000000..bef7efd9d5
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1570108_steamcommunity.py
@@ -0,0 +1,136 @@
+import pytest
+
+URL = "https://steamcommunity.com/chat"
+
+
+USERID_CSS = "input[type='text'][class*='newlogindialog']"
+PASSWORD_CSS = "input[type='password'][class*='newlogindialog']"
+SIGNIN_CSS = "button[type='submit'][class*='newlogindialog']"
+GEAR_CSS = ".friendListButton"
+LOGIN_FAIL_XPATH = (
+ "//*[contains(text(), 'try again') and " "contains(@class, 'FormError')]"
+)
+AUTH_CSS = "[class*='newlogindialog_ProtectingAccount']"
+AUTH_DIGITS_CSS = "[class*='newlogindialog_SegmentedCharacterInput'] input[type='text']"
+AUTH_RETRY_CSS = "[class*='newlogindialog_TryAgainButton']"
+AUTH_RETRY_LOADER_CSS = "[class*='newlogindialog_Loading']"
+RATE_TEXT = "too many login failures"
+VOICE_XPATH = (
+ "//*[contains(text(), 'Voice') and "
+ "contains(@class, 'pagedsettings_PagedSettingsDialog_PageListItem')]"
+)
+MIC_BUTTON_CSS = "button.LocalMicTestButton"
+UNSUPPORTED_TEXT = "currently unsupported in Firefox"
+
+
+async def do_2fa(client):
+ digits = client.find_css(AUTH_DIGITS_CSS, all=True)
+ assert len(digits) > 0
+
+ loader = client.css(AUTH_RETRY_LOADER_CSS)
+ if client.find_element(loader):
+ client.await_element_hidden(loader)
+ for digit in digits:
+ if digit.property("value"):
+ digit.send_keys(u"\ue003") # backspace
+
+ code = input("**** Enter two-factor authentication code: ")
+ for i, digit in enumerate(code):
+ if len(digits) > i:
+ digits[i].send_keys(digit)
+
+ client.await_element(loader, timeout=10)
+ client.await_element_hidden(loader)
+
+
+async def load_mic_test(client, credentials, should_do_2fa):
+ await client.navigate(URL)
+
+ async def login():
+ userid = client.await_css(USERID_CSS)
+ password = client.find_css(PASSWORD_CSS)
+ submit = client.find_css(SIGNIN_CSS)
+ assert client.is_displayed(userid)
+ assert client.is_displayed(password)
+ assert client.is_displayed(submit)
+
+ userid.send_keys(credentials["username"])
+ password.send_keys(credentials["password"])
+ submit.click()
+
+ await login()
+
+ while True:
+ auth, retry, gear, fail, rate = client.await_first_element_of(
+ [
+ client.css(AUTH_CSS),
+ client.css(AUTH_RETRY_CSS),
+ client.css(GEAR_CSS),
+ client.xpath(LOGIN_FAIL_XPATH),
+ client.text(RATE_TEXT),
+ ],
+ is_displayed=True,
+ timeout=20,
+ )
+
+ if retry:
+ await do_2fa(client)
+ continue
+
+ if rate:
+ pytest.skip(
+ "Too many Steam login attempts in a short time; try again later."
+ )
+ return None
+ elif auth:
+ if should_do_2fa:
+ await do_2fa(client)
+ continue
+
+ pytest.skip(
+ "Two-factor authentication requested; disable Steam Guard"
+ " or run this test with --do-2fa to live-input codes"
+ )
+ return None
+ elif fail:
+ pytest.skip("Invalid login provided.")
+ return None
+ else:
+ break
+
+ assert gear
+ gear.click()
+
+ voice = client.await_xpath(VOICE_XPATH, is_displayed=True)
+ voice.click()
+
+ mic_test = client.await_css(MIC_BUTTON_CSS, is_displayed=True)
+ return mic_test
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client, credentials, should_do_2fa):
+ mic_test = await load_mic_test(client, credentials, should_do_2fa)
+ if not mic_test:
+ return
+
+ with client.assert_getUserMedia_called():
+ mic_test.click()
+
+ assert not client.find_text(UNSUPPORTED_TEXT)
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client, credentials, should_do_2fa):
+ mic_test = await load_mic_test(client, credentials, should_do_2fa)
+ if not mic_test:
+ return
+
+ mic_test.click()
+
+ unsupported = client.await_text(UNSUPPORTED_TEXT)
+ assert client.is_displayed(unsupported)
diff --git a/testing/webcompat/interventions/tests/test_1570328_developer_apple_com.py b/testing/webcompat/interventions/tests/test_1570328_developer_apple_com.py
new file mode 100644
index 0000000000..c40b530a62
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1570328_developer_apple_com.py
@@ -0,0 +1,29 @@
+import pytest
+
+URL = "https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/AboutBundles/AboutBundles.html"
+TOC_CSS = "#toc"
+
+
+def toc_is_onscreen(client):
+ assert client.await_css(TOC_CSS, is_displayed=True)
+ return client.execute_script(
+ """
+ return document.querySelector("#toc").getBoundingClientRect().left >= 0;
+ """
+ )
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert toc_is_onscreen(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert not toc_is_onscreen(client)
diff --git a/testing/webcompat/interventions/tests/test_1574522_enuri_com.py b/testing/webcompat/interventions/tests/test_1574522_enuri_com.py
new file mode 100644
index 0000000000..156d2b2f36
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1574522_enuri_com.py
@@ -0,0 +1,23 @@
+import pytest
+
+# The site puts an exclamation mark in front of width="703"
+# for Chrome UAs, but not for Firefox.
+
+URL = "http://enuri.com/knowcom/detail.jsp?kbno=474985"
+CHECK_CSS = "td[width='703']"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert not client.find_css(CHECK_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.find_css(CHECK_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1575000_lloydsbank.py b/testing/webcompat/interventions/tests/test_1575000_lloydsbank.py
new file mode 100644
index 0000000000..00426dd6aa
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1575000_lloydsbank.py
@@ -0,0 +1,41 @@
+import pytest
+
+URL = (
+ "https://apply.lloydsbank.co.uk/sales-content/cwa/l/pca/index-app.html"
+ "?product=classicaccountLTB#!b"
+)
+
+NO_CSS = "[data-selector='existingCustomer-toggle-button-no']"
+CONT_CSS = "[data-selector='ib-yes-continue-without-login-not-existing-customer-continue-button']"
+CONT2_CSS = "[data-selector='beforeYouStart-continue-button']"
+RADIO_CSS = "[name='aboutYou-gender-radio'] + span"
+ACCEPT_COOKIES_CSS = "#lbganalyticsCookies [title*='Accept cookies']"
+
+
+async def get_radio_position(client):
+ await client.navigate(URL)
+ accept = client.await_css(ACCEPT_COOKIES_CSS, timeout=2)
+ if accept:
+ accept.click()
+ client.await_css(NO_CSS).click()
+ client.await_css(CONT_CSS).click()
+ client.await_css(CONT2_CSS).click()
+ radio = client.await_css(RADIO_CSS)
+ return client.execute_script(
+ """
+ return window.getComputedStyle(arguments[0]).position;
+ """,
+ radio,
+ )
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert "relative" == await get_radio_position(client)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert "relative" != await get_radio_position(client)
diff --git a/testing/webcompat/interventions/tests/test_1577267_metfone_com_kh.py b/testing/webcompat/interventions/tests/test_1577267_metfone_com_kh.py
new file mode 100644
index 0000000000..3cc4870b42
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1577267_metfone_com_kh.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://www.metfone.com.kh/en/4g-lte"
+DESKTOP_CSS = "section.quickLinks"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert not client.find_css(DESKTOP_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.find_css(DESKTOP_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1577519_stream_directv_com.py b/testing/webcompat/interventions/tests/test_1577519_stream_directv_com.py
new file mode 100644
index 0000000000..fde07de470
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1577519_stream_directv_com.py
@@ -0,0 +1,37 @@
+import pytest
+
+URL = "https://stream.directv.com/"
+LOGIN_CSS = "#userID"
+UNSUPPORTED_CSS = ".title-new-browse-ff"
+DENIED_XPATH = "//h1[text()='Access Denied']"
+
+
+async def check_site(client, should_pass):
+ await client.navigate(URL)
+
+ denied, login, unsupported = client.await_first_element_of(
+ [
+ client.xpath(DENIED_XPATH),
+ client.css(LOGIN_CSS),
+ client.css(UNSUPPORTED_CSS),
+ ],
+ is_displayed=True,
+ )
+
+ if denied:
+ pytest.skip("Region-locked, cannot test. Try using a VPN set to USA.")
+ return
+
+ assert (should_pass and login) or (not should_pass and unsupported)
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await check_site(client, should_pass=True)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await check_site(client, should_pass=False)
diff --git a/testing/webcompat/interventions/tests/test_1579159_m_tailieu_vn.py b/testing/webcompat/interventions/tests/test_1579159_m_tailieu_vn.py
new file mode 100644
index 0000000000..59f48097f3
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1579159_m_tailieu_vn.py
@@ -0,0 +1,26 @@
+import pytest
+
+URL = (
+ "https://m.tailieu.vn/index/mobile/id/1654340/hash/654d7ea9c2853e5be07e2c792ea7f168"
+)
+PAGE_CSS = "#viewer > #pageContainer1"
+OK_ERROR_CSS = "#errorMessage"
+ERROR_MSG = "may not load data from http://tailieu.vn/html5/pdf.js"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ page, ok_error = client.await_first_element_of(
+ [client.css(PAGE_CSS), client.css(OK_ERROR_CSS)], is_displayed=True
+ )
+ assert page or ok_error
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL, await_console_message=ERROR_MSG)
diff --git a/testing/webcompat/interventions/tests/test_1582582_sling_com.py b/testing/webcompat/interventions/tests/test_1582582_sling_com.py
new file mode 100644
index 0000000000..71f6910af9
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1582582_sling_com.py
@@ -0,0 +1,26 @@
+import pytest
+
+URL = "https://watch.sling.com/"
+INCOMPATIBLE_CSS = "[class*='unsupported-browser']"
+LOADER_CSS = ".loader-container"
+VPN_TEXT = "ONLY AVAILABLE INSIDE THE US"
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ loader, vpn = client.await_first_element_of(
+ [client.css(LOADER_CSS), client.text(VPN_TEXT)], timeout=20
+ )
+ assert loader or vpn
+ assert not client.find_css(INCOMPATIBLE_CSS)
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_css(INCOMPATIBLE_CSS, timeout=2000)
diff --git a/testing/webcompat/interventions/tests/test_1595215_uniqlo_com.py b/testing/webcompat/interventions/tests/test_1595215_uniqlo_com.py
new file mode 100644
index 0000000000..f87f8349b0
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1595215_uniqlo_com.py
@@ -0,0 +1,21 @@
+import pytest
+
+URL = "https://store-kr.uniqlo.com/"
+REDIRECT_CSS = "[onload='javascript:redirectPage();']"
+APP_CSS = "uni-root"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(APP_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_css(REDIRECT_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1605611_maps_google_com.py b/testing/webcompat/interventions/tests/test_1605611_maps_google_com.py
new file mode 100644
index 0000000000..c8aadc2e3e
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1605611_maps_google_com.py
@@ -0,0 +1,34 @@
+import pytest
+
+# Google puts [disabled="true"] on buttons, which causes them to not
+# work in Firefox. Our intervention removes that [disabled] property.
+
+URL = "https://www.google.com/maps/dir/Fettstra%C3%9Fe+20,+D-20357+Hamburg,+Deutschland/Hauptkirche+St.+Michaelis,+Englische+Planke,+Hamburg/@53.5586949,9.9852882,14z/data=!4m8!4m7!1m2!1m1!1s0x47b18f4493d02fe1:0x6280c2a6cea3ed83!1m2!1m1!1s0x47b18f11e1dd5b45:0x187d5dca009a4b19!3e3?gl=de"
+BUTTON_CSS = "button[jsaction^='directionsSearchbox.time']"
+
+
+def button_is_disabled(client):
+ button = client.await_css(BUTTON_CSS, is_displayed=True)
+ assert button
+ return client.execute_script(
+ """
+ return arguments[0].getAttribute("disabled") === "true";
+ """,
+ button,
+ )
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert not button_is_disabled(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert button_is_disabled(client)
diff --git a/testing/webcompat/interventions/tests/test_1610026_mobilesuica.py b/testing/webcompat/interventions/tests/test_1610026_mobilesuica.py
new file mode 100644
index 0000000000..444fe8471f
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1610026_mobilesuica.py
@@ -0,0 +1,49 @@
+import pytest
+
+ADDRESS_CSS = "input[name=MailAddress]"
+PASSWORD_CSS = "input[name=Password]"
+CLOSE_BUTTON_CSS = "input[name=winclosebutton]"
+UNAVAILABLE_TEXT = "時間をお確かめの上、再度実行してください。"
+UNSUPPORTED_TEXT = "ご利用のブラウザでは正しく"
+
+
+async def load_site(client):
+ await client.navigate("https://www.mobilesuica.com/")
+
+ address = client.find_css(ADDRESS_CSS)
+ password = client.find_css(PASSWORD_CSS)
+ error1 = client.find_css(CLOSE_BUTTON_CSS)
+ error2 = client.find_text(UNSUPPORTED_TEXT)
+
+ # The page can be down at certain times, making testing impossible. For instance:
+ # "モバイルSuicaサービスが可能な時間は4:00~翌日2:00です。
+ # 時間をお確かめの上、再度実行してください。"
+ # "Mobile Suica service is available from 4:00 to 2:00 the next day.
+ # Please check the time and try again."
+ site_is_down = client.find_text(UNAVAILABLE_TEXT)
+ if site_is_down is not None:
+ pytest.xfail("Site is currently down")
+
+ return address, password, error1 or error2, site_is_down
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ address, password, error, site_is_down = await load_site(client)
+ if site_is_down:
+ return
+ assert client.is_displayed(address)
+ assert client.is_displayed(password)
+ assert error is None
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ address, password, error, site_is_down = await load_site(client)
+ if site_is_down:
+ return
+ assert address is None
+ assert password is None
+ assert client.is_displayed(error)
diff --git a/testing/webcompat/interventions/tests/test_1610344_directv_com_co.py b/testing/webcompat/interventions/tests/test_1610344_directv_com_co.py
new file mode 100644
index 0000000000..d832eb33d2
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1610344_directv_com_co.py
@@ -0,0 +1,47 @@
+import pytest
+
+URL = "https://www.directv.com.co/"
+IFRAME_CSS = "#main-iframe"
+INCOMPATIBLE_CSS = ".browser-compatible.compatible.incompatible"
+BLOCKED_TEXT = "blocked by the security rules"
+DENIED_TEXT = "not available in your region"
+FORBIDDEN_TEXT = "403 Forbidden"
+
+
+async def check_unsupported_visibility(client, should_show):
+ await client.navigate(URL)
+
+ # their region-block page sometimes wraps the content in an iframe
+ frame = client.find_css(IFRAME_CSS)
+ if frame:
+ client.switch_frame(frame)
+
+ denied, blocked, forbidden, incompatible = client.await_first_element_of(
+ [
+ client.text(DENIED_TEXT),
+ client.text(BLOCKED_TEXT),
+ client.text(FORBIDDEN_TEXT),
+ client.css(INCOMPATIBLE_CSS),
+ ]
+ )
+
+ if denied or blocked or forbidden:
+ pytest.skip("Region-locked, cannot test. Try using a VPN set to USA.")
+ return
+
+ shown = client.is_displayed(incompatible)
+ assert (should_show and shown) or (not should_show and not shown)
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await check_unsupported_visibility(client, should_show=False)
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await check_unsupported_visibility(client, should_show=True)
diff --git a/testing/webcompat/interventions/tests/test_1622063_wp1-ext_usps_gov.py b/testing/webcompat/interventions/tests/test_1622063_wp1-ext_usps_gov.py
new file mode 100644
index 0000000000..e55adf0dbe
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1622063_wp1-ext_usps_gov.py
@@ -0,0 +1,21 @@
+import pytest
+
+URL = "https://wp1-ext.usps.gov/sap/bc/webdynpro/sap/hrrcf_a_unreg_job_search"
+BLOCKED_TEXT = "This browser is not supported"
+UNBLOCKED_CSS = "#sapwd_main_window_root_"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(UNBLOCKED_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_text(BLOCKED_TEXT)
diff --git a/testing/webcompat/interventions/tests/test_1628455_autotrader_ca.py b/testing/webcompat/interventions/tests/test_1628455_autotrader_ca.py
new file mode 100644
index 0000000000..e5fe67d814
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1628455_autotrader_ca.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://www.autotrader.ca/"
+MOBILE_CSS = "#openInApp"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.find_css(MOBILE_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert not client.find_css(MOBILE_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1631811_datastudio.py b/testing/webcompat/interventions/tests/test_1631811_datastudio.py
new file mode 100644
index 0000000000..2075ee59eb
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1631811_datastudio.py
@@ -0,0 +1,21 @@
+import pytest
+
+URL = "https://ageor.dipot.com/2020/03/Covid-19-in-Greece.html"
+FRAME_CSS = "iframe[src^='https://datastudio.google.com/']"
+FRAME_TEXT = "Coranavirus SARS-CoV-2 (Covid-19) in Greece"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.load_page_and_wait_for_iframe(URL, client.css(FRAME_CSS))
+ assert client.execute_script("return window.indexedDB === undefined;")
+ success_text = client.await_text(FRAME_TEXT)
+ assert client.is_displayed(success_text)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.load_page_and_wait_for_iframe(URL, client.css(FRAME_CSS))
+ assert client.execute_script("return window.indexedDB !== undefined;")
diff --git a/testing/webcompat/interventions/tests/test_1644830_missingmail_usps.py b/testing/webcompat/interventions/tests/test_1644830_missingmail_usps.py
new file mode 100644
index 0000000000..39a2db683a
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1644830_missingmail_usps.py
@@ -0,0 +1,63 @@
+import pytest
+
+URL = (
+ "https://missingmail.usps.com/?_gl=1*veidlp*_gcl_aw*R0NMLjE1OTE3MjUyNTkuRUF"
+ "JYUlRb2JDaE1Jd3AzaTBhYjE2UUlWa01EQUNoMlBBUVlrRUFBWUFTQUFFZ0lMeFBEX0J3RQ..*"
+ "_gcl_dc*R0NMLjE1OTE3MjUyNTkuRUFJYUlRb2JDaE1Jd3AzaTBhYjE2UUlWa01EQUNoMlBBUV"
+ "lrRUFBWUFTQUFFZ0lMeFBEX0J3RQ..#/"
+)
+
+USERNAME_CSS = "#username"
+PASSWORD_CSS = "#password"
+SIGN_IN_CSS = "#btn-submit"
+TERMS_CHECKBOX_CSS = "#tc-checkbox"
+TERMS_FAUX_CHECKBOX_CSS = "#tc-checkbox + .mrc-custom-checkbox"
+
+# The USPS missing mail website takes a very long time to load (multiple
+# minutes). We give them a very generous amount of time here, but will
+# give up after that and just skip the rest of the test.
+TIMEOUT = 900
+TIMEOUT_MESSAGE = "USPS website is too slow, skipping test"
+
+
+async def are_checkboxes_clickable(client, credentials):
+ await client.navigate(URL)
+
+ username = client.await_css(USERNAME_CSS)
+ password = client.find_css(PASSWORD_CSS)
+ sign_in = client.find_css(SIGN_IN_CSS)
+ assert client.is_displayed(username)
+ assert client.is_displayed(password)
+ assert client.is_displayed(sign_in)
+
+ username.send_keys(credentials["username"])
+ password.send_keys(credentials["password"])
+ sign_in.click()
+
+ tc = client.await_css(TERMS_CHECKBOX_CSS, timeout=TIMEOUT)
+ if tc is None:
+ pytest.skip(TIMEOUT_MESSAGE)
+ return
+
+ assert not tc.selected
+
+ # we need to simulate a real click on the checkbox
+ tfc = client.find_css(TERMS_FAUX_CHECKBOX_CSS)
+ await client.dom_ready()
+ client.execute_script("arguments[0].scrollIntoView(true)", tfc)
+ client.mouse.click(tfc).perform()
+ return tc.selected
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client, credentials):
+ assert await are_checkboxes_clickable(client, credentials)
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client, credentials):
+ assert not await are_checkboxes_clickable(client, credentials)
diff --git a/testing/webcompat/interventions/tests/test_1650317_livescience_com.py b/testing/webcompat/interventions/tests/test_1650317_livescience_com.py
new file mode 100644
index 0000000000..f9cb71c571
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1650317_livescience_com.py
@@ -0,0 +1,40 @@
+import pytest
+
+URL = "https://www.livescience.com/"
+TEXT_TO_TEST = ".trending__link"
+
+
+async def is_text_visible(client):
+ # the page does not properly load, so we just time out
+ # and wait for the element we're interested in to appear
+ await client.navigate(URL, timeout=1)
+ link = client.await_css(TEXT_TO_TEST)
+ assert client.is_displayed(link)
+ return client.execute_async_script(
+ """
+ const link = arguments[0];
+ const cb = arguments[1];
+ const fullHeight = link.scrollHeight;
+ const parentVisibleHeight = link.parentElement.clientHeight;
+ link.style.paddingBottom = "0";
+ window.requestAnimationFrame(() => {
+ const bottomPaddingHeight = fullHeight - link.scrollHeight;
+ cb(fullHeight - parentVisibleHeight <= bottomPaddingHeight);
+ });
+ """,
+ link,
+ )
+
+
+@pytest.mark.skip_platforms("android", "mac")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert await is_text_visible(client)
+
+
+@pytest.mark.skip_platforms("android", "mac")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert not await is_text_visible(client)
diff --git a/testing/webcompat/interventions/tests/test_1651292_www_jp_square-enix_com.py b/testing/webcompat/interventions/tests/test_1651292_www_jp_square-enix_com.py
new file mode 100644
index 0000000000..d8c7844c54
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1651292_www_jp_square-enix_com.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://www.jp.square-enix.com/music/sem/page/FF7R/ost/"
+ERROR_MSG = 'can\'t access property "slice", e.match(...) is null'
+UNBLOCKED_CSS = "h1.logo.visible"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(UNBLOCKED_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL, await_console_message=ERROR_MSG)
diff --git a/testing/webcompat/interventions/tests/test_1651917_www_teletrader_com.py b/testing/webcompat/interventions/tests/test_1651917_www_teletrader_com.py
new file mode 100644
index 0000000000..deda666ebb
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1651917_www_teletrader_com.py
@@ -0,0 +1,27 @@
+import pytest
+
+URL = "https://www.teletrader.com/"
+
+
+def body_is_offscreen(client):
+ return client.execute_script(
+ """
+ return document.body.getBoundingClientRect().left > 0;
+ """
+ )
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert not body_is_offscreen(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert body_is_offscreen(client)
diff --git a/testing/webcompat/interventions/tests/test_1654877_preev_com.py b/testing/webcompat/interventions/tests/test_1654877_preev_com.py
new file mode 100644
index 0000000000..398dd8b6e3
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1654877_preev_com.py
@@ -0,0 +1,32 @@
+import pytest
+
+URL = "http://preev.com/"
+INPUT_CSS = "#invField"
+
+
+def no_number_arrows_appear(client):
+ inp = client.await_css(INPUT_CSS, is_displayed=True)
+ assert inp
+ inp.click()
+ return client.execute_script(
+ """
+ return getComputedStyle(arguments[0]).appearance == "textfield";
+ """,
+ inp,
+ )
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert no_number_arrows_appear(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert not no_number_arrows_appear(client)
diff --git a/testing/webcompat/interventions/tests/test_1654907_reactine_ca.py b/testing/webcompat/interventions/tests/test_1654907_reactine_ca.py
new file mode 100644
index 0000000000..6b277db8c0
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1654907_reactine_ca.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://www.reactine.ca/products/"
+BANNER_CSS = "#browser-alert"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(BANNER_CSS, is_displayed=False)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_css(BANNER_CSS, is_displayed=True)
diff --git a/testing/webcompat/interventions/tests/test_1694470_m_myvidster_com.py b/testing/webcompat/interventions/tests/test_1694470_m_myvidster_com.py
new file mode 100644
index 0000000000..1daec3fa83
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1694470_m_myvidster_com.py
@@ -0,0 +1,31 @@
+import pytest
+
+URL = "https://m.myvidster.com/"
+CONTAINER_CSS = "#home_refresh_var"
+
+
+def content_is_cropped(client):
+ container = client.await_css(CONTAINER_CSS, is_displayed=True)
+ assert container
+ return client.execute_script(
+ """
+ return arguments[0].clientHeight < 100
+ """,
+ container,
+ )
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert not content_is_cropped(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert content_is_cropped(client)
diff --git a/testing/webcompat/interventions/tests/test_1697324_mobile2_bmo_com.py b/testing/webcompat/interventions/tests/test_1697324_mobile2_bmo_com.py
new file mode 100644
index 0000000000..72f3e16fa5
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1697324_mobile2_bmo_com.py
@@ -0,0 +1,21 @@
+import pytest
+
+URL = "https://mobile2.bmo.com/"
+BLOCKED_TEXT = "This browser is out-of-date"
+UNBLOCKED_CSS = "auth-field"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(UNBLOCKED_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_text(BLOCKED_TEXT)
diff --git a/testing/webcompat/interventions/tests/test_1704673_app_xiaomi_com.py b/testing/webcompat/interventions/tests/test_1704673_app_xiaomi_com.py
new file mode 100644
index 0000000000..229bb1f77e
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1704673_app_xiaomi_com.py
@@ -0,0 +1,23 @@
+import pytest
+
+# This site fails with a redirect loop with a Firefox UA
+
+URL = "http://app.xiaomi.com/"
+REDIR_FAILURE_TEXT = "ERROR_REDIRECT_LOOP"
+SUCCESS_CSS = "#J_mingleList"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(SUCCESS_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL, timeout=15)
+ assert client.find_text(REDIR_FAILURE_TEXT)
diff --git a/testing/webcompat/interventions/tests/test_1712807_www_dealnews_com.py b/testing/webcompat/interventions/tests/test_1712807_www_dealnews_com.py
new file mode 100644
index 0000000000..d33bc01a76
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1712807_www_dealnews_com.py
@@ -0,0 +1,31 @@
+import pytest
+
+URL = "https://www.dealnews.com/"
+
+
+# The page sets the style.width of images too wide on
+# Firefox, making the page wider than the viewport
+
+
+def is_wider_than_window(client):
+ return client.execute_script(
+ """
+ return document.body.scrollWidth > document.body.clientWidth;
+ """
+ )
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert not is_wider_than_window(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert is_wider_than_window(client)
diff --git a/testing/webcompat/interventions/tests/test_1712833_desuca.py b/testing/webcompat/interventions/tests/test_1712833_desuca.py
new file mode 100644
index 0000000000..60796fa54f
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1712833_desuca.py
@@ -0,0 +1,18 @@
+import pytest
+
+URL = "https://buskocchi.desuca.co.jp/smartPhone.html"
+SCRIPT = "return document.getElementById('map_canvas')?.clientHeight"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.execute_script(SCRIPT)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.execute_script(SCRIPT)
diff --git a/testing/webcompat/interventions/tests/test_1719846_covid_cdc_gov.py b/testing/webcompat/interventions/tests/test_1719846_covid_cdc_gov.py
new file mode 100644
index 0000000000..253ea6167e
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1719846_covid_cdc_gov.py
@@ -0,0 +1,21 @@
+import pytest
+
+URL = "https://covid.cdc.gov/covid-data-tracker/#pandemic-vulnerability-index"
+
+
+IFRAME_CSS = "#pviIframe"
+UNSUPPORTED_TEXT = "not support Internet Explorer"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(IFRAME_CSS)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_text(UNSUPPORTED_TEXT)
diff --git a/testing/webcompat/interventions/tests/test_1719859_saxoinvestor.py b/testing/webcompat/interventions/tests/test_1719859_saxoinvestor.py
new file mode 100644
index 0000000000..774cc8dbc8
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1719859_saxoinvestor.py
@@ -0,0 +1,28 @@
+import pytest
+
+URL = (
+ "https://www.saxoinvestor.fr/login/?adobe_mc="
+ "MCORGID%3D173338B35278510F0A490D4C%2540AdobeOrg%7CTS%3D1621688498"
+)
+
+
+@pytest.mark.skip_platforms("linux")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ userid = client.find_css("input#field_userid")
+ password = client.find_css("input#field_password")
+ submit = client.find_css("input#button_login")
+ assert client.is_displayed(userid)
+ assert client.is_displayed(password)
+ assert client.is_displayed(submit)
+
+
+@pytest.mark.skip_platforms("linux")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ warning = client.find_css("#browser_support_section")
+ assert client.is_displayed(warning)
diff --git a/testing/webcompat/interventions/tests/test_1722954_granbluefantasy_jp.py b/testing/webcompat/interventions/tests/test_1722954_granbluefantasy_jp.py
new file mode 100644
index 0000000000..93fdf940b7
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1722954_granbluefantasy_jp.py
@@ -0,0 +1,27 @@
+import pytest
+
+URL = "https://game.granbluefantasy.jp/"
+
+
+def content_is_full_width(client):
+ return client.execute_script(
+ """
+ return document.querySelector("#wrapper").offsetWidth == document.body.clientWidth;
+ """
+ )
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert content_is_full_width(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert not content_is_full_width(client)
diff --git a/testing/webcompat/interventions/tests/test_1722955_frontgate_com.py b/testing/webcompat/interventions/tests/test_1722955_frontgate_com.py
new file mode 100644
index 0000000000..6f597c7d3e
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1722955_frontgate_com.py
@@ -0,0 +1,23 @@
+import pytest
+
+URL = "https://www.frontgate.com/resort-cotton-bath-towels/155771"
+MOBILE_CSS = "#app"
+DESKTOP_CSS = "#cbiBody"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(MOBILE_CSS)
+ assert not client.find_css(DESKTOP_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_css(DESKTOP_CSS)
+ assert not client.find_css(MOBILE_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1738317_vmos_cn.py b/testing/webcompat/interventions/tests/test_1738317_vmos_cn.py
new file mode 100644
index 0000000000..275b8b453d
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1738317_vmos_cn.py
@@ -0,0 +1,23 @@
+import pytest
+
+URL = "https://www.vmos.cn/"
+MOBILE_CSS = ".bg_wave_blue"
+DESKTOP_CSS = "#content"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(MOBILE_CSS)
+ assert not client.find_css(DESKTOP_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_css(DESKTOP_CSS)
+ assert not client.find_css(MOBILE_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1738319_yebocasino_co_za.py b/testing/webcompat/interventions/tests/test_1738319_yebocasino_co_za.py
new file mode 100644
index 0000000000..6b09cbec87
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1738319_yebocasino_co_za.py
@@ -0,0 +1,29 @@
+import pytest
+
+URL = "https://www.yebocasino.co.za/webplay/"
+PRACTICE_CSS = "#lobbybox_featuredgames .gamebox .cta.practice"
+IFRAME_CSS = "#gameiframe"
+UNSUPPORTED_CSS = ".unsupported-device-box"
+SUPPORTED_CSS = "#game_main"
+
+
+async def get_to_page(client):
+ await client.navigate(URL)
+ client.soft_click(client.await_css(PRACTICE_CSS))
+ client.switch_to_frame(client.await_css(IFRAME_CSS))
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await get_to_page(client)
+ assert client.await_css(SUPPORTED_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await get_to_page(client)
+ assert client.await_css(UNSUPPORTED_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1741234_alphalabs.py b/testing/webcompat/interventions/tests/test_1741234_alphalabs.py
new file mode 100644
index 0000000000..65fd9c06dc
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1741234_alphalabs.py
@@ -0,0 +1,35 @@
+import pytest
+
+URL = "https://patient.alphalabs.ca/Report/CovidReport"
+
+CONTINUE_CSS = ".btnNormal[type='submit']"
+FOOTER_CSS = "footer"
+
+
+async def is_continue_above_footer(client):
+ await client.navigate(URL)
+ cont = client.find_css(CONTINUE_CSS)
+ assert cont
+ footer = client.find_css(FOOTER_CSS)
+ assert footer
+ return client.execute_script(
+ """
+ const cont = arguments[0].getClientRects()[0];
+ const footer = arguments[1].getClientRects()[0];
+ return cont.bottom < footer.top;
+ """,
+ cont,
+ footer,
+ )
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert await is_continue_above_footer(client)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert not await is_continue_above_footer(client)
diff --git a/testing/webcompat/interventions/tests/test_1743627_renrenaud-bray_com.py b/testing/webcompat/interventions/tests/test_1743627_renrenaud-bray_com.py
new file mode 100644
index 0000000000..51752b3a04
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1743627_renrenaud-bray_com.py
@@ -0,0 +1,25 @@
+import pytest
+
+URL = "https://www.renaud-bray.com/accueil.aspx"
+ERROR_MSG = "ua.split(...)[1] is undefined"
+MENU_CSS = "#pageHeader_menuStores"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.execute_script(
+ """
+ return arguments[0].style.zIndex == "7000";
+ """,
+ client.await_css(MENU_CSS),
+ )
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL, await_console_message=ERROR_MSG)
diff --git a/testing/webcompat/interventions/tests/test_1743751_slrclub_com.py b/testing/webcompat/interventions/tests/test_1743751_slrclub_com.py
new file mode 100644
index 0000000000..30b52fc98b
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1743751_slrclub_com.py
@@ -0,0 +1,23 @@
+import pytest
+
+URL = "http://www.slrclub.com/"
+MOBILE_CSS = "#logo-wrap"
+DESKTOP_CSS = "#header"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(MOBILE_CSS)
+ assert not client.find_css(DESKTOP_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_css(DESKTOP_CSS)
+ assert not client.find_css(MOBILE_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1743754_workflow_base_vn.py b/testing/webcompat/interventions/tests/test_1743754_workflow_base_vn.py
new file mode 100644
index 0000000000..a64c02b227
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1743754_workflow_base_vn.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://workflow.base.vn/todos"
+ERROR_MSG = 'can\'t access property "split", a.ua.split(...)[1] is undefined'
+SUCCESS_CSS = "#authform"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(SUCCESS_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL, await_console_message=ERROR_MSG)
diff --git a/testing/webcompat/interventions/tests/test_1753461_naver.py b/testing/webcompat/interventions/tests/test_1753461_naver.py
new file mode 100644
index 0000000000..03266ef415
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1753461_naver.py
@@ -0,0 +1,22 @@
+import pytest
+
+URL = "https://serieson.naver.com/v2/movie/335790?isWebtoonAgreePopUp=true"
+
+SUPPORTED_CSS = "#playerWrapper"
+UNSUPPORTED_CSS = ".end_player_unavailable .download_links"
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(SUPPORTED_CSS)
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_css(UNSUPPORTED_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1756872_www_dolcegabbana_com.py b/testing/webcompat/interventions/tests/test_1756872_www_dolcegabbana_com.py
new file mode 100644
index 0000000000..648fc83210
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1756872_www_dolcegabbana_com.py
@@ -0,0 +1,23 @@
+import pytest
+
+URL = "https://www.dolcegabbana.com/en/"
+FAIL_CSS = "#p-homepage"
+SUCCESS_CSS = "#app"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(SUCCESS_CSS)
+ assert not client.find_css(FAIL_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_css(FAIL_CSS)
+ assert not client.find_css(SUCCESS_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1765947_veniceincoming_com.py b/testing/webcompat/interventions/tests/test_1765947_veniceincoming_com.py
new file mode 100644
index 0000000000..84ad99a3a4
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1765947_veniceincoming_com.py
@@ -0,0 +1,42 @@
+import pytest
+from webdriver.error import NoSuchElementException
+
+URL = "https://veniceincoming.com/it_IT/search_results?page=1&start_date_start=&start_date_end=&k="
+COOKIES_CSS = "[aria-label='cookieconsent'] .cc-allow"
+IMG_CSS = ".tour-details"
+TOUR_DATA_CSS = "#tour_data"
+
+
+async def check_filter_opens(client):
+ await client.navigate(URL)
+
+ try:
+ cookies = client.await_css(COOKIES_CSS, is_displayed=True, timeout=5)
+ client.soft_click(cookies)
+ client.await_element_hidden(client.css(COOKIES_CSS))
+ except NoSuchElementException:
+ pass
+
+ img = client.await_css(IMG_CSS)
+ client.scroll_into_view(img)
+ client.mouse.click(element=img).perform()
+
+ try:
+ client.await_css(TOUR_DATA_CSS, is_displayed=True, timeout=5)
+ except NoSuchElementException:
+ return False
+ return True
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert await check_filter_opens(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert not await check_filter_opens(client)
diff --git a/testing/webcompat/interventions/tests/test_1774490_rainews_it.py b/testing/webcompat/interventions/tests/test_1774490_rainews_it.py
new file mode 100644
index 0000000000..042e8965ae
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1774490_rainews_it.py
@@ -0,0 +1,34 @@
+import pytest
+
+URL = (
+ "https://www.rainews.it/photogallery/2022/06/fotorassegna-stampa-le-prime"
+ "-pagine-dei-quotidiani-di-sabato-04-giugno--cd5414b3-65b9-429b-85d5-e53fadd59f4c.html"
+)
+
+PICTURE_CSS = ".swiper-slide picture"
+GALLERY_CSS = ".swiper-wrapper"
+
+
+def get_picture_width(client):
+ return client.execute_script(
+ f"""
+ const p = document.querySelector("{PICTURE_CSS}");
+ return window.getComputedStyle(p).width;
+ """
+ )
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ client.await_css(GALLERY_CSS)
+ assert "0px" != get_picture_width(client)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ client.await_css(GALLERY_CSS)
+ assert "0px" == get_picture_width(client)
diff --git a/testing/webcompat/interventions/tests/test_1776897_www_edencast_fr.py b/testing/webcompat/interventions/tests/test_1776897_www_edencast_fr.py
new file mode 100644
index 0000000000..4823aa0c39
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1776897_www_edencast_fr.py
@@ -0,0 +1,59 @@
+import pytest
+
+# The page will asyncronously write out an <audio> element on success, but
+# will not do anything easily detectable otherwise.
+#
+# The problem is that the podPressShowHidePlayer function thinks to write
+# out a Flash embed unless WebKit is in the UA string, but ends up doing
+# nothing at all. However, it calls a different function for html5 vs SWF,
+# and we can detect which one it calls to confirm it calls the html5 one.
+
+URL = "https://www.edencast.fr/zoomcastlost-in-blindness/"
+
+AUDIO_CSS = "audio#podpresshtml5_1"
+
+SCRIPT = """
+ var done = arguments[0];
+
+ if (!window?.podPressShowHidePlayer) {
+ done("none");
+ }
+
+ window.podPressenprintHTML5audio = function() {
+ done("html5");
+ };
+
+ window.podpress_audioplayer_swfobject = {
+ embedSWF: function() {
+ done("swf");
+ },
+ };
+
+ const d = document.createElement("div");
+ d.id = "podPressPlayerSpace_test";
+ document.documentElement.appendChild(d);
+
+ const p = document.createElement("div");
+ p.id = "podPressPlayerSpace_test_PlayLink";
+ document.documentElement.appendChild(p);
+
+ podPressShowHidePlayer("test", "https//x/test.mp3", 100, 100, "force");
+ """
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ await client.dom_ready()
+ assert "html5" == client.execute_async_script(SCRIPT)
+ assert client.find_css(AUDIO_CSS)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ await client.dom_ready()
+ assert "swf" == client.execute_async_script(SCRIPT)
+ assert not client.find_css(AUDIO_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1778168_watch_antennaplus_gr.py b/testing/webcompat/interventions/tests/test_1778168_watch_antennaplus_gr.py
new file mode 100644
index 0000000000..ab145fe21d
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1778168_watch_antennaplus_gr.py
@@ -0,0 +1,22 @@
+import pytest
+
+URL = (
+ "https://watch.antennaplus.gr/#/shows/agries_melisses/seasons/"
+ "3/episode/agries_melisses_S03_E137_v1"
+)
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(".login-pf-page")
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_css(".ua-barrier")
diff --git a/testing/webcompat/interventions/tests/test_1784141_acuvue_com.py b/testing/webcompat/interventions/tests/test_1784141_acuvue_com.py
new file mode 100644
index 0000000000..9d61591576
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784141_acuvue_com.py
@@ -0,0 +1,22 @@
+import pytest
+
+URL = "https://www.acuvue.com/"
+UNSUPPORTED_CSS = "#browser-alert"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert not client.is_displayed(unsupported)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert client.is_displayed(unsupported)
diff --git a/testing/webcompat/interventions/tests/test_1784141_aveeno_com.py b/testing/webcompat/interventions/tests/test_1784141_aveeno_com.py
new file mode 100644
index 0000000000..fe787cd044
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784141_aveeno_com.py
@@ -0,0 +1,22 @@
+import pytest
+
+URL = "https://www.aveeno.com/products/calm-restore-oat-gel-moisturizer-for-sensitive-skin"
+UNSUPPORTED_CSS = "#browser-alert"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert not client.is_displayed(unsupported)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert client.is_displayed(unsupported)
diff --git a/testing/webcompat/interventions/tests/test_1784199_aptsovation_com.py b/testing/webcompat/interventions/tests/test_1784199_aptsovation_com.py
new file mode 100644
index 0000000000..a7f22edac0
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784199_aptsovation_com.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://www.aptsovation.com/"
+UNSUPPORTED_CSS = "[aria-label='Your browser is not supported']"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert not client.is_displayed(unsupported)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert client.is_displayed(unsupported)
diff --git a/testing/webcompat/interventions/tests/test_1784199_avanabayview_com.py b/testing/webcompat/interventions/tests/test_1784199_avanabayview_com.py
new file mode 100644
index 0000000000..17ab789bee
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784199_avanabayview_com.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://www.avanabayview.com/"
+UNSUPPORTED_CSS = "[aria-label='Your browser is not supported']"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert not client.is_displayed(unsupported)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert client.is_displayed(unsupported)
diff --git a/testing/webcompat/interventions/tests/test_1784199_breakpointeandcoronado_com.py b/testing/webcompat/interventions/tests/test_1784199_breakpointeandcoronado_com.py
new file mode 100644
index 0000000000..3af30def4a
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784199_breakpointeandcoronado_com.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://www.breakpointeandcoronado.com/"
+UNSUPPORTED_CSS = "[aria-label='Your browser is not supported']"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert not client.is_displayed(unsupported)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert client.is_displayed(unsupported)
diff --git a/testing/webcompat/interventions/tests/test_1784199_entrata_platform.py b/testing/webcompat/interventions/tests/test_1784199_entrata_platform.py
new file mode 100644
index 0000000000..d10776d5fd
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784199_entrata_platform.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://www.liveobserverpark.com/"
+UNSUPPORTED_BANNER = ".banner_overlay"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ unsupported_banner = client.await_css(UNSUPPORTED_BANNER)
+ assert not client.is_displayed(unsupported_banner)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ unsupported_banner = client.await_css(UNSUPPORTED_BANNER)
+ assert client.is_displayed(unsupported_banner)
diff --git a/testing/webcompat/interventions/tests/test_1784199_liveatlasathens_com.py b/testing/webcompat/interventions/tests/test_1784199_liveatlasathens_com.py
new file mode 100644
index 0000000000..37b5f0cf4a
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784199_liveatlasathens_com.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://www.liveatlasathens.com/"
+UNSUPPORTED_CSS = "[aria-label='Your browser is not supported']"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert not client.is_displayed(unsupported)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert client.is_displayed(unsupported)
diff --git a/testing/webcompat/interventions/tests/test_1784199_liveobserverpark_com.py b/testing/webcompat/interventions/tests/test_1784199_liveobserverpark_com.py
new file mode 100644
index 0000000000..ffc6b2d702
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784199_liveobserverpark_com.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://www.liveobserverpark.com/"
+UNSUPPORTED_CSS = "[aria-label='Your browser is not supported']"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert not client.is_displayed(unsupported)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert client.is_displayed(unsupported)
diff --git a/testing/webcompat/interventions/tests/test_1784199_midwayurban_com.py b/testing/webcompat/interventions/tests/test_1784199_midwayurban_com.py
new file mode 100644
index 0000000000..2c90d9468e
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784199_midwayurban_com.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://www.midwayurban.com/"
+UNSUPPORTED_CSS = "[aria-label='Your browser is not supported']"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert not client.is_displayed(unsupported)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert client.is_displayed(unsupported)
diff --git a/testing/webcompat/interventions/tests/test_1784199_nhcalaska_com.py b/testing/webcompat/interventions/tests/test_1784199_nhcalaska_com.py
new file mode 100644
index 0000000000..37ebce9be0
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784199_nhcalaska_com.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://www.nhcalaska.com/"
+UNSUPPORTED_CSS = "[aria-label='Your browser is not supported']"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert not client.is_displayed(unsupported)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert client.is_displayed(unsupported)
diff --git a/testing/webcompat/interventions/tests/test_1784199_securityproperties_com.py b/testing/webcompat/interventions/tests/test_1784199_securityproperties_com.py
new file mode 100644
index 0000000000..bb7840ec66
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784199_securityproperties_com.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://www.securityproperties.com/thornton/reserve-at-thornton-i-ii-apartments"
+UNSUPPORTED_CSS = "[aria-label='Your browser is not supported']"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert not client.is_displayed(unsupported)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert client.is_displayed(unsupported)
diff --git a/testing/webcompat/interventions/tests/test_1784199_theloftsorlando_com.py b/testing/webcompat/interventions/tests/test_1784199_theloftsorlando_com.py
new file mode 100644
index 0000000000..6aea9fd25c
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784199_theloftsorlando_com.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://www.theloftsorlando.com/"
+UNSUPPORTED_CSS = "[aria-label='Your browser is not supported']"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert not client.is_displayed(unsupported)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert client.is_displayed(unsupported)
diff --git a/testing/webcompat/interventions/tests/test_1784199_thepointeatcentral_prospectportal_com.py b/testing/webcompat/interventions/tests/test_1784199_thepointeatcentral_prospectportal_com.py
new file mode 100644
index 0000000000..50ec397f75
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784199_thepointeatcentral_prospectportal_com.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://thepointeatcentral.prospectportal.com/Apartments/module/application_authentication?_ga=2.250831814.1585158328.1588776830-1793033216.1588776830"
+UNSUPPORTED_CSS = "[aria-label='Your browser is not supported']"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert not client.is_displayed(unsupported)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert client.is_displayed(unsupported)
diff --git a/testing/webcompat/interventions/tests/test_1784199_vanallenapartments_com.py b/testing/webcompat/interventions/tests/test_1784199_vanallenapartments_com.py
new file mode 100644
index 0000000000..aff3d7d3ad
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784199_vanallenapartments_com.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://www.vanallenapartments.com/"
+UNSUPPORTED_CSS = "[aria-label='Your browser is not supported']"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert not client.is_displayed(unsupported)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ unsupported = client.await_css(UNSUPPORTED_CSS)
+ assert client.is_displayed(unsupported)
diff --git a/testing/webcompat/interventions/tests/test_1784302_open_toutiao_com.py b/testing/webcompat/interventions/tests/test_1784302_open_toutiao_com.py
new file mode 100644
index 0000000000..bcb8b0b4e8
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784302_open_toutiao_com.py
@@ -0,0 +1,20 @@
+import pytest
+
+URL = "https://open.toutiao.com/a6966170645738783269/?__publisher_id__=4221768740&channel_id=88805669586&dt=R7Plusm&fr=normal&from_gid=6956432767005491719&gy=2cb247169b873bc0f78107b5a569f282d129ede38a56330ac9edc00743af6ba6f301248cddcb5b2376b2b286f219a9938e69c1c33941e7892a56b16c8617ebb0b1cd50cb401ece07ea7107a158f0b3b0cb95539be68ebda39413081f8dfe1d7ef83abb830d081642aa72639dc2c3e34109c846be7df23727854e76248ce909576f29134ee85086a27255c0745783a0b2f39d213d1a0ee09adb787da51569e05f525c3ad201d6638c&item_id=6966170645738783269&label=related_news&oppo_anchor=&react_gray=1&req_id=2021070203235101015120108107B22076&utm_campaign=open&utm_medium=webview&utm_source=o_llq_api"
+API_MISSING_MSG = "navigator.connection is undefined"
+GOOD_CSS = "#pageletArticleContent"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(GOOD_CSS, is_displayed=True)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL, await_console_message=API_MISSING_MSG)
diff --git a/testing/webcompat/interventions/tests/test_1784361_coldwellbankerhomes_com.py b/testing/webcompat/interventions/tests/test_1784361_coldwellbankerhomes_com.py
new file mode 100644
index 0000000000..32892b2087
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1784361_coldwellbankerhomes_com.py
@@ -0,0 +1,23 @@
+import pytest
+
+# The gallery on this page only sets img[src] to a non-1x1-spacer if the error
+# doesn't happen during page load, which doesn't happen with a Chrome UA.
+
+URL = "https://www.coldwellbankerhomes.com/ri/little-compton/kvc-17_1,17_2/"
+ERROR_MSG = 'can\'t access property "dataset", v[0] is undefined'
+SUCCESS_CSS = "img.psr-lazy:not([src*='spacer'])"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(SUCCESS_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL, await_console_message=ERROR_MSG)
diff --git a/testing/webcompat/interventions/tests/test_1786404_business_help_royalmail_com.py b/testing/webcompat/interventions/tests/test_1786404_business_help_royalmail_com.py
new file mode 100644
index 0000000000..01ca2ddcc2
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1786404_business_help_royalmail_com.py
@@ -0,0 +1,46 @@
+import pytest
+
+URL = "https://business.help.royalmail.com/app/webforms/stampsenquiries"
+
+COOKIES_ACCEPT_CSS = "#consent_prompt_submit"
+POSTCODE_CSS = "input[name='rn_AddressControl_16textbox']"
+OPTION_CSS = "option.addr_pick_line:not(:disabled)"
+ADDY1_CSS = "[name='Incident.CustomFields.c.address1_1']"
+
+
+async def getResult(client):
+ await client.navigate(URL)
+ client.await_css(COOKIES_ACCEPT_CSS).click()
+ client.execute_script(
+ f"""
+ const proto = EventTarget.prototype;
+ const def = Object.getOwnPropertyDescriptor(proto, "addEventListener");
+ const old = def.value;
+ def.value = function(type) {{
+ if (type === "click" && this?.matches("{OPTION_CSS}")) {{
+ window.__expectedListenerAdded = true;
+ }}
+ }};
+ Object.defineProperty(proto, "addEventListener", def);
+ """
+ )
+
+ client.await_css(POSTCODE_CSS).send_keys("W1A 1AV")
+ client.await_css(OPTION_CSS)
+ return client.execute_script(
+ """
+ return Boolean(window.__expectedListenerAdded);
+ """
+ )
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert await getResult(client)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert not await getResult(client)
diff --git a/testing/webcompat/interventions/tests/test_1793761_schoolnutritionandfitness_com.py b/testing/webcompat/interventions/tests/test_1793761_schoolnutritionandfitness_com.py
new file mode 100644
index 0000000000..9bb0be584c
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1793761_schoolnutritionandfitness_com.py
@@ -0,0 +1,32 @@
+import pytest
+
+URL = "https://www.schoolnutritionandfitness.com/webmenus2/#/view?id=6331c49ce96f1e9c468b45be&siteCode=1641"
+ELEM_CSS = "react-app td > div"
+HEIGHT_CUTOFF = 10
+
+
+def get_elem_height(client):
+ elem = client.await_css(ELEM_CSS, is_displayed=True)
+ assert elem
+ return client.execute_script(
+ """
+ return arguments[0].getBoundingClientRect().height;
+ """,
+ elem,
+ )
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert get_elem_height(client) > HEIGHT_CUTOFF
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert get_elem_height(client) < HEIGHT_CUTOFF
diff --git a/testing/webcompat/interventions/tests/test_1795490_www_china-airlines_com.py b/testing/webcompat/interventions/tests/test_1795490_www_china-airlines_com.py
new file mode 100644
index 0000000000..8a38a633a4
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1795490_www_china-airlines_com.py
@@ -0,0 +1,25 @@
+import pytest
+
+URL = "https://www.china-airlines.com/tw/en/booking/book-flights/flight-search?lang=en-us&deptstn=TPE&arrstn=LAX"
+DATE_CSS = "#departureDateMobile"
+DATE_DISABLED_CSS = "#departureDateMobile[disabled]"
+
+
+async def check_date_disabled(client):
+ await client.navigate(URL)
+ client.await_css(DATE_CSS)
+ return client.find_css(DATE_DISABLED_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert not await check_date_disabled(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert await check_date_disabled(client)
diff --git a/testing/webcompat/interventions/tests/test_1797400_mobilevikings_be.py b/testing/webcompat/interventions/tests/test_1797400_mobilevikings_be.py
new file mode 100644
index 0000000000..c3575b9735
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1797400_mobilevikings_be.py
@@ -0,0 +1,31 @@
+import pytest
+from webdriver.error import NoSuchElementException
+
+URL = "https://mobilevikings.be/en/registration/?product_id=155536813-1-1"
+COOKIES_CSS = "#btn-accept-cookies"
+DATE_CSS = "input.date-input[name='birth_date']"
+
+
+async def date_after_typing(client):
+ await client.navigate(URL)
+ try:
+ client.await_css(COOKIES_CSS, timeout=3).click()
+ client.await_element_hidden(client.css(COOKIES_CSS))
+ except NoSuchElementException:
+ pass
+ date = client.await_css(DATE_CSS)
+ client.scroll_into_view(date)
+ date.send_keys("1")
+ return date.property("value")
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert "1_/__/____" == await date_after_typing(client)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert "__/__/____" == await date_after_typing(client)
diff --git a/testing/webcompat/interventions/tests/test_1799968_samsung_com.py b/testing/webcompat/interventions/tests/test_1799968_samsung_com.py
new file mode 100644
index 0000000000..4b4fc408aa
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1799968_samsung_com.py
@@ -0,0 +1,21 @@
+import pytest
+
+URL = "https://www.samsung.com/in/watches/galaxy-watch/galaxy-watch5-44mm-graphite-bluetooth-sm-r910nzaainu/"
+GOOD_CSS = "html.linux.firefox"
+ERROR_MSG = "DOMTokenList.add: The empty string is not a valid token."
+
+
+@pytest.mark.only_platforms("linux")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(GOOD_CSS)
+
+
+@pytest.mark.only_platforms("linux")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL, await_console_message=ERROR_MSG)
+ assert not client.find_css(GOOD_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1799994_vivobarefoot_com.py b/testing/webcompat/interventions/tests/test_1799994_vivobarefoot_com.py
new file mode 100644
index 0000000000..5b3713ce30
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1799994_vivobarefoot_com.py
@@ -0,0 +1,45 @@
+import pytest
+from webdriver.error import NoSuchElementException
+
+URL = "https://www.vivobarefoot.com/eu/mens"
+FILTER_CSS = "#narrow-by-list .filter-wrapper:last-of-type"
+SUBMENU_CSS = "#narrow-by-list .filter-wrapper:last-of-type dd"
+POPUP1_CSS = "#globalePopupWrapper"
+POPUP2_CSS = "#globale_overlay"
+POPUP3_CSS = ".weblayer--box-subscription-1"
+
+
+async def check_filter_opens(client):
+ await client.navigate(URL)
+
+ popup = client.await_css(POPUP1_CSS, timeout=3)
+ if popup:
+ client.remove_element(popup)
+ popup = client.find_css(POPUP2_CSS)
+ if popup:
+ client.remove_element(popup)
+ popup = client.find_css(POPUP3_CSS)
+ if popup:
+ client.remove_element(popup)
+
+ filter = client.await_css(FILTER_CSS)
+ client.mouse.click(element=filter).perform()
+ try:
+ client.await_css(SUBMENU_CSS, is_displayed=True, timeout=3)
+ except NoSuchElementException:
+ return False
+ return True
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert await check_filter_opens(client)
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert not await check_filter_opens(client)
diff --git a/testing/webcompat/interventions/tests/test_1800000_www_honda_co_uk.py b/testing/webcompat/interventions/tests/test_1800000_www_honda_co_uk.py
new file mode 100644
index 0000000000..70f968dc1d
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1800000_www_honda_co_uk.py
@@ -0,0 +1,50 @@
+import pytest
+from webdriver.error import NoSuchElementException
+
+URL = "https://www.honda.co.uk/cars/book-a-service.html#search?query=tf33bu"
+COOKIES_CSS = "#onetrust-accept-btn-handler"
+CHOOSE_DEALER_CSS = "a[data-analytics-template*='Make a booking']"
+BOOK_ONLINE_CSS = "select#requiredService"
+SITE_DOWN_CSS = ".no-results"
+
+
+async def check_choose_dealer_works(client):
+ await client.navigate(URL)
+
+ cookies = client.css(COOKIES_CSS)
+ client.await_element(cookies).click()
+ client.await_element_hidden(cookies)
+
+ down, dealer = client.await_first_element_of(
+ [
+ client.css(SITE_DOWN_CSS),
+ client.css(CHOOSE_DEALER_CSS),
+ ],
+ timeout=5,
+ )
+
+ if down:
+ pytest.skip("Service is down right now, so testing is impossible")
+ return True
+
+ client.scroll_into_view(dealer)
+ client.mouse.click(element=dealer).perform()
+ try:
+ client.await_css(BOOK_ONLINE_CSS, is_displayed=True, timeout=3)
+ except NoSuchElementException:
+ return False
+ return True
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert await check_choose_dealer_works(client)
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert not await check_choose_dealer_works(client)
diff --git a/testing/webcompat/interventions/tests/test_1800241_mms_telekom_de.py b/testing/webcompat/interventions/tests/test_1800241_mms_telekom_de.py
new file mode 100644
index 0000000000..37778ea804
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1800241_mms_telekom_de.py
@@ -0,0 +1,19 @@
+import pytest
+
+URL = "https://www.mms.telekom.de/OTP/"
+LOGIN_CSS = ".LoginbackgroundDiv"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ login_element = client.await_css(LOGIN_CSS)
+ assert client.is_displayed(login_element)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert not client.find_css(LOGIN_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1800936_cov19ent_kdca_go_kr.py b/testing/webcompat/interventions/tests/test_1800936_cov19ent_kdca_go_kr.py
new file mode 100644
index 0000000000..e0384a8641
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1800936_cov19ent_kdca_go_kr.py
@@ -0,0 +1,26 @@
+import pytest
+
+URL = "https://cov19ent.kdca.go.kr/"
+HEADER_CSS = "header.mouseOn"
+
+
+async def get_header_position(client):
+ await client.navigate(URL)
+ return client.execute_script(
+ f"""
+ const r = document.querySelector("{HEADER_CSS}");
+ return window.getComputedStyle(r).position;
+ """
+ )
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert "absolute" == await get_header_position(client)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert "absolute" != await get_header_position(client)
diff --git a/testing/webcompat/interventions/tests/test_1803131_www_argaam_com.py b/testing/webcompat/interventions/tests/test_1803131_www_argaam_com.py
new file mode 100644
index 0000000000..c5a3782768
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1803131_www_argaam_com.py
@@ -0,0 +1,23 @@
+import pytest
+
+URL = "https://www.argaam.com/"
+MOBILE_CSS = ".mobile-data-container"
+DESKTOP_CSS = ".ticker_box"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(MOBILE_CSS)
+ assert not client.find_css(DESKTOP_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_css(DESKTOP_CSS)
+ assert not client.find_css(MOBILE_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1803976_youtube_com.py b/testing/webcompat/interventions/tests/test_1803976_youtube_com.py
new file mode 100644
index 0000000000..16fc66231a
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1803976_youtube_com.py
@@ -0,0 +1,62 @@
+import time
+
+import pytest
+
+URL = "https://www.youtube.com/"
+SEARCH_TERM = "movies"
+
+SEARCH_FIELD_CSS = "input[type='text'][id*='search']"
+SEARCH_BUTTON_CSS = "#search-icon-legacy"
+FILTER_BAR_CSS = "#filter-menu"
+PERF_NOW_CONSTANT = 11111
+
+
+def change_performance_now(client):
+ return client.execute_script(
+ """
+ const PERF_NOW = arguments[0];
+ Object.defineProperty(window.performance, "now", {
+ value: () => PERF_NOW,
+ }, PERF_NOW_CONSTANT);
+ """
+ )
+
+
+async def search_for_term(client):
+ await client.navigate(URL)
+ search = client.await_css(SEARCH_FIELD_CSS)
+ button = client.find_css(SEARCH_BUTTON_CSS)
+
+ assert client.is_displayed(search)
+ assert client.is_displayed(button)
+
+ search.send_keys(SEARCH_TERM)
+ time.sleep(1)
+ button.click()
+ time.sleep(2)
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await search_for_term(client)
+ filter_bar = client.await_css(FILTER_BAR_CSS)
+
+ client.back()
+
+ assert not client.is_displayed(filter_bar)
+
+
+@pytest.mark.skip(reason="results are intermittent, so skipping this test for now")
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ change_performance_now(client)
+ await search_for_term(client)
+
+ client.back()
+
+ filter_bar = client.await_css(FILTER_BAR_CSS)
+ assert client.is_displayed(filter_bar)
diff --git a/testing/webcompat/interventions/tests/test_1811325_inmac_wstore_com.py b/testing/webcompat/interventions/tests/test_1811325_inmac_wstore_com.py
new file mode 100644
index 0000000000..392be13b39
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1811325_inmac_wstore_com.py
@@ -0,0 +1,43 @@
+import pytest
+
+URL = "https://www.inmac-wstore.com"
+SITE_CSS = ".desktopDevice"
+IFRAME_CSS = "iframe[src^='https://geo.captcha-delivery.com/']"
+BLOCKED_CSS = ".captcha__human"
+NOT_A_ROBOT_TEXT = (
+ "We want to make sure it is actually you we are dealing with and not a robot."
+)
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+
+ frame = client.find_css(IFRAME_CSS)
+ if frame:
+ client.switch_frame(frame)
+
+ blocked, loaded = client.await_first_element_of(
+ [
+ client.text(NOT_A_ROBOT_TEXT),
+ client.css(SITE_CSS),
+ ]
+ )
+
+ if blocked:
+ pytest.skip("Site using a captcha, can't proceed with test.")
+ return
+
+ assert client.is_displayed(loaded)
+
+
+@pytest.mark.skip_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ frame = client.find_css(IFRAME_CSS)
+ client.switch_frame(frame)
+ assert client.await_css(BLOCKED_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1817520_ersthelfer_tv.py b/testing/webcompat/interventions/tests/test_1817520_ersthelfer_tv.py
new file mode 100644
index 0000000000..e8addbeb68
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1817520_ersthelfer_tv.py
@@ -0,0 +1,36 @@
+import pytest
+
+URL = "https://book.ersthelfer.tv/"
+DATE = "12.12.2020"
+PLACEHOLDER = "__.__.____"
+
+CITY_CSS = "#city_id"
+PERSON_CSS = "#no_of_person"
+CITY_OPTION_XPATH = "//select[@name='city_id']/option[2]"
+PERSON_OPTION_XPATH = "//select[@name='no_of_person']/option[2]"
+DATE_PICKER_CSS = "[class*='date-picker-custom-wrapper'] input"
+
+
+async def set_date(client):
+ client.await_css(CITY_CSS).click()
+ client.await_xpath(CITY_OPTION_XPATH).click()
+
+ client.await_css(PERSON_CSS).click()
+ client.await_xpath(PERSON_OPTION_XPATH).click()
+ date_input = client.await_css(DATE_PICKER_CSS, is_displayed=True)
+ date_input.send_keys(DATE)
+ return date_input.property("value")
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert DATE == await set_date(client)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert PLACEHOLDER == await set_date(client)
diff --git a/testing/webcompat/interventions/tests/test_1818818_marksandspencer_com.py b/testing/webcompat/interventions/tests/test_1818818_marksandspencer_com.py
new file mode 100644
index 0000000000..ff5de87e50
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1818818_marksandspencer_com.py
@@ -0,0 +1,33 @@
+import pytest
+from webdriver.error import NoSuchElementException
+
+URL = (
+ "https://www.marksandspencer.com/webapp/wcs/stores/servlet/GenericApplicationError"
+)
+COOKIES_CSS = "button.navigation-cookiebbanner__submit"
+SELECT_CSS = "#progressiveHeaderSection button.navigation-hamburger-trigger"
+
+
+async def is_fastclick_active(client):
+ await client.navigate(URL)
+ try:
+ client.await_css(COOKIES_CSS, timeout=3).click()
+ client.await_element_hidden(client.css(COOKIES_CSS))
+ except NoSuchElementException:
+ pass
+
+ return client.test_for_fastclick(client.await_css(SELECT_CSS))
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert not await is_fastclick_active(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert await is_fastclick_active(client)
diff --git a/testing/webcompat/interventions/tests/test_1818818_wellcare_com.py b/testing/webcompat/interventions/tests/test_1818818_wellcare_com.py
new file mode 100644
index 0000000000..7241f5631b
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1818818_wellcare_com.py
@@ -0,0 +1,26 @@
+import pytest
+
+URL = "https://www.wellcare.com/en/Oregon/Members/Prescription-Drug-Plans-2023/Wellcare-Value-Script"
+MENU_CSS = "a[title='login DDL']"
+SELECT_CSS = "select#userSelect"
+
+
+async def is_fastclick_active(client):
+ await client.navigate(URL)
+ menu = client.await_css(MENU_CSS)
+ menu.click()
+ return client.test_for_fastclick(client.await_css(SELECT_CSS))
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ assert not await is_fastclick_active(client)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ assert await is_fastclick_active(client)
diff --git a/testing/webcompat/interventions/tests/test_1819450_cmbchina_com.py b/testing/webcompat/interventions/tests/test_1819450_cmbchina_com.py
new file mode 100644
index 0000000000..c711596114
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1819450_cmbchina_com.py
@@ -0,0 +1,21 @@
+import pytest
+
+URL = "https://www.cmbchina.com/"
+DESKTOP_CSS = "#aspnetForm"
+MOBILE_CSS = "#app .mobile-header"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(MOBILE_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_css(DESKTOP_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1819476_axis_bank.py b/testing/webcompat/interventions/tests/test_1819476_axis_bank.py
new file mode 100644
index 0000000000..fe7ff20cea
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1819476_axis_bank.py
@@ -0,0 +1,19 @@
+import pytest
+
+URL = "https://www.axisbank.com/retail/cards/credit-card"
+TARGET_CSS = ".loanBox"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ loan_element = client.await_css(TARGET_CSS)
+ assert client.is_displayed(loan_element)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert not client.find_css(TARGET_CSS)
diff --git a/testing/webcompat/interventions/tests/test_1819476_axisbank_com.py b/testing/webcompat/interventions/tests/test_1819476_axisbank_com.py
new file mode 100644
index 0000000000..ee5d64a1d0
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1819476_axisbank_com.py
@@ -0,0 +1,18 @@
+import pytest
+
+URL = "https://www.axisbank.com/retail/cards/credit-card"
+SITE_CSS = "#ulCreditCard:not(:empty)"
+ERROR_MSG = "webkitSpeechRecognition is not defined"
+
+
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(SITE_CSS)
+
+
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL, await_console_message=ERROR_MSG)
diff --git a/testing/webcompat/interventions/tests/test_1819702_feelgoodcontacts_com.py b/testing/webcompat/interventions/tests/test_1819702_feelgoodcontacts_com.py
new file mode 100644
index 0000000000..039e08cadc
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_1819702_feelgoodcontacts_com.py
@@ -0,0 +1,21 @@
+import pytest
+
+URL = "https://feelgoodcontacts.com/"
+MOBILE_CSS = "#aHomeMob"
+DESKTOP_CSS = "#mmenu"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(MOBILE_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_css(DESKTOP_CSS)
diff --git a/testing/webcompat/interventions/tests/test_969844_mobile_de.py b/testing/webcompat/interventions/tests/test_969844_mobile_de.py
new file mode 100644
index 0000000000..a3fc63b723
--- /dev/null
+++ b/testing/webcompat/interventions/tests/test_969844_mobile_de.py
@@ -0,0 +1,25 @@
+import pytest
+
+# The site serves a different mobile page to Firefox than Chrome
+
+URL = "https://www.mobile.de/"
+MOBILE_CSS = "header [data-testid='header-burger-menu']"
+DESKTOP_CSS = "header [data-testid='header-mobile-small-screen']"
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.with_interventions
+async def test_enabled(client):
+ await client.navigate(URL)
+ assert client.await_css(MOBILE_CSS)
+ assert not client.find_css(DESKTOP_CSS)
+
+
+@pytest.mark.only_platforms("android")
+@pytest.mark.asyncio
+@pytest.mark.without_interventions
+async def test_disabled(client):
+ await client.navigate(URL)
+ assert client.await_css(DESKTOP_CSS)
+ assert not client.find_css(MOBILE_CSS)