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,18 +9,14 @@ import time
import requests
from typing import Optional, List
try:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import TimeoutException, NoSuchElementException
except ImportError:
print("Selenium not installed. Install with: pip install selenium")
sys.exit(1)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import TimeoutException, NoSuchElementException
# Base URL for the device
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")
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:
"""Test 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")
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
try:
# Click "Add Preset" button in the tab area
add_preset_btn = browser.wait_for_element(By.ID, 'preset-add-btn-tab', timeout=5)
if add_preset_btn:
browser.click_element(By.ID, 'preset-add-btn-tab', use_js=True)
time.sleep(1.5) # Wait for modal to fully render
# Wait for the add preset modal
add_modal = browser.wait_for_element(By.ID, 'add-preset-to-tab-modal', timeout=5)
if add_modal:
# 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']")
if len(add_buttons) >= 2:
# Add first preset - the modal will close after clicking
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) # Handle any alerts
# Re-open modal to add second preset
browser.click_element(By.ID, 'preset-add-btn-tab', use_js=True)
tab_id = browser.driver.execute_script(
"return (window.tabsManager && window.tabsManager.getCurrentTabId && window.tabsManager.getCurrentTabId()) || null;"
)
if not tab_id:
print("✗ Could not get current tab id")
else:
browser.driver.execute_script(
"if (window.tabsManager && window.tabsManager.openEditTabModal) { window.tabsManager.openEditTabModal(arguments[0], null); }",
tab_id
)
time.sleep(1)
list_el = browser.wait_for_element(By.ID, 'edit-tab-presets-list', timeout=5)
if list_el:
select_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='edit-tab-presets-list']//button[text()='Select']")
if len(select_buttons) >= 2:
browser.driver.execute_script("arguments[0].click();", select_buttons[0])
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)
print(" ✓ Added 2 presets to tab")
else:
print(" ⚠ No more presets available to add (all may be added)")
else:
print(" ⚠ Modal didn't reopen for second preset")
# Make sure modal is closed
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)
browser.handle_alert(accept=True, timeout=1)
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)
browser.handle_alert(accept=True, timeout=1)
print(" ✓ Added 2 presets to tab")
passed += 1
elif len(select_buttons) == 1:
browser.driver.execute_script("arguments[0].click();", select_buttons[0])
time.sleep(1.5)
browser.handle_alert(accept=True, timeout=1)
print(" ✓ Added 1 preset to tab")
passed += 1
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:
print("Add preset modal didn't open")
else:
print("✗ Add Preset button not found in tab")
print("Edit tab presets list not found")
except Exception as e:
print(f"✗ Failed to add presets to tab: {e}")
import traceback
@@ -924,43 +945,40 @@ def test_preset_drag_and_drop(browser: BrowserTest) -> bool:
print("✗ Presets disappeared after drag")
elif len(draggable_presets) == 1:
print(f"⚠ Only 1 preset found in tab (need 2 for drag test). Preset: {draggable_presets[0].text}")
# Try to add another preset
add_btn = browser.wait_for_element(By.ID, 'preset-add-btn-tab', timeout=2)
if add_btn:
tab_id = browser.driver.execute_script(
"return (window.tabsManager && window.tabsManager.getCurrentTabId && window.tabsManager.getCurrentTabId()) || null;"
)
if tab_id:
browser.driver.execute_script(
"if (window.tabsManager && window.tabsManager.openEditTabModal) { window.tabsManager.openEditTabModal(arguments[0], null); }",
tab_id
)
time.sleep(1)
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.click_element(By.ID, 'preset-add-btn-tab', use_js=True)
browser.driver.execute_script("arguments[0].click();", select_buttons[0])
time.sleep(1.5)
# Look for "Add" buttons specifically
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
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)
draggable_presets = browser.driver.find_elements(By.CSS_SELECTOR, '#presets-list-tab .draggable-preset')
if len(draggable_presets) >= 2:
print(" ✓ Added another preset, now testing drag...")
source = draggable_presets[0]
target = draggable_presets[1]
actions = ActionChains(browser.driver)
actions.click_and_hold(source).move_to_element(target).release().perform()
time.sleep(1)
# Check again - wait a bit more for rendering
time.sleep(1)
draggable_presets = browser.driver.find_elements(By.CSS_SELECTOR, '#presets-list-tab .draggable-preset')
if len(draggable_presets) >= 2:
print(" ✓ Added another preset, now testing drag...")
# Try drag now
source = draggable_presets[0]
target = draggable_presets[1]
actions = ActionChains(browser.driver)
actions.click_and_hold(source).move_to_element(target).release().perform()
time.sleep(1)
print("✓ Performed drag and drop")
passed += 1
else:
print(f" ✗ Still only {len(draggable_presets)} preset(s) after adding")
print("✓ Performed drag and drop")
passed += 1
else:
print("No 'Add' buttons found in modal")
print(f"Still only {len(draggable_presets)} preset(s) after adding")
else:
print("Add Preset button not found")
print("No Select buttons found in Edit Tab modal")
else:
print(f"✗ No presets found in tab (found {len(draggable_presets)})")
else: