Gemini 3.5 Flash计算机使用功能:视觉驱动的自动化测试与数据采集实践 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度在自动化测试、数据采集和智能助手开发领域让AI模型直接操作计算机界面一直是个技术难点。传统方案要么依赖复杂的DOM解析要么需要编写大量硬编码的点击逻辑维护成本高且适应性差。Google推出的Gemini 3.5 Flash计算机使用功能通过视觉理解和动作生成能力为这个问题提供了全新的解决方案。这项技术让开发者能够构建真正看得见屏幕并能自主操作的智能体。无论是自动化填写网页表单、执行跨网站的数据收集还是进行复杂的用户流程测试都不再需要为每个特定网站编写专用脚本。模型通过分析屏幕截图来理解界面状态然后生成相应的鼠标点击、键盘输入等操作指令。1. 理解Gemini计算机使用的工作原理1.1 核心交互机制Gemini计算机使用功能基于一个持续的执行循环这个循环包含四个关键步骤环境状态捕获客户端捕获当前屏幕的截图作为模型的视觉输入动作决策生成模型分析截图和用户指令生成具体的界面操作建议动作执行客户端解析并执行模型建议的操作状态更新反馈将执行后的新状态反馈给模型继续下一步决策这种机制类似于人类操作计算机的方式——先观察屏幕再决定操作执行后观察结果。模型不需要预先了解网站的具体结构而是通过实时视觉分析来理解界面元素。1.2 坐标归一化处理一个关键的技术细节是坐标归一化。模型返回的点击坐标是基于1000×1000的归一化坐标系而不是实际屏幕像素坐标。这意味着无论你的屏幕分辨率是1920×1080还是1440×900模型都会将界面元素的位置映射到这个统一的坐标系中。这种设计带来了很好的设备适应性但需要在客户端进行坐标转换def denormalize_x(x: int, screen_width: int) - int: 将归一化x坐标(0-1000)转换为实际像素坐标 return int(x / 1000 * screen_width) def denormalize_y(y: int, screen_height: int) - int: 将归一化y坐标(0-1000)转换为实际像素坐标 return int(y / 1000 * screen_height)1.3 支持的环境类型Gemini 3.5 Flash支持三种不同的执行环境每种环境都有相应的操作指令集环境类型适用场景特色功能浏览器环境Web自动化、数据采集完整的浏览器操作包括导航、滚动、表单填写移动环境移动应用测试、自动化应用管理、手势操作、移动端特定交互桌面环境桌面软件自动化系统级操作、文件管理、多窗口控制2. 环境准备与依赖配置2.1 基础环境要求在开始构建计算机使用应用前需要确保开发环境满足以下要求Python 3.8 或 Node.js 16Gemini API密钥从Google AI Studio获取至少4GB可用内存稳定的网络连接2.2 安装必要的依赖包对于Python项目需要安装以下核心依赖# 安装Gemini API客户端库 pip install google-genai # 安装浏览器自动化工具Playwright pip install playwright playwright install chromium # 可选用于图像处理的依赖 pip install pillow base64对于Node.js项目对应的依赖安装# 安装Gemini API客户端库 npm install google/genai # 安装Playwright npm install playwright npx playwright install chromium2.3 API密钥配置安全地管理API密钥是生产环境的基本要求。不要将密钥硬编码在代码中而是使用环境变量或配置文件import os from google import genai # 从环境变量获取API密钥 api_key os.getenv(GEMINI_API_KEY) if not api_key: raise ValueError(请设置GEMINI_API_KEY环境变量) client genai.Client(api_keyapi_key)或者使用配置文件方式import json from google import genai # 从配置文件读取密钥 with open(config.json, r) as f: config json.load(f) client genai.Client(api_keyconfig[gemini_api_key])3. 构建完整的浏览器自动化代理3.1 初始化浏览器环境首先需要设置一个可控的浏览器实例作为执行环境from playwright.sync_api import sync_playwright class BrowserEnvironment: def __init__(self, headlessFalse, screen_width1440, screen_height900): self.screen_width screen_width self.screen_height screen_height self.headless headless # 启动Playwright浏览器 self.playwright sync_playwright().start() self.browser self.playwright.chromium.launch(headlessheadless) # 创建指定尺寸的浏览器上下文 self.context self.browser.new_context( viewport{width: screen_width, height: screen_height} ) self.page self.context.new_page() def navigate(self, url): 导航到指定URL self.page.goto(url) self.page.wait_for_load_state(networkidle) def capture_screenshot(self): 捕获当前屏幕截图并返回base64编码 screenshot_bytes self.page.screenshot(typepng) return base64.b64encode(screenshot_bytes).decode(utf-8) def close(self): 清理资源 self.browser.close() self.playwright.stop()3.2 实现动作执行器动作执行器负责将模型生成的操作指令转换为实际的浏览器操作class ActionExecutor: def __init__(self, browser_env): self.browser_env browser_env self.page browser_env.page def execute_function_call(self, function_call): 执行单个函数调用 action_name function_call.name arguments function_call.arguments print(f执行动作: {action_name}) print(f意图说明: {arguments.get(intent, 未提供)}) try: if action_name click: self._execute_click(arguments) elif action_name type: self._execute_type(arguments) elif action_name navigate: self._execute_navigate(arguments) elif action_name scroll: self._execute_scroll(arguments) # 其他动作处理... # 等待页面稳定 self.page.wait_for_load_state(networkidle, timeout5000) return {status: success} except Exception as e: print(f动作执行失败: {e}) return {status: error, message: str(e)} def _execute_click(self, args): 执行点击操作 x self._denormalize_x(args[x], self.browser_env.screen_width) y self._denormalize_y(args[y], self.browser_env.screen_height) self.page.mouse.click(x, y) def _execute_type(self, args): 执行文本输入操作 if x in args and y in args: x self._denormalize_x(args[x], self.browser_env.screen_width) y self._denormalize_y(args[y], self.browser_env.screen_height) self.page.mouse.click(x, y) # 清空现有文本并输入新内容 self.page.keyboard.press(ControlA) self.page.keyboard.press(Backspace) self.page.keyboard.type(args[text]) if args.get(press_enter, False): self.page.keyboard.press(Enter) def _denormalize_x(self, x, screen_width): return int(x / 1000 * screen_width) def _denormalize_y(self, y, screen_height): return int(y / 1000 * screen_height)3.3 构建完整的代理循环将各个组件组合成完整的自动化代理class ComputerUseAgent: def __init__(self, api_key, headlessTrue): self.client genai.Client(api_keyapi_key) self.browser_env BrowserEnvironment(headlessheadless) self.action_executor ActionExecutor(self.browser_env) self.conversation_history [] def run_task(self, task_description, initial_urlNone, max_turns10): 运行自动化任务 if initial_url: self.browser_env.navigate(initial_url) # 捕获初始状态 screenshot self.browser_env.capture_screenshot() # 构建初始请求 interaction self.client.interactions.create( modelgemini-3.5-flash, input[ {type: text, text: task_description}, {type: image, data: screenshot, mime_type: image/png} ], tools[{ type: computer_use, environment: browser, enable_prompt_injection_detection: True }] ) # 执行多轮交互 for turn in range(max_turns): print(f\n 第 {turn 1} 轮 ) # 检查是否还有待执行的动作 function_calls [ step for step in interaction.steps if step.type function_call ] if not function_calls: print(任务完成或无需进一步动作) break # 执行所有动作 results [] for function_call in function_calls: result self.action_executor.execute_function_call(function_call) results.append({ name: function_call.name, call_id: function_call.id, result: result }) # 捕获新状态并继续对话 new_screenshot self.browser_env.capture_screenshot() function_responses self._build_function_responses(results, new_screenshot) interaction self.client.interactions.create( modelgemini-3.5-flash, previous_interaction_idinteraction.id, inputfunction_responses, tools[{ type: computer_use, environment: browser, enable_prompt_injection_detection: True }] ) def _build_function_responses(self, results, screenshot): 构建函数执行响应 function_responses [] for result in results: function_responses.append({ type: function_result, name: result[name], call_id: result[call_id], result: [ { type: text, text: json.dumps(result[result]) }, { type: image, data: screenshot, mime_type: image/png } ] }) return function_responses def close(self): 清理资源 self.browser_env.close()4. 实际应用案例与代码实现4.1 电商价格监控自动化以下是一个完整的电商价格监控示例演示如何自动搜索商品并提取价格信息def ecommerce_price_monitor(): 电商价格监控自动化示例 agent ComputerUseAgent(api_keyos.getenv(GEMINI_API_KEY), headlessFalse) try: task 请执行以下操作 1. 访问京东网站 (jd.com) 2. 搜索iPhone 15 3. 按价格从低到高排序 4. 记录前3个商品的价格和名称 5. 将结果以JSON格式返回 agent.run_task(task, initial_urlhttps://www.jd.com, max_turns15) except Exception as e: print(f执行过程中出现错误: {e}) finally: agent.close() # 运行示例 if __name__ __main__: ecommerce_price_monitor()4.2 自动化表单填写系统对于需要处理复杂表单的场景可以构建专门的表单填写逻辑class FormFillingAgent(ComputerUseAgent): def fill_complex_form(self, form_data): 智能表单填写 specialized_instruction 你是一个表单填写专家。请仔细阅读表单的每个字段标签 根据提供的数据准确填写。注意字段类型文本、单选、多选等 填写完成后仔细检查所有内容。 task f 请填写以下表单数据 {json.dumps(form_data, ensure_asciiFalse, indent2)} 填写要求 - 仔细匹配字段标签 - 对于日期字段使用正确的格式 - 单选按钮需要精确点击 - 填写完成后检查一遍 # 组合系统指令和任务 full_input specialized_instruction \n\n task self.run_task(full_input, max_turns20) # 使用示例 form_data { 姓名: 张三, 邮箱: zhangsanexample.com, 电话: 13800138000, 性别: 男, 出生日期: 1990-01-01, 教育程度: 本科, 工作经历: 5年软件开发经验 } agent FormFillingAgent(api_keyos.getenv(GEMINI_API_KEY)) agent.fill_complex_form(form_data)4.3 跨网站数据收集代理对于需要从多个网站收集信息的复杂任务class MultiSiteDataCollector: def __init__(self, api_key): self.agent ComputerUseAgent(api_key) self.collected_data [] def collect_travel_info(self, destination, check_in, check_out): 收集多个网站的旅行信息 tasks [ { site: 携程, url: https://www.ctrip.com, task: f搜索{destination}从{check_in}到{check_out}的酒店记录前5个结果 }, { site: 飞猪, url: https://www.fliggy.com, task: f搜索{destination}从{check_in}到{check_out}的酒店按评分排序记录前5个 } ] for task_info in tasks: print(f正在从{task_info[site]}收集数据...) try: self.agent.browser_env.navigate(task_info[url]) self.agent.run_task(task_info[task], max_turns12) # 这里可以添加数据提取和解析逻辑 except Exception as e: print(f{task_info[site]}数据收集失败: {e}) # 短暂暂停避免请求过于频繁 time.sleep(2) return self.collected_data5. 安全配置与最佳实践5.1 安全策略配置Gemini 3.5 Flash提供了细粒度的安全控制可以根据任务需求调整安全策略def create_secure_agent(): 创建具有安全配置的代理 # 定义安全策略 safety_config { type: computer_use, environment: browser, enable_prompt_injection_detection: True, disabled_safety_policies: [ # 根据任务需求禁用特定策略 # FINANCIAL_TRANSACTIONS, # 谨慎禁用 # SENSITIVE_DATA_MODIFICATION ] } # 安全系统指令 security_instruction 安全操作准则 1. 涉及金融交易时必须请求用户确认 2. 不要自动同意法律条款 3. 遇到验证码时停止并提示用户 4. 敏感信息操作需要明确授权 return safety_config, security_instruction5.2 沙盒环境部署在生产环境中必须在沙盒中运行自动化代理以避免安全风险# Dockerfile for sandboxed environment FROM ubuntu:20.04 # 安装基础依赖 RUN apt-get update apt-get install -y \ python3.8 \ python3-pip \ playwright \ chromium-browser # 创建非特权用户 RUN useradd -m -s /bin/bash agentuser USER agentuser # 安装Python依赖 COPY --chownagentuser:agentuser requirements.txt . RUN pip3 install -r requirements.txt # 复制应用代码 COPY --chownagentuser:agentuser app/ /home/agentuser/app/ WORKDIR /home/agentuser/app CMD [python3, main.py]5.3 错误处理与重试机制健壮的自动化系统需要完善的错误处理class RobustComputerUseAgent(ComputerUseAgent): def execute_with_retry(self, function_call, max_retries3): 带重试机制的动作执行 for attempt in range(max_retries): try: result self.action_executor.execute_function_call(function_call) if result[status] success: return result # 失败时等待并重试 time.sleep(2 ** attempt) # 指数退避 except Exception as e: print(f第{attempt 1}次尝试失败: {e}) if attempt max_retries - 1: raise return {status: error, message: 超过最大重试次数} def safe_screenshot(self): 安全的截图捕获处理各种异常情况 try: return self.browser_env.capture_screenshot() except Exception as e: print(f截图失败: {e}) # 尝试恢复浏览器状态 self._recover_browser() raise6. 性能优化与监控6.1 思考级别配置Gemini 3.5 Flash允许配置不同的思考级别平衡响应速度和质量def optimize_thinking_level(task_complexity): 根据任务复杂度配置思考级别 thinking_configs { simple: { thinking_level: low, # 快速响应适合简单任务 timeout: 30 }, medium: { thinking_level: medium, # 平衡模式 timeout: 60 }, complex: { thinking_level: high, # 深度思考复杂任务 timeout: 120 } } return thinking_configs.get(task_complexity, thinking_configs[medium])6.2 执行监控与日志记录完善的监控系统对于生产环境至关重要import logging import time from datetime import datetime class MonitoredAgent(ComputerUseAgent): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setup_logging() self.metrics { start_time: None, actions_executed: 0, errors_encountered: 0, screenshots_taken: 0 } def setup_logging(self): 配置结构化日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(agent_execution.log), logging.StreamHandler() ] ) self.logger logging.getLogger(ComputerUseAgent) def run_task(self, *args, **kwargs): 重写run_task方法加入监控 self.metrics[start_time] datetime.now() self.logger.info(f开始执行任务: {args[0][:100]}...) try: result super().run_task(*args, **kwargs) self.logger.info(任务执行完成) return result except Exception as e: self.metrics[errors_encountered] 1 self.logger.error(f任务执行失败: {e}) raise finally: self._report_metrics() def _report_metrics(self): 报告执行指标 duration datetime.now() - self.metrics[start_time] self.logger.info(f 执行统计: - 总时长: {duration} - 执行动作: {self.metrics[actions_executed]} - 遇到错误: {self.metrics[errors_encountered]} - 截图次数: {self.metrics[screenshots_taken]} )7. 常见问题排查与解决方案7.1 坐标定位问题模型返回的坐标与实际界面元素不匹配是常见问题问题现象点击位置偏移点击了错误元素在某些分辨率下工作不正常解决方案def improve_click_accuracy(self, expected_element_selector): 提高点击准确性的辅助方法 # 先尝试通过选择器定位元素 element self.page.query_selector(expected_element_selector) if element: # 使用Playwright的准确点击 element.click() return True else: # 回退到模型坐标点击 return False def calibrate_coordinates(self): 坐标系统校准 # 在已知元素上测试点击准确性 test_elements [ {selector: #logo, description: 网站Logo}, {selector: .search-box, description: 搜索框} ] for element in test_elements: if self.page.query_selector(element[selector]): # 执行校准逻辑 self._calibrate_element(element)7.2 页面加载状态检测页面加载不完全会导致模型无法正确识别界面问题现象模型无法找到预期元素操作在页面加载完成前执行截图内容不完整解决方案def wait_for_conditional_ready(self, conditions, timeout30000): 等待多个就绪条件 start_time time.time() while time.time() - start_time timeout / 1000: ready True for condition in conditions: if not self._check_condition(condition): ready False break if ready: return True time.sleep(1) return False def _check_condition(self, condition): 检查单个就绪条件 condition_type condition.get(type) if condition_type selector: return bool(self.page.query_selector(condition[value])) elif condition_type network: return self.page.evaluate(() { return document.readyState complete; }) elif condition_type custom: return condition[checker](self.page)7.3 处理动态内容与异步加载现代Web应用大量使用动态内容需要特殊处理def handle_dynamic_content(self, max_wait10): 处理动态加载内容的策略 strategies [ self._wait_for_network_idle, self._wait_for_element_stable, self._wait_for_animations_complete ] for strategy in strategies: if strategy(max_wait): return True return False def _wait_for_element_stable(self, max_wait): 等待元素位置稳定 positions {} stable_count 0 required_stable 3 for i in range(max_wait * 2): # 每0.5秒检查一次 current_positions self._get_key_elements_positions() if positions and self._positions_equal(positions, current_positions): stable_count 1 if stable_count required_stable: return True else: stable_count 0 positions current_positions time.sleep(0.5) return False8. 生产环境部署建议8.1 基础设施架构对于生产级部署建议采用以下架构用户请求 → API网关 → 任务队列 → 工作节点(沙盒环境) → Gemini API ↓ 监控与日志系统 ↓ 结果存储数据库8.2 资源管理与限制实施资源限制防止滥用和过度消耗class ResourceManager: def __init__(self): self.concurrent_tasks 0 self.max_concurrent 10 self.daily_usage 0 self.daily_limit 1000 def can_start_task(self): 检查是否可以启动新任务 if (self.concurrent_tasks self.max_concurrent or self.daily_usage self.daily_limit): return False return True def record_task_start(self): 记录任务开始 self.concurrent_tasks 1 self.daily_usage 1 def record_task_end(self): 记录任务结束 self.concurrent_tasks - 18.3 成本控制策略Gemini API使用需要成本控制特别是对于大规模应用class CostController: def __init__(self, budget_daily100): self.budget_daily budget_daily self.today_cost 0 self.token_usage {} def estimate_cost(self, interaction): 估算交互成本 # 基于token使用量估算成本 total_tokens sum(step.token_count for step in interaction.steps) cost total_tokens * 0.0000015 # 示例费率 return cost def can_proceed(self, estimated_cost): 检查是否在预算内 if self.today_cost estimated_cost self.budget_daily: return False return TrueGemini 3.5 Flash的计算机使用功能为自动化领域带来了革命性的变化但成功实施需要综合考虑技术实现、安全防护和运营管理。从简单的浏览器自动化到复杂的企业级流程这项技术都展现出了强大的潜力。关键在于理解其工作原理建立适当的安全边界并设计健壮的错误处理机制。随着技术的不断成熟我们有理由相信视觉驱动的自动化将成为未来人机协作的重要范式。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度