by Rain Chu   | 8 月 8, 2025  | Agent , AI , Javascript , Python , RPA , 瀏覽器 , 程式開發 
想用 AI 控制網頁自動化,但程式碼又要精準可靠,同時享受自然語言,高效又方便?那你絕不能錯過由 Browserbase 團隊推出的 Stagehand  —— 這款專為 AI 時代設計的瀏覽器自動化框架,不僅支援 TypeScript 與 Python、可本地或雲端部署,還比 Browser‑Use 更快、更耐變動!
Stagehand 兼具控制力與智慧的 AI 瀏覽器自動化框架 
Stagehand 是以 Playwright 為核心構建的 AI-native 自動化工具,它加入了 LLM 判斷能力,結合程式精準控制與自然語言指令,令自動化腳本更穩定、更智慧也更高效
自然語言 + 程式碼混合操作 :你可以用程式寫明確動作,也能用「act(‘點擊第一個 Stagehand 元件’)」這樣類人語法完成UI操作 。 
接口完整,支援察看、執行與資料萃取 :核心三大命令 act、observe、extract,讓操作更透明、更可控  
容錯與自恢復能力 :UI 略有變動也不怕,Stagehand 的 observe + 快取策略讓腳本更具彈性 
完美整合 Playwright :所有 Playwright 腳本都能無縫升級 Stagehand,省心又高效 
 
核心玩法!TypeScript/JavaScript 快速上手範例 
// Use Playwright functions on the page object
const page = stagehand.page;
await page.goto("https://github.com/browserbase");
// Use act() to execute individual actions
await page.act("click on the stagehand repo");
// Use Computer Use agents for larger actions
const agent = stagehand.agent({
    provider: "openai",
    model: "computer-use-preview",
});
await agent.execute("Get to the latest PR");
// Use extract() to read data from the page
const { author, title } = await page.extract({
  instruction: "extract the author and title of the PR",
  schema: z.object({
    author: z.string().describe("The username of the PR author"),
    title: z.string().describe("The title of the PR"),
  }),
});  
這段程式完整示範了初始化、導航、AI 驅動操作到資料萃取的流程,不僅省事,也大幅提升開發效率。
Stagehand 與 Browser-Use 比較 
功能面 Stagehand(此文主角) Browser-Use 控制精準度 Token 級動作掌控 + 自然語言指令混合 攻擊角度偏自然語言,程式控制較弱 容錯能力 observe + 快取策略,對 DOM 變化更耐受缺少自恢復機制 雲端支援 原生整合 Browserbase,輕鬆雲端部署 需額外集成,無預設雲平台支援 語言支援 TypeScript / Python 主要依賴 Python AI 整合 天生結合 LLM,支援複雜任務拆解 依賴外部 LLM,不那麼一體化 
 
只要先學四個指令,快速上手 
指定去那一個網頁 
goto():
    # 初始化
    page = stagehand.page
    # 指定去那一個頁面
    await page.goto("https://rain.tips/")  
使用自然語言操作 
act():
    await page.act("點選確定按鈕");  
抓取數據資料 
extract():
    post = await page.extract("取得標題")  
預覽功能 
observe():
   links = await page.observe("找到頁面中的所有連結")  
實戰快速導覽 
安裝
# 用 pip
pip install stagehand python-dotenv
# 安裝playwright
python -m playwright install
# 裝 chromium 瀏覽器
python -m playwright install chromium  
建立 .env
export BROWSERBASE_API_KEY="your_browserbase_api_key"
export BROWSERBASE_PROJECT_ID="your_browserbase_project_id"
export MODEL_API_KEY="your_model_api_key"  # OpenAI, Anthropic, etc.  
建立程式碼 main.py
import asyncio
import os
from stagehand import Stagehand, StagehandConfig
from dotenv import load_dotenv
load_dotenv()
async def main():
    config = StagehandConfig(
        env="BROWSERBASE",
        api_key=os.getenv("BROWSERBASE_API_KEY"),
        project_id=os.getenv("BROWSERBASE_PROJECT_ID"),
        model_name="gpt-4o",
        model_api_key=os.getenv("MODEL_API_KEY")
    )
    
    stagehand = Stagehand(config)
    
    try:
        await stagehand.init()
        page = stagehand.page
        
        await page.goto("https://docs.stagehand.dev/")
        await page.act("click the quickstart link")
        
        result = await page.extract("extract the main heading of the page")
        
        print(f"Extracted: {result}")
        
    finally:
        await stagehand.close()
if __name__ == "__main__":
    asyncio.run(main())  
驗證與測試
若要用本地端的瀏覽器的話,可以改成下面的程式碼
import asyncio
import os
from dotenv import load_dotenv
from stagehand import StagehandConfig, Stagehand
load_dotenv()
async def main():
    # 检查API密钥是否设置
    api_key = os.getenv("OPENAI_API_KEY")
    config = StagehandConfig(
        env="LOCAL",  # 本地运行
        # AI模型配置 - 使用环境变量
        model_name="gpt-4o-mini",  # 使用更便宜的模型
        model_api_key=api_key,  # 从环境变量读取
        # 本地运行配置
        headless=False,  # 显示浏览器窗口
        verbose=3,  # 详细日志
        debug_dom=True,  # DOM调试
    )
    # 使用配置创建Stagehand实例
    stagehand = Stagehand(config)
    # 初始化Stagehand(启动浏览器会话)
    await stagehand.init()
    # 获取页面对象,用于后续的页面操作
    page = stagehand.page
    await page.goto("https://rain.tips/")
    # # 使用observe()取得文章的連結
    blog_links = await page.observe("取得文章中的所有連結)
    print(f"✅ Page link: {blog_links}")
    await page.act(blog_links[0]) 
    data_post_1 = await page.extract("取得文章的標題和內文")
    print(f"✅ 文章資訊如下: {data_post_1}")
if __name__ == "__main__":
    asyncio.run(main())
  
總結:為什麼 Stagehand 是下一代自動化框架? 
語言直覺更自然,人類可理解  
對 UI 變化具彈性、不易失效  
結合 LLM,自動拆解任務,效率提升數倍  
支援本地與雲端,開發與生產環境都得心應手  
 
Stagehand 正重新定義瀏覽器自動化,不再只是死板指令,而是一場「程式控+AI 智能」的完美結合,無論對開發者或 AI 自動化愛好者,都是一大利器。快一起駕馭它,打造更強、更智慧的自動化流程!
參考資料 
BrowserBase  
GitHub Stagehand 
Demo 
開發說明文件 
https://www.aivi.fyi/aiagents/introduce-stagehand 
 
				
					 
			
					
											
								 							 
					
															
					
					 by Rain Chu   | 4 月 26, 2025  | Python , 程式 
UIAutoDev   是一款不可或缺的工具,它支援 Android 和 iOS 平台,提供直觀的圖形介面,讓開發者能夠輕鬆地定位 UI 元素、生成選擇器,並進行色彩分析。
UIAutoDev UI DEMO  
 
🔧 UIAutoDev 的核心特色 
1. 支援 Android 和 iOS 平台 
UIAutoDev 同時支援 Android 和 iOS 裝置的 UI 元素檢視與操作。對於 iOS,用戶需自行啟動 WebDriverAgent(WDA)服務,以實現與裝置的連接。
2. 直觀的控件選擇與屬性檢視 
透過滑鼠點選應用程式中的控件,UIAutoDev 會即時顯示該元素的屬性資訊,如 resource-id、text、class 等,並在控件樹中高亮顯示,方便用戶精確定位。
3. 自動生成 XPath 選擇器 
UIAutoDev 能夠根據選取的控件,自動生成多個 XPath 選擇器,並標示每個選擇器匹配的元素數量,協助用戶選擇最合適的定位方式。
4. 色彩分析與坐標微調 
工具提供找色功能,允許用戶獲取指定位置的 RGB 和 HSB 色值。同時,透過方向鍵微調坐標,精確定位需要操作的區域,提升自動化腳本的準確性。
 
🚀 安裝與使用指南 
1. 安裝 Python 環境 
確保系統已安裝 Python 3.8 或以上版本。
2. 安裝 UIAutoDev 
在終端機中執行以下命令:
3. 啟動 UIAutoDev 
安裝完成後,執行以下命令啟動工具:
啟動後,瀏覽器將自動打開 UIAutoDev 的網頁介面。
4. 連接裝置 
Android :啟用開發者選項並允許 USB 偵錯,使用 USB 或 Wi-Fi 連接裝置。 
iOS :啟動 WebDriverAgent(WDA)服務,並確保裝置與電腦在同一網路下。 
 
5. 使用工具進行 UI 元素定位 
在網頁介面中選擇已連接的裝置。 
點擊「刷新」按鈕,同步裝置當前畫面。 
使用滑鼠點選畫面中的控件,查看其屬性資訊,並在右側控件樹中進行導航。 
利用自動生成的 XPath 選擇器,快速編寫自動化腳本。 
 
🧪 實際應用範例 
可以先看DEMO 
以下是一段使用 uiautomator2 與 UIAutoDev 結合的 Python 腳本範例:
import uiautomator2 as u2
# 連接到裝置
d = u2.connect()
# 啟動應用程式
d.app_start("com.example.app")
# 點擊指定的控件
d(resourceId="com.example.app:id/button").click()
# 輸入文字
d(resourceId="com.example.app:id/input").set_text("測試輸入")
# 關閉應用程式
d.app_stop("com.example.app")
  
透過 UIAutoDev 提供的控件屬性資訊,您可以輕鬆取得 resource-id 等屬性,快速編寫上述腳本。
參考資料 
https://testerhome.com/topics/40069 
 
				
					 
			
					
											
								 							 
					
															
					
					 by Rain Chu   | 3 月 27, 2025  | Python , 程式 
當你在開發 Python 時,將程式轉換為可執行檔案(如 .exe)並提升執行效率是許多開發者關心的議題,Nuitka  是一款大家都推薦的 Python 編譯器,能夠將 Python 原始碼編譯為 C 語言,進而生成高效的可執行檔案,今天來介紹 Nuitka 的安裝、封裝流程、靜態檔案,與相依套件的處理,以及常見問題與性能優化建議,讓即使是初學者也能輕鬆上手。
 
1. 安裝與執行封裝 
安裝 Nuitka 
安裝 C++ 編譯器 :Nuitka 需要 C++ 編譯器來編譯生成的 C 程式碼。在 Windows 系統上,推薦安裝 MinGW64。 
安裝 Nuitka :使用 pip 安裝 Nuitka: 
 
執行封裝 
假設您的主程式為 main.py,可以使用以下命令將其封裝為可執行檔案:
nuitka --standalone --mingw64 --enable-plugins=tk-inter --disable-console --remove-output --onefile --output-dir=output main.py  
上述命令的參數說明:
--standalone:生成獨立的可執行檔案,包含所有相依套件。 
--mingw64:使用 MinGW64 作為編譯器。 
--enable-plugins=tk-inter:啟用 tkinter 插件,根據實際使用的套件啟用相應插件。 
--disable-console:隱藏執行時的控制台視窗,適用於 GUI 應用程式。 
--remove-output:在編譯完成後移除中間產物。 
--output-dir=output:指定輸出目錄為 output。 
–onefile:如果希望輸出為單一 .exe 檔案 
 
如果是要用 Visual Studio C++ 來封裝的話可以改用
nuitka --standalone --msvc=latest --enable-plugins=tk-inter --disable-console --remove-output --output-dir=output main.py  
2.靜態檔案的處理 
在某些應用中,可能需要包含額外的靜態檔案(如圖片、配置檔案)。Nuitka 提供了 --include-data-dir 參數來處理這些檔案:
此命令將當前目錄下的 static 資料夾包含到生成的可執行檔案中,並在執行時可正常訪問。
3.相依套件的處理 
Nuitka 會自動檢測並包含大多數的相依套件。然而,對於某些特殊的套件,可能需要手動啟用相應的插件。例如,若您的程式使用了 PySide6,則需要在編譯時啟用該插件:
您可以使用 nuitka --plugin-list 命令查看所有可用的插件列表。
4.常見問題的處理 
Nuitka 在首次編譯大型專案時可能需要較長時間。為了加快編譯速度,可以安裝 ccache 來進行編譯快取。
由於 Nuitka 會將所有相依套件包含在內,生成的可執行檔案可能較大。可以嘗試使用 --onefile 參數將所有內容打包成單一檔案,或使用壓縮工具對生成的檔案進行壓縮。
5.關於速度的優化 
Nuitka 通過將 Python 程式編譯為 C 語言,通常能提升程式的執行效率。然而,實際的性能提升取決於程式的結構和內容。為了獲得最佳性能,建議:
優化原始碼 :確保程式碼中沒有不必要的計算和冗餘。 
使用內建函數 :盡可能使用 Python 的內建函數,因為它們通常經過高度優化。 
避免過度使用動態特性 :如 eval、exec 等,這些可能影響編譯器的優化能力。 
 
6.🌟使用 Nuitka GUI 友善介面 
因為既指令很麻煩,推薦使用 Nuitka GUI,這是一款直覺且操作簡單的圖形介面工具。
Nuitka 官方 GUI 安裝: 
開啟 Nuitka GUI: 
或是用開源的 GUI 
https://github.com/271374667/NuitkaGUI 
 
參考資料 
https://nuitka.net 
 
 
 
				
					 
			
					
				
															
					
					 by Rain Chu   | 11 月 6, 2024  | Python , 程式 
可以在 windows, mac, Linux 上使用,自動地透過滑鼠鍵盤來控制你的電腦畫面,還支援螢幕截圖
簡易使用方法 
安裝 pyautogui
使用 pyautogui
螢幕截圖
pyautogui.screenshot('screenshot.png')  
滑鼠控制
pyautogui.moveTo(100, 100, duration = 1.5) #用1.5秒移動到x=100,y=100的位置
pyautogui.dragTo(100, 100, duration=2, button='right') #用2秒按住滑鼠右鍵到x=100,y=100的位置
pyautogui.click(clicks=2, interval=0.5, button='right') #雙擊左鍵並且中途間隔0.5秒  
鍵盤控制
pyautogui.keyDown('ctrl')
pyautogui.press('a')
pyautogui.keyUp('ctrl') #全選的功能鍵效果
pyautogui.hotkey('ctrl', 'shift', 'esc') #開啟工作管理員的快捷鍵  
資源 
PyAutoGUI 說明文件 
PyAutoGUI 原始碼 
中文說明檔 
相關資源 
 
 
 
				
					 
			
					
											
								 							 
					
															
					
					 by rainchu   | 10 月 2, 2024  | Python , 程式 
啟用 Excel 中的 Python  
在輸入框中,輸入 =py 然後按下 TAB ,就會進入下圖,儲存格前面變成有綠色框的PY,這時就可以輸入 Python 程式碼了
 
繪製企鵝圖的公式 
# 台積電股價的小提琴圖
stock2303 = xl("A1:G218", headers=True)
sns.set_theme (font='SimHei', font_scale=0.8)
plt.figure(dpi=300)
plt.ylabel('量', rotation = 0, labelpad=15)
sns.violinplot(x="成交價", y="分量(張)", data = stock2303)  
參考資料 
資料探索與視覺化的優秀入門數據集,https://github.com/allisonhorst/palmerpenguins 
各種 python 圖表的程式碼範例,https://seaborn.pydata.org/examples/index.html 
				
					 
			
					
				
															
					
					 by rainchu   | 8 月 7, 2024  | Python 
現在AI的時代,實在是離不開python,有時候想要快速的驗證程式設計,並且對外服務,給外部的人測試,這時候可以考慮把在 CLI 執行的 python code ,改成 web api,讓外部的人測試看看,改法如下
步驟 1: 安裝 Flask 
步驟 2 : 建立一個 Web APP 
可以建立一個名為 webapi.py 的檔案,並且輸入以下程式碼,這樣就可以簡單地把 GraphRAG 的服務對外
from flask import Flask, request, jsonify
import subprocess
import shlex
app = Flask(__name__)
@app.route('/query', methods=['POST'])
def query():
    # 获取请求中的问题
    data = request.json
    question = data.get('question')
    
    if not question:
        return jsonify({'error': 'No question provided'}), 400
    
    # 构建 CLI 命令
    command = f"python -m graphrag.query --root ./ragtest --method local \"{question}\""
    # 安全地处理命令
    args = shlex.split(command)
    
    # 执行命令
    try:
        result = subprocess.run(args, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        response = result.stdout
        # 假设输出中包含 "SUCCESS:" 和我们需要的答案
        if "SUCCESS:" in response:
            answer = response.split("SUCCESS:")[1].strip()  # 取得成功后的文本作为答案
            return jsonify({'answer': answer})
        else:
            return jsonify({'error': 'Failed to get a valid response from the CLI tool'}), 500
    except subprocess.CalledProcessError as e:
        return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
    app.run(debug=True, port=5000)
  
步驟 3 : 開啟服務 
步驟 4 : 使用 API 
curl -X POST http://localhost:5000/query -H "Content-Type: application/json" -d "{\"question\": \"新修正之勞工特別休假日數有多少?\"}"  
延伸閱讀 
 
				
					 
						
近期留言