如何在UI自動化測試中創建穩定的定位器?
- 前言
- 1. 避免使用絕對路徑
- 2. 避免在定位器中使用索引
- 3. 避免多個類名的定位器
- 4. 避免動態和自動生成的ID
- 5. 確保定位器唯一
- 6. 處理隱藏元素的策略
- 7. 謹慎使用基于文本的定位器
- 8. 使用AI創建穩定的定位器
- 總結
前言
- 在自動化測試中,創建穩定的定位器至關重要。脆弱的定位器經常導致測試失敗,增加了維護難度,并可能引起不必要的錯誤;
- 為了確保自動化測試的穩定性和可維護性,測試人員需要避免一些常見的陷阱,并根據最佳實踐設計更為可靠的定位器;
- 本文將探索如何通過一些策略,幫助你避免這些問題,并選擇高效、穩定的定位器,從而提升測試的穩定性。
1. 避免使用絕對路徑
在XPath或CSS選擇器中,使用絕對路徑定位元素是很常見的做法,然而,這種方法的穩定性較差。當頁面布局發生變化時,絕對路徑會頻繁失效。這是因為它們依賴于元素的精確層級關系,一旦元素的層級發生調整,定位器就會失效。相反,使用相對路徑能帶來更多的好處:
- 保持穩定性:即使頁面結構略有變化,相對定位器仍然有效,因為它們不依賴于元素的精確層級。
- 易于閱讀和維護:如果頁面上的元素發生位置變化,相對定位器不會受到影響。
示例:
不推薦的定位器:
XPath:/html/body/div[1]/div[2]/button
CSS:html > body > div:nth-child(2) > button
推薦的定位器:
XPath://button[@data-qa='submit-button']
CSS:button[data-qa='submit-button']
2. 避免在定位器中使用索引
在XPath或CSS選擇器中使用索引進行定位,容易導致測試的不穩定性。因為當頁面上的元素被添加或刪除時,索引位置會發生變化,導致定位器失效。此外,使用索引的定位器難以理解和調試,特別是在頁面元素較多的情況下。
示例:
不推薦的定位器:
XPath://div[2]/div[5]
CSS:div:nth-child(7)
推薦的定位器:
XPath://div[contains(@class, 'input-large')]
CSS:div[class*="input-large"]
3. 避免多個類名的定位器
CSS類名經常變化,尤其是在響應式設計、框架更新和代碼重構過程中。因此,依賴多個類名作為定位器的元素會增加維護難度。為了減少這種風險,可以優先選擇使用單一、穩定的類名,或者更可靠的屬性進行定位。
示例:
不推薦的定位器:
XPath://div[@class='col-xs-1 col-sm-7 col-md-5 itemx ng-scope input-large']
CSS:div.col-xs-1.col-sm-7.col-md-5.itemx.ng-scope.input-large
推薦的定位器:
XPath://div[contains(@class, 'input-large')]
CSS:div[class*="input-large"]
4. 避免動態和自動生成的ID
對于復雜或基于組件的應用程序,框架會為元素生成動態 ID。這些ID在每次頁面加載、會話或組件順序發生變化時都會改變,這使得自動化測試中很難通過ID來準確定位元素。如果可能的話,最好使用專門為測試設計的自定義屬性,或者選擇有意義且唯一的屬性進行定位。
示例:
不推薦的定位器:
XPath://button[@class='btn-primary-1850']
CSS:button.btn-primary-1850
推薦的定位器:
XPath://button[@data-qa='submit-button']
CSS:button[data-qa="submit-button"]
5. 確保定位器唯一
非唯一的定位器會匹配頁面上的多個元素,這可能導致測試失敗。因為自動化腳本可能會選中錯誤的元素,或者與隱藏的或禁用的元素交互。確保每個定位器唯一,能精確地標識頁面上的一個元素。
解決策略:
- 使用父子關系定位:通過元素之間的層級關系來定義元素。例如,在兩個表單中,你可以通過表單ID來定位特定的輸入框。
<!-- 第一個表單 -->
<form id="login-form"><input type="email" id="email" /><input type="password" id="password" /><button id="submit-button">登錄</button>
</form><!-- 第二個表單 -->
<form id="signup-form"><input type="email" id="email" /><input type="password" id="password" /><button id="submit-button">注冊</button>
</form>
通過定位父級元素,如//form[@id='login-form']//input[@id='email']
,可以確保定位的是正確的元素。
6. 處理隱藏元素的策略
在自動化測試中,隱藏元素可能會干擾定位器的正確性。以下是一些處理隱藏元素的策略:
- 檢查元素屬性:檢查元素的
aria-hidden
屬性、display
屬性等,判斷其是否隱藏。 - 創建基于可見性的定位器:利用唯一屬性來選擇可見元素。
<button class="submit-button hidden" data-qa="submit-button">提交</button>
<button class="submit-button" data-qa="submit-button">提交</button>
CSS選擇器:
button.submit-button:not(.hidden)
這種方式可以確保只選擇可見的按鈕。
7. 謹慎使用基于文本的定位器
基于文本的定位器,如button[text()='提交']
,可以在頁面文本內容發生變化時變得不穩定。原因可能有很多,包括內容更新、頁面本地化、多語言支持等。因此,文本內容的定位器應該謹慎使用。
解決方案:
可以考慮使用預加載的測試數據策略,提前知道頁面上將出現哪些文本內容,從而創建可靠的定位器。
8. 使用AI創建穩定的定位器
AI技術已經被引入到自動化測試中,用來生成更加穩定和可靠的定位器。通過訓練模型來自動識別頁面元素和生成有效的定位器,AI能夠幫助我們避免手動選擇錯誤的元素,并提高定位器的穩定性。
示例:
總結
在自動化測試中,創建穩定、唯一且可靠的定位器就像在復雜的城市中尋找最合適的路線。通過準確使用定位器,我們能夠確保測試腳本能夠穩定運行,讓測試腳本將變得更加可靠、易于維護,并且能夠適應頁面的變化。