2025-10-11

使用 Playwright MCP 實(shí)現(xiàn) UI 自動化測試

在傳統(tǒng)的 UI 自動化測試中,測試人員需要編寫大量腳本和選擇器來模擬用戶操作。然而,隨著人工智能技術(shù)的快速發(fā)展,對話式自動化正在改變這一格局。Playwright 作為微軟開源的現(xiàn)代化 Web 自動化工具,與 MCP(Model Context Protocol)協(xié)議的結(jié)合,為我們提供了一種全新的自動化測試體驗。

這種組合允許我們通過自然語言指令來控制瀏覽器,大大降低了自動化測試的技術(shù)門檻,同時提高了腳本編寫的效率。本文將全面介紹如何使用 Playwright 和 MCP 協(xié)議來構(gòu)建智能化的 UI 自動化測試解決方案。

一、Playwright 與 MCP 協(xié)議概述

1.1 Playwright 的核心優(yōu)勢

Playwright 是一個強(qiáng)大的端到端測試框架,具有以下突出特點(diǎn):

  • 跨瀏覽器支持:原生支持 Chromium(Chrome/Edge)、Firefox 和 WebKit(Safari)三大瀏覽器引擎
  • 智能等待機(jī)制:自動檢測元素可交互狀態(tài),減少因網(wǎng)絡(luò)延遲導(dǎo)致的測試失敗
  • 多語言支持:提供 JavaScript/TypeScript、Python、.NET 和 Java 等多種語言 API
  • 移動端模擬:內(nèi)置設(shè)備描述符,可真實(shí)模擬移動設(shè)備環(huán)境
  • 錄制功能:通過 playwright codegen 命令可錄制操作并生成腳本

1.2 MCP 協(xié)議的作用

MCP(Model Context Protocol)定義了大型語言模型(LLM)與外部服務(wù)交互的規(guī)范。它的價值在于:

  • 統(tǒng)一交互標(biāo)準(zhǔn):讓 LLM 能夠與瀏覽器、數(shù)據(jù)庫等外部工具無縫對話
  • 動態(tài)流程控制:根據(jù)實(shí)時反饋調(diào)整指令,使自動化流程更加靈活
  • 安全機(jī)制:權(quán)限分層設(shè)計,防止越權(quán)操作敏感資源

1.3 結(jié)合后的協(xié)同效應(yīng)

當(dāng) Playwright 與 MCP 結(jié)合時,創(chuàng)建了對話式自動化的新范式:

  • 自然語言驅(qū)動:用簡單指令替代復(fù)雜腳本編寫
  • 實(shí)時交互調(diào)試:每一步操作都可即時驗證和調(diào)整
  • 降低技術(shù)門檻:非技術(shù)人員也能參與自動化流程創(chuàng)建

二、環(huán)境搭建與配置

2.1 安裝 Playwright

以下是基于 Python 環(huán)境的 Playwright 安裝步驟:

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;"># 檢查 Python 版本(需要 3.8+) python --version # 安裝 Playwright 庫 pip install playwright # 安裝瀏覽器驅(qū)動 playwright install </pre>

對于國內(nèi)用戶,可以通過鏡像加速下載:

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">set PLAYWRIGHT_DOWNLOAD_HOST=https://npmmirror.com/mirrors/playwright playwright install </pre>

2.2 驗證安裝

創(chuàng)建一個簡單的測試腳本來驗證環(huán)境:

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page() page.goto("https://playwright.dev") print("頁面標(biāo)題:", page.title()) browser.close() </pre>

運(yùn)行成功后,將看到瀏覽器自動打開并顯示 Playwright 官網(wǎng),控制臺輸出正確標(biāo)題。

2.3 MCP 服務(wù)器部署

根據(jù)需求選擇合適的 MCP Playwright 服務(wù)器。以下是幾種常見方案:

方案一:使用官方 MCP 服務(wù)器

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;"># 使用 NPX 直接運(yùn)行 npx @playwright/mcp@latest # 或全局安裝后啟動 npm install -g @playwright/mcp npx @playwright/mcp@latest </pre>

方案二:使用社區(qū)增強(qiáng)版服務(wù)器

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;"># 克隆倉庫 git clone https://github.com/your-username/mcp-playwright.git cd mcp-playwright # 使用 uv 安裝依賴(推薦) uv sync # 或使用 pip pip install -e . # 安裝 Playwright 瀏覽器 uv run playwright install </pre>

方案三:專用功能服務(wù)器

對于特定需求(如僅需網(wǎng)頁內(nèi)容抓?。墒褂脤S梅?wù)器:

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">npm install @kevinwatt/playwright-fetch-mcp </pre>

2.4 客戶端配置

以 VSCode 為例,配置 MCP 服務(wù)器連接:

在 VSCode 設(shè)置(settings.json)中加入:

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">{ "mcpServers": { "playwright": { "command": "npx", "args": ["@playwright/mcp@latest"], "timeout": 300 } } } </pre>

對于 Claude Desktop 用戶,配置方式類似:

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">{ "mcpServers": { "playwright-fetch": { "command": "npx", "args": ["-y", "@kevinwatt/playwright-fetch-mcp"], "enabled": true } } } </pre>

三、MCP Server 的核心功能與工具集

不同的 MCP Playwright 服務(wù)器提供各具特色的功能集。以下是常見工具的分類介紹:

3.1 瀏覽器控制工具

  • create_browser_session:創(chuàng)建新的瀏覽器會話,可指定瀏覽器類型、視口大小等參數(shù)
  • close_browser_session:關(guān)閉當(dāng)前瀏覽器會話,釋放資源
  • navigate_to_url:導(dǎo)航到指定 URL

3.2 頁面交互工具

  • click_element:點(diǎn)擊頁面元素,支持多種定位策略
  • fill_input:在輸入框中填寫文本
  • wait_for_selector:等待元素出現(xiàn)或達(dá)到特定狀態(tài)
  • double_click_element:雙擊元素
  • select_option:選擇下拉選項

3.3 數(shù)據(jù)提取工具

  • get_text_content:獲取元素文本內(nèi)容
  • get_element_attribute:獲取元素屬性值
  • get_page_title:獲取頁面標(biāo)題
  • get_page_url:獲取當(dāng)前頁面 URL
  • fetch_json:直接獲取 JSON 數(shù)據(jù)(特定服務(wù)器支持)
  • fetch_txt:獲取網(wǎng)頁純文本內(nèi)容
  • fetch_markdown:獲取轉(zhuǎn)換為 Markdown 格式的網(wǎng)頁內(nèi)容

3.4 高級功能工具

  • take_screenshot:截取頁面截圖,支持全頁截圖
  • execute_javascript:執(zhí)行 JavaScript 代碼并返回結(jié)果
  • generate_test_cases:從需求描述自動生成測試用例

表:主要 MCP Playwright 服務(wù)器功能對比

功能 官方 MCP mcp-playwright playwright-fetch mcp-playwright-test
瀏覽器控制 ? ? ? ?
頁面交互 ? ? ? ?
數(shù)據(jù)提取 基礎(chǔ) 全面 專業(yè)抓取 全面
測試生成 ? ? ? ?
報告生成 ? ? ? ?

四、實(shí)戰(zhàn)案例:完整的 UI 自動化流程

下面通過一個實(shí)際案例演示如何使用 Playwright 與 MCP 完成 UI 自動化測試。

4.1 測試場景描述

假設(shè)我們需要自動化測試一個網(wǎng)站的登錄流程:

  1. 打開網(wǎng)站登錄頁面
  2. 輸入用戶名和密碼
  3. 點(diǎn)擊登錄按鈕
  4. 驗證登錄成功
  5. 執(zhí)行登出操作

4.2 傳統(tǒng) Playwright 腳本實(shí)現(xiàn)

首先,我們看看傳統(tǒng)的實(shí)現(xiàn)方式:

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">from playwright.sync_api import sync_playwright def test_login(): with sync_playwright() as p: # 啟動瀏覽器 browser = p.chromium.launch(headless=False) page = browser.new_page() # 導(dǎo)航到登錄頁面 page.goto("https://example.com/login") # 輸入憑據(jù) page.fill("[#username](javascript:;)", "testuser") page.fill("[#password](javascript:;)", "testpass") # 點(diǎn)擊登錄按鈕 page.click("[#login](javascript:;)-btn") # 等待導(dǎo)航完成并驗證登錄成功 page.wait_for_selector(".dashboard") assert"Dashboard"in page.title() # 執(zhí)行登出 page.click("[#logout](javascript:;)-btn") page.wait_for_selector(".login-form") browser.close() if __name__ == "__main__": test_login() </pre>

4.3 MCP 對話式自動化實(shí)現(xiàn)

通過 MCP 服務(wù)器,我們可以使用自然語言指令完成相同任務(wù):

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">"打開 https://example.com/login,在用戶名字段輸入 testuser,在密碼字段輸入 testpass,點(diǎn)擊登錄按鈕,等待 dashboard 元素出現(xiàn),驗證頁面標(biāo)題包含 Dashboard,最后點(diǎn)擊退出按鈕并確認(rèn)返回登錄頁面" </pre>

MCP 服務(wù)器會將上述指令轉(zhuǎn)換為相應(yīng)的 Playwright API 調(diào)用,執(zhí)行流程如下:

  1. 創(chuàng)建會話create_browser_session(browser_type="chromium", headless=False)
  2. 頁面導(dǎo)航navigate_to_url("https://example.com/login")
  3. 元素操作
  • fill_input(selector="[#username](javascript:;)", text="testuser")
  • fill_input(selector="[#password](javascript:;)", text="testpass")
  • click_element(selector="[#login](javascript:;)-btn")
  1. 等待與驗證
  • wait_for_selector(selector=".dashboard", state="visible")
  • get_page_title() 并驗證包含 "Dashboard"
  1. 退出操作
  • click_element(selector="[#logout](javascript:;)-btn")
  • wait_for_selector(selector=".login-form", state="visible")

4.4 高級功能:自動化測試報告

對于更復(fù)雜的測試需求,可以使用 mcp-playwright-test 等服務(wù)器,它們提供測試報告生成功能:

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;"># 使用專業(yè)測試服務(wù)器生成詳細(xì)報告 { "mcpServers": { "mcp-playwright-test": { "command": "npx", "args": ["-y", "mcp-playwright-test"], "env": { "BROWSER_TYPE": "chromium", "BROWSER_HEADLESS": true, "TEST_STORAGE_DIR": "./test-results" } } } } </pre>

執(zhí)行測試后,系統(tǒng)會生成包含以下內(nèi)容的詳細(xì)報告:

  • 測試用例執(zhí)行結(jié)果(通過/失敗)
  • 錯誤截圖和堆棧跟蹤
  • 網(wǎng)絡(luò)請求日志
  • 性能指標(biāo)數(shù)據(jù)

五、最佳實(shí)踐與優(yōu)化策略

5.1 元素定位策略

可靠的元素定位是自動化測試成功的關(guān)鍵。以下是推薦的定位器使用優(yōu)先級:

  1. 語義化定位器(首選):

    <pre style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;"># 使用角色定位 role=button:登錄 # 使用文本定位 text=提交 </pre>

  2. CSS 選擇器(次選):

    <pre style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">button.submit input[name='username'] </pre>

  3. 復(fù)合定位器(復(fù)雜場景):

    <pre style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;"># 組合條件定位 role=cell:配置項&locator=button&first=true # 文本過濾 div&has_text=重要 </pre>

表:元素定位策略對比

定位策略 示例 優(yōu)點(diǎn) 適用場景
角色定位 role=button:登錄 可讀性強(qiáng),穩(wěn)定性高 有語義化標(biāo)簽的元素
文本定位 text=提交 直觀易懂 有明確文本內(nèi)容的元素
CSS 選擇器 button.submit 靈活高效 樣式穩(wěn)定的元素
復(fù)合定位 div&has_text=重要&first=true 精準(zhǔn)定位 復(fù)雜頁面結(jié)構(gòu)

5.2 等待機(jī)制優(yōu)化

避免使用固定的 sleep 等待,而是利用 Playwright 的智能等待機(jī)制:

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;"># 不推薦:固定等待 import time time.sleep(5) # 推薦:智能等待 await wait_for_selector(selector=".loading", state="hidden") await wait_for_selector(selector=".content", state="visible") </pre>

5.3 錯誤處理與重試機(jī)制

實(shí)現(xiàn)健壯的自動化腳本需要完善的錯誤處理:

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;"># 使用重試機(jī)制提高穩(wěn)定性 { "retry_attempts": 3, "retry_delay": 1000, "fallback_actions": [ {"action": "refresh_page", "when": "element_not_found"}, {"action": "alternative_selector", "when": "click_failed"} ] } </pre>

5.4 配置管理與環(huán)境隔離

使用配置文件管理不同環(huán)境的參數(shù):

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">{ "environments": { "development": { "base_url": "http://localhost:3000", "credentials": "dev_creds" }, "staging": { "base_url": "https://staging.example.com", "credentials": "stage_creds" }, "production": { "base_url": "https://example.com", "credentials": "prod_creds" } } } </pre>

六、常見問題與解決方案

6.1 瀏覽器啟動失敗

問題:執(zhí)行時瀏覽器無法啟動或立即崩潰。

解決方案

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;"># 確保已正確安裝瀏覽器 playwright install # 檢查權(quán)限問題(Linux/Mac) sudo playwright install # 強(qiáng)制重新安裝 playwright install --force </pre>

6.2 元素定位失敗

問題:腳本無法找到指定元素,導(dǎo)致測試中斷。

解決方案

  1. 使用錄制功能生成可靠選擇器:

    <pre style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">playwright codegen https://example.com </pre>

  2. 啟用追蹤功能調(diào)試定位問題:

    <pre style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">context.tracing.start(screenshots=True, snapshots=True) # 執(zhí)行操作... context.tracing.stop(path="trace.zip") </pre>

6.3 異步操作處理

問題:動態(tài)加載內(nèi)容導(dǎo)致操作提前執(zhí)行。

解決方案

<pre data-tool="mdnice編輯器" style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;"># 等待網(wǎng)絡(luò)空閑 page.wait_for_load_state("networkidle") # 等待特定元素出現(xiàn) await wait_for_selector(selector=".dynamic-content", state="attached") # 設(shè)置合理超時時間 create_browser_session(default_timeout=30000) </pre>

6.4 MCP 連接問題

問題:MCP 服務(wù)器無法啟動或連接超時。

解決方案

  1. 檢查命令路徑是否正確

  2. 增加超時時間設(shè)置:

    <pre style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">{ "timeout": 500, "env": { "NODE_OPTIONS": "--max-old-space-size=4096" } } </pre>

  3. 查看日志診斷問題:

    <pre style="-webkit-tap-highlight-color: transparent; margin: 10px 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">npx @playwright/mcp@latest --verbose </pre>

七、未來展望與應(yīng)用擴(kuò)展

Playwright 與 MCP 的結(jié)合為 UI 自動化測試帶來了革命性的變化,未來有幾個值得關(guān)注的發(fā)展方向:

7.1 智能化測試生成

利用 AI 能力自動生成測試用例和腳本:

  • 需求描述轉(zhuǎn)測試:將自然語言需求自動轉(zhuǎn)換為可執(zhí)行的測試用例
  • 智能修復(fù):自動檢測并修復(fù)失敗的測試腳本
  • 異常預(yù)測:基于歷史數(shù)據(jù)預(yù)測可能出現(xiàn)的異常情況

7.2 跨平臺擴(kuò)展

將自動化能力擴(kuò)展到更多平臺:

  • 移動端自動化:真機(jī)移動設(shè)備測試自動化
  • 桌面應(yīng)用:Electron、Flutter 等桌面應(yīng)用測試
  • API 測試集成:UI 與 API 測試的無縫結(jié)合

7.3 協(xié)作與集成增強(qiáng)

提升團(tuán)隊協(xié)作效率的功能:

  • 可視化報告:更直觀的測試結(jié)果展示和分析
  • 團(tuán)隊知識庫:共享測試用例和最佳實(shí)踐
  • CI/CD 深度集成:與 GitHub Actions、Jenkins 等工具更緊密集成

結(jié)語

Playwright 與 MCP 的結(jié)合標(biāo)志著 UI 自動化測試進(jìn)入了新時代。通過本文的介紹,我們看到了如何利用這一強(qiáng)大組合,以更直觀、高效的方式實(shí)現(xiàn)復(fù)雜的自動化測試任務(wù)。

無論是經(jīng)驗豐富的測試工程師,還是剛?cè)腴T的新手,這種對話式自動化方法都能顯著提升工作效率。隨著技術(shù)的不斷成熟,我們可以期待更多創(chuàng)新功能的出現(xiàn),進(jìn)一步降低自動化測試的門檻,讓團(tuán)隊能夠更專注于創(chuàng)造高質(zhì)量的產(chǎn)品。

現(xiàn)在就開始嘗試使用 Playwright 和 MCP 協(xié)議,體驗下一代 UI 自動化測試的便捷與強(qiáng)大吧!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容