Update browser tests for mobile preset layout.

This keeps UI checks aligned with the new tab/preset flows.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-08 13:51:21 +13:00
parent 7cd4a91350
commit f88bf03939

View File

@@ -9,7 +9,6 @@ import time
import requests import requests
from typing import Optional, List from typing import Optional, List
try:
from selenium import webdriver from selenium import webdriver
from selenium.webdriver.common.by import By from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait
@@ -18,9 +17,6 @@ try:
from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import TimeoutException, NoSuchElementException from selenium.common.exceptions import TimeoutException, NoSuchElementException
except ImportError:
print("Selenium not installed. Install with: pip install selenium")
sys.exit(1)
# Base URL for the device # Base URL for the device
BASE_URL = "http://192.168.4.1" BASE_URL = "http://192.168.4.1"
@@ -533,6 +529,44 @@ def test_profiles_ui(browser: BrowserTest) -> bool:
print(f"\nBrowser profiles UI tests: {passed}/{total} passed") print(f"\nBrowser profiles UI tests: {passed}/{total} passed")
return passed == total return passed == total
def test_mobile_tab_presets_two_columns():
"""
Verify that the tab preset selecting area shows roughly two preset tiles per row
on a phone-sized viewport.
"""
bt = BrowserTest(base_url=BASE_URL, headless=True)
if not bt.setup():
assert False, "Failed to start browser"
try:
# Simulate a mobile viewport
bt.driver.set_window_size(400, 800)
assert bt.navigate('/'), "Failed to load main page"
# Click the first tab button to load presets for that tab
first_tab = bt.wait_for_element(By.CSS_SELECTOR, '.tab-button', timeout=10)
assert first_tab is not None, "No tab buttons found"
first_tab.click()
time.sleep(1)
container = bt.wait_for_element(By.ID, 'presets-list-tab', timeout=10)
assert container is not None, "presets-list-tab not found"
tiles = bt.driver.find_elements(By.CSS_SELECTOR, '#presets-list-tab .draggable-preset')
# Need at least 2 presets to make this meaningful
assert len(tiles) >= 2, "Fewer than 2 presets found for tab"
container_width = container.size['width']
first_width = tiles[0].size['width']
# Each tile should be about half the container width (tolerate some margin)
assert 0.4 * container_width <= first_width <= 0.6 * container_width, (
f"Preset tile width {first_width} not ~half of container {container_width}"
)
finally:
bt.teardown()
def test_presets_ui(browser: BrowserTest) -> bool: def test_presets_ui(browser: BrowserTest) -> bool:
"""Test presets UI in browser.""" """Test presets UI in browser."""
print("\n=== Testing Presets UI in Browser ===") print("\n=== Testing Presets UI in Browser ===")
@@ -825,57 +859,44 @@ def test_preset_drag_and_drop(browser: BrowserTest) -> bool:
print("✓ Created 3 presets for drag test") print("✓ Created 3 presets for drag test")
passed += 1 passed += 1
# Test 4: Add presets to the tab # Test 4: Add presets to the tab (via Edit Tab modal Select buttons in list)
total += 1 total += 1
try: try:
# Click "Add Preset" button in the tab area tab_id = browser.driver.execute_script(
add_preset_btn = browser.wait_for_element(By.ID, 'preset-add-btn-tab', timeout=5) "return (window.tabsManager && window.tabsManager.getCurrentTabId && window.tabsManager.getCurrentTabId()) || null;"
if add_preset_btn: )
browser.click_element(By.ID, 'preset-add-btn-tab', use_js=True) if not tab_id:
time.sleep(1.5) # Wait for modal to fully render print("✗ Could not get current tab id")
else:
# Wait for the add preset modal browser.driver.execute_script(
add_modal = browser.wait_for_element(By.ID, 'add-preset-to-tab-modal', timeout=5) "if (window.tabsManager && window.tabsManager.openEditTabModal) { window.tabsManager.openEditTabModal(arguments[0], null); }",
if add_modal: tab_id
# Find "Add" buttons (not "Remove" buttons) in the modal )
add_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='add-preset-list']//button[text()='Add']") time.sleep(1)
if len(add_buttons) >= 2: list_el = browser.wait_for_element(By.ID, 'edit-tab-presets-list', timeout=5)
# Add first preset - the modal will close after clicking if list_el:
browser.driver.execute_script("arguments[0].click();", add_buttons[0]) select_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='edit-tab-presets-list']//button[text()='Select']")
time.sleep(2) # Wait for modal to close and tab to reload if len(select_buttons) >= 2:
browser.handle_alert(accept=True, timeout=1) # Handle any alerts browser.driver.execute_script("arguments[0].click();", select_buttons[0])
time.sleep(1.5)
# Re-open modal to add second preset browser.handle_alert(accept=True, timeout=1)
browser.click_element(By.ID, 'preset-add-btn-tab', use_js=True) select_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='edit-tab-presets-list']//button[text()='Select']")
if len(select_buttons) >= 1:
browser.driver.execute_script("arguments[0].click();", select_buttons[0])
time.sleep(1.5) time.sleep(1.5)
add_modal = browser.wait_for_element(By.ID, 'add-preset-to-tab-modal', timeout=5)
if add_modal:
# Find Add buttons again (first one might now be "Remove")
add_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='add-preset-list']//button[text()='Add']")
if len(add_buttons) >= 1:
# Add second preset
browser.driver.execute_script("arguments[0].click();", add_buttons[0])
time.sleep(2) # Wait for modal to close and tab to reload
browser.handle_alert(accept=True, timeout=1) browser.handle_alert(accept=True, timeout=1)
print(" ✓ Added 2 presets to tab") print(" ✓ Added 2 presets to tab")
else: passed += 1
print(" ⚠ No more presets available to add (all may be added)") elif len(select_buttons) == 1:
else: browser.driver.execute_script("arguments[0].click();", select_buttons[0])
print(" ⚠ Modal didn't reopen for second preset") time.sleep(1.5)
browser.handle_alert(accept=True, timeout=1)
# Make sure modal is closed print(" ✓ Added 1 preset to tab")
try:
browser.click_element(By.ID, 'add-preset-to-tab-close-btn', use_js=True)
except:
pass # Modal might already be closed
time.sleep(1)
passed += 1 passed += 1
else: else:
print(f"✗ Not enough presets with 'Add' button in modal (found {len(add_buttons)})") print(" ⚠ No presets available to add (all already in tab)")
else: else:
print("Add preset modal didn't open") print("Edit tab presets list not found")
else:
print("✗ Add Preset button not found in tab")
except Exception as e: except Exception as e:
print(f"✗ Failed to add presets to tab: {e}") print(f"✗ Failed to add presets to tab: {e}")
import traceback import traceback
@@ -924,30 +945,29 @@ def test_preset_drag_and_drop(browser: BrowserTest) -> bool:
print("✗ Presets disappeared after drag") print("✗ Presets disappeared after drag")
elif len(draggable_presets) == 1: elif len(draggable_presets) == 1:
print(f"⚠ Only 1 preset found in tab (need 2 for drag test). Preset: {draggable_presets[0].text}") print(f"⚠ Only 1 preset found in tab (need 2 for drag test). Preset: {draggable_presets[0].text}")
# Try to add another preset tab_id = browser.driver.execute_script(
add_btn = browser.wait_for_element(By.ID, 'preset-add-btn-tab', timeout=2) "return (window.tabsManager && window.tabsManager.getCurrentTabId && window.tabsManager.getCurrentTabId()) || null;"
if add_btn: )
print(" Attempting to add another preset...") if tab_id:
browser.click_element(By.ID, 'preset-add-btn-tab', use_js=True) browser.driver.execute_script(
time.sleep(1.5) "if (window.tabsManager && window.tabsManager.openEditTabModal) { window.tabsManager.openEditTabModal(arguments[0], null); }",
# Look for "Add" buttons specifically tab_id
add_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='add-preset-list']//button[text()='Add']") )
if add_buttons:
browser.driver.execute_script("arguments[0].click();", add_buttons[0])
time.sleep(2) # Wait for modal to close and tab to reload
browser.handle_alert(accept=True, timeout=1)
# Make sure modal is closed
try:
browser.click_element(By.ID, 'add-preset-to-tab-close-btn', use_js=True)
except:
pass
time.sleep(1) time.sleep(1)
# Check again - wait a bit more for rendering select_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='edit-tab-presets-list']//button[text()='Select']")
if select_buttons:
print(" Attempting to add another preset...")
browser.driver.execute_script("arguments[0].click();", select_buttons[0])
time.sleep(1.5)
browser.handle_alert(accept=True, timeout=1)
try:
browser.driver.execute_script("document.getElementById('edit-tab-modal').classList.remove('active');")
except Exception:
pass
time.sleep(1) time.sleep(1)
draggable_presets = browser.driver.find_elements(By.CSS_SELECTOR, '#presets-list-tab .draggable-preset') draggable_presets = browser.driver.find_elements(By.CSS_SELECTOR, '#presets-list-tab .draggable-preset')
if len(draggable_presets) >= 2: if len(draggable_presets) >= 2:
print(" ✓ Added another preset, now testing drag...") print(" ✓ Added another preset, now testing drag...")
# Try drag now
source = draggable_presets[0] source = draggable_presets[0]
target = draggable_presets[1] target = draggable_presets[1]
actions = ActionChains(browser.driver) actions = ActionChains(browser.driver)
@@ -958,9 +978,7 @@ def test_preset_drag_and_drop(browser: BrowserTest) -> bool:
else: else:
print(f" ✗ Still only {len(draggable_presets)} preset(s) after adding") print(f" ✗ Still only {len(draggable_presets)} preset(s) after adding")
else: else:
print(" ✗ No 'Add' buttons found in modal") print(" ✗ No Select buttons found in Edit Tab modal")
else:
print(" ✗ Add Preset button not found")
else: else:
print(f"✗ No presets found in tab (found {len(draggable_presets)})") print(f"✗ No presets found in tab (found {len(draggable_presets)})")
else: else: