Claude Code + GitHub Actions自動修改Issue

Claude Code + GitHub Actions的功能

  • 立即產生 PR、補 bug 或實作功能:只要在 issue 或 PR 留言 @claude implement ...,Claude 就會自動完成工作,並提交 PR 。
  • 自動代碼審查:PR 中問一句 @claude review code level,由 AI 幫忙分析與修正錯誤。
  • 符合既有專案標準:Claude 會自動參考專案裡的 CLAUDE.md 內容,比照程式風格與工程規範
  • 簡易設定,立刻上手:可以透過 CLI /install-github-app 快速部署,也可手動安裝 workflow。

    GitHub Actions安裝步驟

    claude
    /install-github-app
    

    接著輸入要連接的repository,這邊我選擇我的開源專案:

    https://github.com/cochiachang/walkassure

    接著在Github設定Claude的API Key

    如何使用

    在專案內增加.github/workflows/claude.yml

    請參考https://github.com/cochiachang/walkassure/tree/main/.github/workflows

    name: Claude AI Workflow
    
    on:
      issues:
        types: [opened, edited, labeled]
      issue_comment:
        types: [created]
    
    jobs:
      claude-analysis:
          runs-on: ubuntu-latest
          if: contains(github.event.issue.body, '@claude') || contains(github.event.comment.body, '@claude')
    
          steps:
            - name: Checkout code
              uses: actions/checkout@v4
    
            - name: Claude AI 回應
              uses: anthropics/claude-code-action@beta
              with:
                anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
    
            - name: Claude AI 呼叫成功通知
              if: always()
              run: echo "✅ Claude 回應觸發成功!"
      notify:
        runs-on: ubuntu-latest
        needs: [claude-analysis]
        if: always()
        
        steps:
        - name: Send notification
          run: |
            echo "Workflow completed"
            echo "Claude analysis status: ${{ needs.claude-analysis.result }}"
            echo "Build and test status: ${{ needs.build-and-test.result }}"
    

    範例的issue

    https://github.com/cochiachang/walkassure/issues/1

    接著就可以看到claude已經回應了一個修正

    Claude Code 的記憶機制

    記憶檔案的種類與設計理念

    Claude Code 支援三種級別的記憶檔案:

    記憶檔案位置用途
    專案記憶./CLAUDE.md全團隊共享,記錄架構、標準、常用工作流程
    使用者記憶~/.claude/CLAUDE.md個人偏好與搜尋條件(如 code style、工具快捷指令)
    專案本地記憶(即將淘汰)./CLAUDE.local.md不推到遠端的個人專案設定

    撰寫優質記憶內容

    打造有用記憶內容的重點是結構化、具體、長久適用

    • 專案架構與圖表:在 ./CLAUDE.md 中簡述專案目標、邏輯分層、資料流程與常用第三方服務。
    • 開發規範:team 常用的測試、commit message 格式、branch 流程也能記錄進去。
    • 典型指令集:例如 @scripts/test.sh@README 提醒可快速引用。
    • 個人偏好:例如你喜歡 using tabs 還是 spaces、有沒有自動補 commit message 的習慣,都可放在 ~/.claude/CLAUDE.md

    這樣的記憶會幫助 Claude 在解釋、編碼和 refactor 中,更貼合你團隊與個人的風格。

    在Claude.md中匯入其他檔案

    CLAUDE.md 檔案可以使用 @path/to/import 語法匯入其他檔案。下列範例匯入 3 個檔案:

    See @README for project overview and @package.json for available npm commands for this project.
    
    # Additional Instructions
    - git workflow @docs/git-instructions.md
    

    允許相對和絕對路徑,匯入的檔案可以遞迴匯入其他檔案,最大深度為 5。您可以通過運行 /memory 命令查看加載了哪些內存文件。

    # Individual Preferences
    - @~/.claude/my-project-instructions.md
    

    **Tek 陣列式命名(如 # 命令清單)讓記憶更易讀、維護性高。

    以下為一個簡單範例

    Tek 陣列式命名(如 # 命令清單)讓記憶更易讀、維護性高。

    CLAUDE.md

    # 專案指南
    
    ## 專案概述
    
    這是一個使用 `create-next-app` 建立的 **Next.js 15** 應用程式,採用現代的 React 19、TypeScript、Tailwind CSS 和 App Router 架構。
    
    ## 架構與結構
    
    ### 目錄結構
    ```
    claudecode/
    └── my-next-app/          # 主要 Next.js 應用程式
        ├── src/
        │   └── app/          # App Router 目錄 (Next.js 13+ 模式)
        │       ├── globals.css
        │       ├── layout.tsx    # 根佈局組件
        │       ├── page.tsx      # 首頁組件
        │       └── favicon.ico
        ├── public/           # 靜態資源 (SVG 圖標)
        ├── package.json      # 依賴項和腳本
        ├── next.config.ts    # Next.js 配置
        ├── tailwind.config.ts # Tailwind CSS 配置
        ├── tsconfig.json     # TypeScript 配置
        ├── eslint.config.mjs # ESLint 配置
        ├── postcss.config.mjs # PostCSS 配置
        └── .gitignore
    ```
    
    ## 技術堆棧
    
    ### 核心技術
    - **Next.js 15.4.3** - 帶有 App Router 的 React 框架
    - **React 19.1.0** - 最新版 React 與改進功能
    - **TypeScript 5.8.3** - 類型安全和現代 JavaScript 功能
    - **Tailwind CSS 4.1.11** - 實用優先的 CSS 框架
    - **ESLint** - 帶有 Next.js 和 TypeScript 規則的代碼檢查
    
    ### 主要特性
    - **App Router** - 使用 Next.js 13+ App Router 模式 (`src/app/` 目錄)
    - **字體優化** - Geist 字體 (Sans & Mono) 與 next/font
    - **深色主題支援** - 使用 CSS 變數和 prefers-color-scheme
    - **TypeScript 路徑** - 配置 `@/*` 別名指向 `src/*`
    - **Turbopack** - 開發環境啟用 (`--turbopack` 標誌)
    
    ## 開發工作流程
    
    ### 可用腳本
    ```bash
    npm run dev    # 使用 Turbopack 啟動開發伺服器
    npm run build  # 生產環境建置
    npm run start  # 啟動生產伺服器
    npm run lint   # 運行 ESLint
    ```
    
    ### 開發伺服器
    - 預設端口: `http://localhost:3000`
    - 使用 Turbopack 實現熱重載,加快開發速度
    - 主要入口點: `src/app/page.tsx`
    
    ## 配置詳情
    
    ### TypeScript 配置
    - 目標: ES2017
    - 啟用嚴格模式
    - 路徑映射: `@/*` → `./src/*`
    - 包含 Next.js 外掛
    
    ### Tailwind 配置
    - 實用優先的 CSS 框架
    - 自定義顏色變數 (background, foreground)
    - 為所有相關文件類型配置內容路徑
    - 透過 CSS 變數支援深色主題
    
    ### ESLint 配置
    - Next.js 核心 web vitals 規則
    - TypeScript 支援
    - 扁平配置格式 (ESLint 9+)
    
    ## 樣式方法
    
    ### CSS 架構
    - **全域樣式**: `src/app/globals.css`
    - **Tailwind**: 帶有自定義 CSS 變數的實用優先方法
    - **深色主題**: 透過 `prefers-color-scheme` 自動檢測
    - **字體**: Geist Sans 和 Geist Mono 與 CSS 變數
    
    ### 顏色系統
    ```css
    :root {
      --background: #ffffff;  /* 亮色主題 */
      --foreground: #171717;
    }
    
    @media (prefers-color-scheme: dark) {
      :root {
        --background: #0a0a0a;  /* 深色主題 */
        --foreground: #ededed;
      }
    }
    ```
    
    ## 主要開發模式
    
    ### 組件結構
    - **函數組件** 與 TypeScript
    - **伺服器組件** 預設 (App Router)
    - **CSS-in-JS**: 帶有條件樣式的 Tailwind 類別
    - **圖片優化**: 使用 `next/image` 組件
    
    ### 文件命名慣例
    - 組件: `PascalCase.tsx`
    - 頁面: `page.tsx` (App Router 慣例)
    - 佈局: `layout.tsx` (App Router 慣例)
    - 樣式: `kebab-case.css`
    
    ## Claude Code 最佳實踐
    
    ### 在此專案上工作時:
    
    1. **遵循 App Router 模式**
       - 使用 `src/app/` 目錄結構
       - 遵循 Next.js 13+ 慣例
       - 為路由建立 `page.tsx`,為佈局建立 `layout.tsx`
    
    2. **TypeScript 優先**
       - 新文件始終使用 TypeScript
       - 利用配置的路徑別名 (`@/`)
       - 維護嚴格的類型檢查
    
    3. **樣式指南**
       - 主要使用 Tailwind 實用程式
       - 尊重主題的 CSS 變數系統
       - 維護深色主題相容性
    
    4. **效能考慮**
       - 使用 `next/image` 處理圖片
       - 盡可能利用伺服器組件
       - 遵循 Next.js 優化模式
    
    5. **開發命令**
       - 使用 `npm run dev` 進行開發 (包含 Turbopack)
       - 提交前運行 `npm run lint`
       - 使用 `npm run build` 測試生產建置
    
    6. **Git 提交流程**
       - 每次執行 `git commit` 後,必須執行 `ntfy publish claire-topic "git commit: {commit message}"`
       - AI 應動態使用該次 commit 的實際訊息內容,而非固定文字 {commit message}
       - 這將發送提交通知到指定的 ntfy 主題
    
    ## 常見任務
    
    ### 新增頁面
    在適當的 `src/app/` 子目錄中建立 `page.tsx` 文件,遵循 App Router 慣例。
    
    ### 新增組件
    將可重用組件放在 `src/components/` (需要時建立此目錄) 並使用 `@/` 路徑別名。
    
    ### 樣式更新
    修改 `src/app/globals.css` 以更改全域樣式,或在組件中使用 Tailwind 實用程式。
    
    ### 配置更改
    - Next.js: `next.config.ts`
    - TypeScript: `tsconfig.json`
    - Tailwind: `tailwind.config.ts`
    - ESLint: `eslint.config.mjs`
    
    ## 注意事項
    
    - 這是一個最小自定義的全新 Next.js 專案
    - 使用最新的 React 19 和 Next.js 15 功能
    - 配置用於 TypeScript 和 Tailwind 的現代開發
    - 準備部署到 Vercel 或其他平台
    - 目前不存在額外的文檔或規則文件
    
    ## 部署
    
    此專案配置為可在 Vercel 上輕鬆部署,但也可以部署到任何支援 Next.js 應用程式的平台。
    

    紀錄Claude Code曾經下過的指令

    認識Claude Code Hooks

    https://docs.anthropic.com/en/docs/claude-code/hooks-guide

    https://docs.anthropic.com/en/docs/claude-code/hooks

    Claude Code Hooks 是什麼?

    Hooks 是你在 Claude Code 不同階段,可以自訂執行的 shell 命令或腳本,會在特定事件觸發時自動執行。它可以讓你建立穩定而非隨機的行為,不必透過提示讓 Claude 記得執行特定動作,適合作業自動化、格式化、權限控管等用途

    支援的觸發事件

    Claude Code 提供以下幾種 hook 事件:

    • PreToolUse:在 Claude 使用工具前觸發,可控制是否要阻擋或允許
    • PostToolUse:工具使用後觸發,適合執行後續處理
    • Notification:Claude 發出通知(如等待回應)時觸發
    • UserPromptSubmit:使用者送出 prompt 時觸發
    • Stop:主要互動結束時觸發(非中斷行為)
    • SubagentStop:子任務完成後觸發

    如何設定

    在專案資料夾底下的 .claude/settings.toml.claude/settings.json 加上 hook 配置。例如:

    {
      "hooks": {
        "PostToolUse": [
          {
            "matcher": "Bash",
            "hooks": [
              {
                "type": "command",
                "command": "jq -r '\"\\(.tool_input.command) - \\(.tool_input.description // \"No description\")\"' >> ./.claude/bash-command-log.txt"
              }
            ]
          }
        ]
      }
    }
    

    安裝jq

    以下是常見的 jq 安裝指令,也可以直接請Claude Code幫忙安裝jq:

    Windows:

    # 使用 Scoop
    scoop install jq
    
    # 使用 Chocolatey
    choco install jq
    
    # 使用 winget
    winget install jqlang.jq
    

    macOS:

    # 使用 Homebrew
    brew install jq
    
    # 使用 MacPorts
    sudo port install jq
    

    Linux (Ubuntu/Debian):

    sudo apt update
    sudo apt install jq
    
    Linux (CentOS/RHEL):
    sudo yum install jq
    # 或
    sudo dnf install jq
    
    Linux (Arch):
    sudo pacman -S jq
    

    使用結果

    這樣就可以有一個文字檔紀錄過去Claude Code曾做過的事情囉

    讓Claude Code在Commit時傳送手機通知

    nify介紹

    ntfy(讀作 notify)是一個開源又輕巧的即時推播通知服務。透過 HTTP PUT/POST,你可以輕鬆從腳本、命令列或應用程式發送通知到手機或桌面

    發送通知:

    ntfy publish claire-topic "任務完成!"
    

    或用Curl

    curl -d "備份成功!" ntfy.sh/claire-topic
    

    nify安裝

    手機安裝這個

    https://apps.apple.com/tw/app/ntfy/id1625396347

    然後電腦安裝這個,有各種作業系統的版本,把解壓縮的路徑加入環境變數的PATH

    https://github.com/binwiederhier/ntfy/releases

    使用範例: 當執行Git Commit時傳送手機通知

    可以利用nify,設定Claude Code在修完bug並提交修改之後傳送手機通知

    我們可以在CLAUDE.md設定

    **Git 提交流程**
       - 每次執行 `git commit` 後,必須執行 `ntfy publish claire-topic "git commit: {commit message}"`
       - AI 應動態使用該次 commit 的實際訊息內容,而非固定文字 {commit message}
       - 這將發送提交通知到指定的 ntfy 主題
    

    就會在手機收到Claude完成他的工作的訊息通知囉!

    Claude Code介紹和使用建議

    Claude Code是由 Anthropic 推出的生成式 AI 程式助理,不僅能幫你寫程式、查文件、修 bug,甚至還能幫你整理 Git 記錄、整合團隊工具,是開發者最佳拍檔。

    Cloud Code 可以做什麼

    分析 Git 歷史

    • 自動分析 commit 記錄,幫你查出參數是誰加的、為什麼改、相關背景脈絡。
    • 無需額外提示,它會自己「幫你總結」。

    整合 GitHub Issue

    • Claude 可以自動拉取 GitHub Issue 資訊,並讀出脈絡,協助你釐清問題或任務內容。

    參與 Weekly Standup

    • 你可以問它:「我這週交付了什麼?」
    • Claude 會自動從你的 Git 日誌中整理出成果摘要。

    有效使用流程:從 Q&A 到整合工具

    • 新手建議先從 Codebase Q&A 開始:比起直接改程式碼,先問問題(像「這個變數在哪裡定義?」)更容易上手,快速熟悉程式邏輯與架構。
    • 逐步導入工具:等你熟悉後,就可以進一步請 Claude 幫你「編輯程式碼」,並使用其內建工具,例如 bash、測試指令等。
    • 不必一個個指定工具:只要下目標,Claude 會自己判斷該用哪些工具,幫你串成完整流程。
    • 寫功能前先規劃設計:Claude 最強的能力在於「思考」,你可以先請它幫你規劃實作策略,再確認後由它代碼實作。
    • 告訴 Claude 你的 CLI 工具:你只要講「我們團隊有一個叫 build-image 的自定義指令」,它之後就能幫你正確下命令。
    • 一次設定全部工具(建議):在進入一個新專案時,建議一次告訴 Claude 這個專案會用到哪些工具,這樣它在處理任務時會更有效率。

    安裝Claude Code

    請先確認你的系統符合以下條件:

    步驟 1:安裝 Claude Code CLI

    開啟 Terminal(Mac/Linux)或 WSL 的 Ubuntu 終端機,執行:

    npm install -g @anthropic-ai/claude-code
    

    安裝完成後,輸入以下指令確認版本:

    claude --version
    

    步驟 2:設定 API 金鑰驗證

    安裝好後,必須連結你的 Anthropic 帳號:

    claude auth login
    

    或是將 API 金鑰寫入環境變數(適合自動化流程):

    export ANTHROPIC_API_KEY="你的-api-金鑰"
    

    第一次執行 claude auth login 時,系統會開啟瀏覽器讓你登入並授權。

    步驟 3:開始第一個專案

    1. 建立新的專案資料夾並切換進去: mkdir my-claude-project cd my-claude-project
    2. 啟動 Claude: claude

    善用 CLAUDE.md

    在 Claude Code 的運作中,CLAUDE.md 是建立上下文(context)最核心的元素之一。良好的 CLAUDE.md結構設計,能顯著提升 Claude 的理解力與團隊間的協同效率。

    建議開發者各自維護 .cloud.local.md,記錄自己常用的 workflow、debug 技巧或指令,不簽入 Git,但可被 Claude 使用。

    撰寫原則如下:

    • 保持簡潔明確:寫入常用指令、關鍵檔案與系統架構說明。避免冗長、過度複製 Readme 或歷史資訊,否則會稀釋 Claude 的關注焦點。
    • 依目錄嵌套設計:每個子模組(如 /api, /frontend, /infra)都可以放一份 Cloud.MD,Claude 會在該區域操作時自動讀取該目錄的說明。
    • 保留個人版:建議開發者各自維護 .cloud.local.md,記錄自己常用的 workflow、debug 技巧或指令,不簽入 Git,但可被 Claude 使用。

    高階上下文管理技巧

    組織層級的共享 CLAUDE.md

    • 公司可建立統一的 enterprise.CLAUDE.md(如專案政策、資安規範、CI/CD 標準),並在每個 repo 中引用。
    • 有助於新進工程師快速了解開發規範。

    結合 Slash 指令與情境切換

    • Claude 支援 /commands 格式,例如 /deploy, /check-access,這些可事先存於專案或個人記憶中,讓 prompt 更精準。

    階層式配置架構建議

    ├── CLAUDE.md(全域策略)
    ├── .CLAUDE.local.md(個人筆記)
    ├── frontend/
    │   └── CLAUDE.md(UI 工具說明)
    ├── backend/
    │   └── CLAUDE.md(API 路由與框架設定)
    └── infra/
        └── CLAUDE.md(Terraform、MCP 配置)
    
    

    MCP 與資源共享建議

    • 集中配置一次,團隊共享:MCP 伺服器(如 puppeteer, PostgreSQL 查詢機器人等)可部署在某一個共用專案中,設定好後所有開發者即可使用。

    可用資源範例

    • puppeteer-mcp: 自動產生截圖/ PDF 報告。
    • llm-lint-mcp: 代碼風格與品質審查。
    • qa-mcp: 單元測試結果解析與修復建議。

    建議導入流程

    階段重點行動
    團隊導入初期建立統一的 Cloud.MD 與 MCP server,並教育每位成員撰寫 .CLAUDE.local.md
    日常工作中透過 Claude 自動解析 commit、Issue、CI/CD log,提升團隊溝通效率
    每週協作在 weekly stand-up 前,使用 Claude 整理每人當週交付與貢獻,快速對齊進度
    長期優化定期檢視 Cloud.MD 內容,清理無效資訊、合併重複區段、補充新工具配置

    善用 Cloude.MD 與其延伸機制,就像是幫你的 AI 工程夥伴安裝了「專案經驗記憶體」。不僅可以快速上手大型專案、減少重複溝通,還能真正讓 Claude 成為團隊知識管理與效率最佳化的幫手。

    在VSCode建構NX的套件

    官方教學文件:https://meta.nxvms.com/docs/developers/knowledgebase/234-preparing-a-workspace

    官方範例套件:https://github.com/networkoptix/nx_open_integrations/tree/72d9c30658531d954e0de59e73b431122bcf29cc/cpp/vms_server_plugins/opencv_object_detection_analytics_plugin

    下載所需的NX SDK:https://meta.nxvms.com/download/releases/sdk

    設定安裝環境必備的套件

    CMake(建議版本 3.15 以上):https://cmake.org/download

    C++ 編譯器(MSYS):https://www.msys2.org/

    安裝之後,打開MSYS,接著安裝GCC的套件

    Empty MSYS2 terminal window
    pacman -S mingw-w64-ucrt-x86_64-gcc
    pacman -S mingw-w64-ucrt-x86_64-ninja
    gcc --version
    

    安裝VSCode CMake 插件

    • CMake Tools
    • C/C++ Extension Pack

    設定 CMake Tools

    打開C++的專案資料夾,資料夾根部應要有CMakeLists.txt

    F1 → 搜尋 CMake: Configure → 點下去。

    選擇編譯的環境,這邊我選擇自動搜尋,接著會搜尋到MSYS

    再按 F1CMake: Build 就可以完成組建囉!

    注意:CMake 在某些環境下會因為中文路徑編譯失敗,建議如果遇到奇怪問題,試試把專案搬到一個英文資料底下。

    設定CMake的相關參數

    新增 .vscode/settings.json 這個檔案

    {
      "cmake.generator": "Visual Studio 17 2022",
      "cmake.configureSettings": {
        "metadataSdkDir": "D:/metadata_sdk",
        "SERVER_DIR": "C:/Program Files/Network Optix/Nx MetaVMS/mediaserver"
      },
      "cmake.buildDirectory": "${workspaceFolder}/build",
      "cmake.buildType": "Release",
      "cmake.configureArgs": [
        "-A", "x64"
      ],
      "cmake.installPrefix": "${workspaceFolder}/install"
    }
    
    

    接著就可以看到產生的dll檔案了

    如何用 Playwright 撰寫參數化

    網站在測試時有許多不同的「角色」該如何撰寫測試

    當網站有許多不同的角色(例如管理員、一般使用者、訪客等)時,撰寫測試可以依照各角色的權限與流程,採用一些共用與參數化的技巧,讓測試能夠穩定且重複執行。

    1. 分析與規劃角色需求

    • 定義各角色的權限與流程:先明確每個角色所能執行的功能,列出對應的使用情境。
    • 撰寫需求文件:將各角色的操作流程、期望結果記錄下來,方便後續撰寫測試案例。

    2. 建立共用的流程與元件

    • 共用登入與登出:針對不同角色,撰寫一個共用的登入模組,再根據傳入的角色參數選擇不同的帳號與密碼。
    • 使用 Page Object Model (POM):把不同頁面的操作封裝成物件,依角色狀況調用不同的方法,減少重複程式碼。

    3. 參數化測試

    • 利用測試資料陣列:將各角色的測試資料(例如帳號、密碼、預期結果)存成陣列,再透過迴圈或參數化的方式,讓同一份測試腳本覆蓋多個角色。
    import { test, expect } from '@playwright/test';
    
    const users = [
      { role: 'admin', username: 'adminUser', password: 'adminPass' },
      { role: 'user', username: 'normalUser', password: 'userPass' },
      // 可再加入其他角色
    ];
    
    users.forEach(({ role, username, password }) => {
      test(`測試 ${role} 角色的功能`, async ({ page }) => {
        // 執行共用的登入流程
        await page.goto('https://example.com/login');
        await page.fill('#username', username);
        await page.fill('#password', password);
        await page.click('button[type="submit"]');
    
        // 根據角色執行不同操作與驗證
        if (role === 'admin') {
          // 驗證管理員專屬的功能
          await page.goto('https://example.com/admin');
          await expect(page.locator('text=管理後台')).toBeVisible();
        } else if (role === 'user') {
          // 驗證一般使用者的功能
          await page.goto('https://example.com/dashboard');
          await expect(page.locator('text=使用者儀錶板')).toBeVisible();
        }
        // 登出或清除測試狀態
      });
    });
    
    

    爬蟲行為設定避免卡在某個狀況

    運用 try/catch 來處理找不到指定元素時所產生的 TimeoutError。流程大致如下:

    1. 嘗試執行主要操作
      try 區塊中,先使用 jsCopyawait page.getByText('移除成員').click({ timeout: 1000 }); 這表示 Playwright 會嘗試在 1 秒內尋找並點擊文字為「移除成員」的元素。如果在 1 秒內沒有找到,Playwright 就會拋出 TimeoutError
    2. 捕捉錯誤並執行備案操作
      一旦進入 catch 區塊,就代表在指定時間內沒有找到「移除成員」這個元素。程式碼會檢查錯誤類型:
    try {
      await page.getByText('移除成員').click({ timeout: 1000 });
    } catch (e) {
      if (e.name === 'TimeoutError') {
        await page.getByText('封鎖', { exact: true }).click({ timeout: 1000 });
      }
    }
    
    
    1. 如果確實是 TimeoutError,就改用「封鎖」這個文字作為元素定位並點擊。
    2. 這表示如果「移除成員」按鈕不在網頁上(或是網頁加載的流程不同),就退而求其次去點擊「封鎖」按鈕。
    3. 應用場景
      • 可能是有些帳號沒有「移除成員」的選項,而需要改用「封鎖」。
      • 也可能是前端顯示的按鈕文字在不同情況下會變化,需要有個備案流程。

    PlayWright Codegen

    使用Codegen功能來錄製操作行為

    透過互動錄製,快速產生測試骨架,再自行補充測試斷言與檢查條件。 大幅縮短手動撰寫測試的時間。產生的程式碼可直接套用在爬蟲腳本中,之後只要再針對抓取內容做進一步處理即可。

    輸入指令為

    npx playwright codegen
    

    官方推薦的定位器

    在撰寫 E2E(端對端)測試時,選擇好用、穩定且易維護的元素定位方式相當重要。使用 id 或自訂的 data-* 屬性(例如 data-testiddata-test),讓測試程式更容易精準地選取元素。

    以下是使用自訂屬性的好處:

    1. 避免干擾視覺或結構調整
      • 如果測試依賴 CSS 選擇器(如 .class 或元素階層),一旦前端 UI 樣式或結構稍作修改,就可能導致測試失效。
      • 透過自訂屬性(例如 data-testid="submit"),可以與視覺或佈局的變動解耦,減少測試被破壞的風險。
    2. 可讀性佳
      • data-testid="submit"data-test="login-button" 這種命名能讓測試碼一目了然,也容易與設計稿或需求對照。
    3. 維護成本低
      • 若將來需要更改按鈕文字或新增 CSS 樣式,自訂屬性不會被影響,測試也不需要重新編寫。

    例如使用以下的方式

    使用 id

    • 在一個頁面中,id 屬性必須唯一。若你的頁面或元件很多,必須小心確保不會重複命名。
    • 有時候前端開發者可能保留 id 給特定功能,或是其他框架可能已經使用 id 作為錨點、錨點連結等等。

    使用 data-* 屬性

    • data-testiddata-test 是常見做法,用於標記測試所需的元素。
    • 不會干擾其他既有的前端邏輯或樣式,並且易於辨識、維護。

    網頁

    <!-- example.html -->
    <input type="text" id="username" />
    <input type="submit" data-test-id="submit" value="Sign In" />
    

    測試碼

    // example.spec.js
    await page.fill('#username', 'someUser');
    await page.click('[data-test-id=submit]');
    

    官方推薦的抓取定位點的方式

    • getByRole():Playwright 會依據 ARIA 的角色 (role) 或預設語意標籤 (如 <button><a><input> 等) 來定位。 g
    • etByText():依據元素內的文字內容匹配,適用於一般顯示文字的元素。
    • getByLabel():特別適用於表單控制項,依照 <label> 文字來定位對應的 <input><textarea> 等。
    • getByPlaceholder():根據表單輸入框的 placeholder 屬性值來定位。
    • getByAltText():專門用於根據圖片 (<img>) 的 alt 屬性值來定位。
    • getByTestId():可在 HTML 元素上自訂 data-testid 屬性,方便自動化測試或爬蟲精準定位。

    什麼是getByRole

    在 Playwright 裡面使用 page.getByRole() 來定位元素,是根據網頁對「輔助技術(Assistive Technology)」和使用者所暴露的角色(role)資訊來做搜尋。以下簡單說明其原理與優勢:

    什麼是角色(Role)?

    在網頁中,像是按鈕、標題、連結、清單、表格等,都有對應的 W3C ARIA 角色,或是隱含在原生 HTML 元素裡。

    例如 <button> 通常就對應到 ARIA 的 role="button"<a> 則對應到 role="link"。這些角色不只對螢幕報讀軟體等輔助工具很重要,也能在自動化測試或爬蟲時,成為一個很直覺的定位方式。

    為什麼要用 getByRole()

    • 可讀性佳:用「角色」來描述網頁元素,比起用繁雜的 CSS 選擇器或 XPath,更能清楚表達你想要找的元素「扮演什麼功能」。
    • 穩定度高:角色屬性通常是網頁結構的語意核心,較不會因為版面調整或細微改動就被破壞。
    • 符合無障礙標準:如果網頁設計有遵循 ARIA 標準,getByRole() 能幫助你自動化測試同時也檢查無障礙屬性的正確性。

    使用範例

    針對網頁上所有「按鈕」:

    // 取得第一個按鈕
    const button = await page.getByRole('button');
    

    若按鈕上有文字(名稱),可以用 name 選項來過濾:

    // 取得文字內容為「送出」的按鈕
    const submitButton = await page.getByRole('button', { name: '送出' });
    

    對其他角色也可以類似使用,例如 heading(標題)、link(連結)、list(清單)等。

    隱含與自訂角色

    • 大部分常見的 HTML 元素都自帶角色,比如 <button> 本身就有 role="button"
    • 如果網頁中使用自訂元素(如 <div>)去模擬按鈕,可能需要開發者在 HTML 裡加上 role="button",讓輔助技術與 Playwright 都能正確辨識。
    • 倘若有使用額外的 ARIA 屬性(如 aria-label),也能與 getByRole() 搭配使用。

    範例HTML

    <!DOCTYPE html>
    <html lang="zh-TW">
    <head>
      <meta charset="UTF-8">
      <title>Playwright 定位器範例</title>
    </head>
    <body>
    
      <!-- 1. getByRole():可透過預設語意標籤 (如 button、link) 或 ARIA role 來定位 -->
      <button>送出</button>
      <!-- Playwright 使用範例:page.getByRole('button', { name: '送出' }) -->
    
      <!-- 2. getByText():根據元素的文字內容來定位 -->
      <p>這是一段測試文字</p>
      <!-- Playwright 使用範例:page.getByText('這是一段測試文字') -->
    
      <!-- 3. getByLabel():根據 <label> 文字來定位對應的表單元素 -->
      <label for="username">使用者名稱</label>
      <input id="username" type="text" />
      <!-- Playwright 使用範例:page.getByLabel('使用者名稱') -->
    
      <!-- 4. getByPlaceholder():根據 placeholder 屬性來定位 -->
      <input placeholder="請輸入電子郵件" />
      <!-- Playwright 使用範例:page.getByPlaceholder('請輸入電子郵件') -->
    
      <!-- 5. getByAltText():根據 <img> 的 alt 屬性文字來定位 -->
      <img src="cat.jpg" alt="可愛的小貓" />
      <!-- Playwright 使用範例:page.getByAltText('可愛的小貓') -->
    
      <!-- 6. getByTestId():根據 data-testid 屬性來定位 (可用於自訂屬性) -->
      <div data-testid="custom-element">這是自訂元素</div>
      <!-- Playwright 使用範例:page.getByTestId('custom-element') -->
    
    </body>
    </html>
    
    

    使用 n8n + LineBot 搭建 RAG AI 應用

    功能介紹

    n8n 是一款開源的工作流自動化工具,旨在幫助用戶通過可視化的方式設計和執行自動化流程,實現跨應用和服務的數據整合與操作。是一個功能強大且靈活的工作流自動化平台,適合個人和企業用戶用於提升效率和簡化業務流程。無論是簡單的數據同步,還是複雜的跨平台自動化,n8n 都能提供可靠的解決方案。

    簡單n8n 串接 LINE 教學

    n8n 是一款強大的工作流自動化工具,能夠輕鬆串接 LINE 並實現多種自動化功能,例如發送通知、處理訊息或與其他應用整合。以下是串接 LINE 的詳細教學:

    步驟 1:準備 LINE API 憑證

    在串接 LINE 前,您需要取得 LINE 的 API 憑證。以下是準備步驟:

    1. 註冊 LINE Developers 帳戶:前往 LINE Developers 註冊帳戶。
    2. 建立 Channel
      • 登入後,建立一個新的 Messaging API Channel。
      • 記下 Channel ID、Channel Secret 和 Access Token,這些將用於 n8n 的認證設定。
    3. 設定 Webhook(可選):如果需要接收 LINE 的事件通知,需設定 Webhook URL,該 URL 可由 n8n 提供。

    步驟 2:在 n8n 中新增 LINE 節點

    N8N設定的畫面

    LINE Bot的設定畫面

    步驟 3:在OpenAI建立好的客製化機器人

    網址: https://platform.openai.com/playground/assistants

    以下是了解我的書的內容的機器人,這個是Open AI的Agent功能,可以在這邊上傳檔案,讓這個機器人有RAG的資料庫可以回答專屬於自己的知識

    步驟4:在n8n呼叫已經建立好的機器人

    可以選擇下面這個節點來和已經建立好的機器人聊天

    要注意的是,這個節點輸入的文字要是前一個節點的”chatInput”變數。所以要在前面新增一個Edit Fields的節點,來改變前一個節點的值的結構

    選擇剛剛建立好的機器人

    步驟5:回覆LINE訊息

    因為原本n8n只有notify的元件,而這個元件即將要廢棄

    因此我自己參考這邊的API格式來呼叫send line message

    https://developers.line.biz/en/docs/messaging-api/sending-messages/#reply-messages

    curl -v -X POST https://api.line.me/v2/bot/message/reply \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer {channel access token}' \
    -d '{
        "replyToken":"nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
        "messages":[
            {
                "type":"text",
                "text":"Hello, user"
            },
            {
                "type":"text",
                "text":"May I help you?"
            }
        ]
    }'
    

    這邊因為要避免OPENAI回傳一些會打亂JSON格式的特殊字元,因此要用JSON.stringify(…)把回傳的字串包起來

    {
        "replyToken":"{{ $('If').item.json.body.events[0].replyToken }}",
        "messages":[{"type":"text","text":{{ JSON.stringify($json.output) }}}]
    }
    

    完整的工作流