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:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user