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
|
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
|
from selenium.webdriver.support import expected_conditions as EC
|
||||||
from selenium.webdriver.support import expected_conditions as EC
|
from selenium.webdriver.chrome.options import Options
|
||||||
from selenium.webdriver.chrome.options import Options
|
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])
|
||||||
|
|
||||||
# Re-open modal to add second preset
|
|
||||||
browser.click_element(By.ID, 'preset-add-btn-tab', use_js=True)
|
|
||||||
time.sleep(1.5)
|
time.sleep(1.5)
|
||||||
add_modal = browser.wait_for_element(By.ID, 'add-preset-to-tab-modal', timeout=5)
|
browser.handle_alert(accept=True, timeout=1)
|
||||||
if add_modal:
|
select_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='edit-tab-presets-list']//button[text()='Select']")
|
||||||
# Find Add buttons again (first one might now be "Remove")
|
if len(select_buttons) >= 1:
|
||||||
add_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='add-preset-list']//button[text()='Add']")
|
browser.driver.execute_script("arguments[0].click();", select_buttons[0])
|
||||||
if len(add_buttons) >= 1:
|
time.sleep(1.5)
|
||||||
# Add second preset
|
browser.handle_alert(accept=True, timeout=1)
|
||||||
browser.driver.execute_script("arguments[0].click();", add_buttons[0])
|
print(" ✓ Added 2 presets to tab")
|
||||||
time.sleep(2) # Wait for modal to close and tab to reload
|
passed += 1
|
||||||
browser.handle_alert(accept=True, timeout=1)
|
elif len(select_buttons) == 1:
|
||||||
print(" ✓ Added 2 presets to tab")
|
browser.driver.execute_script("arguments[0].click();", select_buttons[0])
|
||||||
else:
|
time.sleep(1.5)
|
||||||
print(" ⚠ No more presets available to add (all may be added)")
|
browser.handle_alert(accept=True, timeout=1)
|
||||||
else:
|
print(" ✓ Added 1 preset to tab")
|
||||||
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)
|
|
||||||
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,43 +945,40 @@ 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:
|
)
|
||||||
|
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...")
|
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)
|
time.sleep(1.5)
|
||||||
# Look for "Add" buttons specifically
|
browser.handle_alert(accept=True, timeout=1)
|
||||||
add_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='add-preset-list']//button[text()='Add']")
|
try:
|
||||||
if add_buttons:
|
browser.driver.execute_script("document.getElementById('edit-tab-modal').classList.remove('active');")
|
||||||
browser.driver.execute_script("arguments[0].click();", add_buttons[0])
|
except Exception:
|
||||||
time.sleep(2) # Wait for modal to close and tab to reload
|
pass
|
||||||
browser.handle_alert(accept=True, timeout=1)
|
time.sleep(1)
|
||||||
# Make sure modal is closed
|
draggable_presets = browser.driver.find_elements(By.CSS_SELECTOR, '#presets-list-tab .draggable-preset')
|
||||||
try:
|
if len(draggable_presets) >= 2:
|
||||||
browser.click_element(By.ID, 'add-preset-to-tab-close-btn', use_js=True)
|
print(" ✓ Added another preset, now testing drag...")
|
||||||
except:
|
source = draggable_presets[0]
|
||||||
pass
|
target = draggable_presets[1]
|
||||||
|
actions = ActionChains(browser.driver)
|
||||||
|
actions.click_and_hold(source).move_to_element(target).release().perform()
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
# Check again - wait a bit more for rendering
|
print("✓ Performed drag and drop")
|
||||||
time.sleep(1)
|
passed += 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")
|
|
||||||
else:
|
else:
|
||||||
print(" ✗ No 'Add' buttons found in modal")
|
print(f" ✗ Still only {len(draggable_presets)} preset(s) after adding")
|
||||||
else:
|
else:
|
||||||
print(" ✗ Add Preset button not found")
|
print(" ✗ No Select buttons found in Edit Tab modal")
|
||||||
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:
|
||||||
|
|||||||
Reference in New Issue
Block a user