"""Shared test helper for LLM model tests.""" import os import pytest from browser_use.agent.service import Agent from browser_use.browser.profile import BrowserProfile from browser_use.browser.session import BrowserSession async def run_model_button_click_test( model_class, model_name: str, api_key_env: str | None, extra_kwargs: dict, httpserver, ): """Test that an LLM model can click a button. This test verifies: 1. Model can be initialized with API key 2. Agent can navigate and click a button 3. Button click is verified by checking page state change 4. Completes within max 2 steps """ # Handle API key validation - skip test if not available if api_key_env is not None: api_key = os.getenv(api_key_env) if not api_key: pytest.skip(f'{api_key_env} not set - skipping test') else: api_key = None # Handle Azure-specific endpoint validation from browser_use.llm.azure.chat import ChatAzureOpenAI if model_class is ChatAzureOpenAI: azure_endpoint = os.getenv('AZURE_OPENAI_ENDPOINT') if not azure_endpoint: pytest.skip('AZURE_OPENAI_ENDPOINT not set - skipping test') # Add the azure_endpoint to extra_kwargs extra_kwargs = {**extra_kwargs, 'azure_endpoint': azure_endpoint} # Create HTML page with a button that changes page content when clicked html = """ Button Test

Button Click Test

NOT_CLICKED
""" httpserver.expect_request('/').respond_with_data(html, content_type='text/html') # Create LLM instance with extra kwargs if provided llm_kwargs = {'model': model_name} if api_key is not None: llm_kwargs['api_key'] = api_key llm_kwargs.update(extra_kwargs) llm = model_class(**llm_kwargs) # type: ignore[arg-type] # Create browser session browser = BrowserSession( browser_profile=BrowserProfile( headless=True, user_data_dir=None, # Use temporary directory ) ) try: # Start browser await browser.start() # Create agent with button click task (URL in task triggers auto-navigation) test_url = httpserver.url_for('/') agent = Agent( task=f'{test_url} - Click the button', llm=llm, browser_session=browser, max_steps=2, # Max 2 steps as per requirements ) # Run the agent result = await agent.run() # Verify task completed assert result is not None assert len(result.history) > 0 # Verify button was clicked by checking page state across any step button_clicked = False for step in result.history: # Check state_message which contains browser state with page text if step.state_message and 'SUCCESS' in step.state_message: button_clicked = True break # Check if SUCCESS appears in any step (indicating button was clicked) assert button_clicked, 'Button was not clicked - SUCCESS not found in any page state' finally: # Clean up browser session await browser.kill()