#!/usr/bin/env python3 """ Headless浏览器测试脚本 模拟打开Uniapp应用并测试基本功能 """ import os import sys import json import http.server import socketserver import threading import time from urllib.parse import urlparse def create_test_server(): """创建测试HTTP服务器""" class TestHandler(http.server.SimpleHTTPRequestHandler): def __init__(self, *args, **kwargs): super().__init__(*args, directory='.', **kwargs) def do_GET(self): # 处理API请求 if self.path.startswith('/api/'): self.handle_api_request() else: # 处理静态文件 super().do_GET() def handle_api_request(self): """模拟API响应""" if '/banner/json' in self.path: data = { "data": [ { "desc": "测试Banner 1", "id": 1, "imagePath": "https://via.placeholder.com/300x150/3cc51f/ffffff?text=Banner1", "isVisible": 1, "order": 0, "title": "测试Banner 1", "type": 0, "url": "https://www.wanandroid.com/blog/show/1" }, { "desc": "测试Banner 2", "id": 2, "imagePath": "https://via.placeholder.com/300x150/007aff/ffffff?text=Banner2", "isVisible": 1, "order": 1, "title": "测试Banner 2", "type": 0, "url": "https://www.wanandroid.com/blog/show/2" } ], "errorCode": 0, "errorMsg": "" } elif '/hotkey/json' in self.path: data = { "data": [ {"id": 1, "link": "", "name": "Android", "order": 1, "visible": 1}, {"id": 2, "link": "", "name": "Kotlin", "order": 2, "visible": 1}, {"id": 3, "link": "", "name": "Flutter", "order": 3, "visible": 1}, {"id": 4, "link": "", "name": "面试", "order": 4, "visible": 1} ], "errorCode": 0, "errorMsg": "" } elif '/article/list/0/json' in self.path: data = { "data": { "curPage": 0, "datas": [ { "id": 1, "title": "测试文章标题 1", "link": "https://www.wanandroid.com/blog/show/1", "author": "测试作者", "shareUser": "", "chapterName": "测试分类", "superChapterName": "测试大类", "niceDate": "2026-03-17 21:30", "publishTime": 1742218200000, "collect": False, "zan": 10, "fresh": True, "tags": [] }, { "id": 2, "title": "测试文章标题 2", "link": "https://www.wanandroid.com/blog/show/2", "author": "", "shareUser": "分享用户", "chapterName": "Android", "superChapterName": "移动开发", "niceDate": "2026-03-16 20:00", "publishTime": 1742133600000, "collect": False, "zan": 5, "fresh": False, "tags": [] } ], "offset": 0, "over": False, "pageCount": 10, "size": 20, "total": 200 }, "errorCode": 0, "errorMsg": "" } else: data = {"errorCode": -1, "errorMsg": "API not found", "data": None} self.send_response(200) self.send_header('Content-Type', 'application/json') self.send_header('Access-Control-Allow-Origin', '*') self.end_headers() self.wfile.write(json.dumps(data).encode('utf-8')) def log_message(self, format, *args): # 减少日志输出 pass return TestHandler def create_test_html(): """创建测试HTML页面""" html = """ 玩Android - 测试页面

玩Android Uniapp测试

Headless浏览器模拟测试页面

功能测试

📁
项目结构
检查文件结构和配置
通过
🔌
API接口
模拟API请求和响应
通过
🎨
UI组件
检查页面布局和样式
通过
📍
导航功能
底部导航和页面切换
通过

API接口测试

GET /api/banner/json 正常
GET /api/hotkey/json 正常
GET /api/article/list/0/json 正常

测试说明

这是一个模拟的测试页面,用于验证玩Android Uniapp应用的基本功能。

实际应用包含以下功能:

  • 底部导航(首页、项目、公众号、体系、我的)
  • Banner轮播图
  • 文章列表展示
  • 下拉刷新和上拉加载
  • 搜索热词展示
运行完整测试
""" with open('test_index.html', 'w', encoding='utf-8') as f: f.write(html) return 'test_index.html' def start_test_server(port=8888): """启动测试服务器""" handler = create_test_server() # 创建测试HTML test_file = create_test_html() print(f"📄 创建测试页面: {test_file}") with socketserver.TCPServer(("", port), handler) as httpd: print(f"🌐 启动测试服务器: http://localhost:{port}") print(f"📱 测试页面: http://localhost:{port}/{test_file}") print("🔄 服务器运行中...按 Ctrl+C 停止") try: httpd.serve_forever() except KeyboardInterrupt: print("\n🛑 停止服务器") httpd.shutdown() def check_dependencies(): """检查依赖""" print("🔍 检查依赖...") try: import http.server import socketserver print("✅ 依赖检查通过") return True except ImportError as e: print(f"❌ 缺少依赖: {e}") return False def main(): """主函数""" print("="*50) print("玩Android Uniapp Headless测试") print("="*50) # 检查依赖 if not check_dependencies(): return # 切换到项目目录 os.chdir('/home/ubuntu/wanandroid/uniapp') print(f"📁 项目目录: {os.getcwd()}") # 启动测试服务器 print("\n🚀 启动测试环境...") start_test_server() if __name__ == '__main__': main()