“在這個(gè)AI新時(shí)代,我有時(shí)覺(jué)得自己不像是項(xiàng)目的主人。”作者略帶自嘲地說(shuō)。但這次他決定換個(gè)姿勢(shì):讓AI來(lái)幫忙出主意,自己只管動(dòng)手。于是,當(dāng)一個(gè)從QA轉(zhuǎn)型做自動(dòng)化規(guī)劃的人問(wèn)Claude怎樣保持技術(shù)手感時(shí),AI甩過(guò)來(lái)一個(gè)點(diǎn)子——給Playwright測(cè)試寫(xiě)個(gè)自修復(fù)包裝器。一看,靠譜,搞起。
問(wèn)題的根兒其實(shí)特別簡(jiǎn)單:項(xiàng)目還在開(kāi)發(fā)、界面天天變,那些端到端測(cè)試?yán)镉玫降倪x擇器(locator)稍微一改,用例就稀里嘩啦地掛掉。常見(jiàn)操作是手動(dòng)追著改,次數(shù)多了,誰(shuí)也煩。自修復(fù)的想法就冒出來(lái)了:當(dāng)原始選擇器找不到元素時(shí),別直接報(bào)錯(cuò),讓一套內(nèi)置的“治愈引擎”順著優(yōu)先級(jí),把七種替代策略挨個(gè)試一遍,直到找到一個(gè)能用的。
![]()
這套策略的排布不是拍腦袋想的,而是按“從最靠譜到最不靠譜”依次排列:最優(yōu)先的是語(yǔ)義化、改動(dòng)最少的 data-testid 模糊匹配;接著是 aria-label、placeholder、alt 文本、role+name 組合;然后是可見(jiàn)文本內(nèi)容;最后一招才是相對(duì)屏幕位置——因?yàn)榻缑娌季稚晕?dòng)一下就可能失靈。每一步嘗試,無(wú)論成沒(méi)成,都會(huì)記到 HealingLog 里,最后生成一份整個(gè)測(cè)試套件的修復(fù)率報(bào)告。
項(xiàng)目的代碼骨架長(zhǎng)這樣:core目錄下躺著 SelfHealingPage 主包裝器、HealingEngine 策略調(diào)度器、HealingLog 日志記錄器和集成的工廠函數(shù);strategies 目錄里七個(gè)策略文件各管一塊;types 定義類(lèi)型;tests 里除了示例測(cè)試,還有專(zhuān)門(mén)驗(yàn)證框架自身的 healing.spec.ts;運(yùn)行時(shí)生成的修復(fù)日志直接丟進(jìn) reports 文件夾。一眼看過(guò)去,就是個(gè)干凈利落的 TypeScript 工程。
最核心的 SelfHealingPage 類(lèi)的修復(fù)邏輯很直白:先拿原始選擇器去等元素,超時(shí)設(shè)為3秒,找到了就直接返回;如果 catch 到異常,就打印警告,然后把原始選擇器連帶一些輔助 hint 湊成一個(gè)上下文,丟給 HealingEngine 去翻它的策略列表。后面的事——也就是引擎怎么依次調(diào)用那些策略、返回新定位器并記錄日志——就留給 Part 2 了。不過(guò)到這已經(jīng)能聞到那股“測(cè)試掛了,自己修”的意思了。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.