小技巧和竅門分享:減少UI錄製工具的麻煩
UI記錄工具可能令人沮喪,但不一定如此。透過一些快速的技巧和竅門,可以減輕邊緣情況的麻煩,使您能夠更輕鬆地擴充套件UI測試自動化。
測試人員採用測試自動化(尤其是UI測試自動化)來加快重複的測試動作,並將手動工作集中在發現新的有趣問題上。藉助UI測試自動化,您可以定義應用程式要採用的不同路徑,並且機器可以以連續且自動化的方式驗證應用程式,而無需人工完成。
建立自動化測試的主要方法是編寫程式碼。這可能是不幸的,因為知道如何手工遍歷應用程式的測試人員必須學習如何使用諸如Selenium之類的框架來編寫程式碼,或者使用諸如UFT之類的專有工具來建立一個自動工作流,以反映他們正在手動執行的工作流。由於程式碼本質上容易出錯,並且編寫自動化測試可能需要相當複雜的技能,因此這可能會很快成為挑戰。
為了緩解挑戰,許多工具(包括Parasoft的UI測試自動化工具)都具有記錄和播放Web場景的功能。這些工具從理論上講很棒,但是一個很大的問題是大多數記錄器在80%的時間內都無法記錄和回放準確的場景。這是一個不幸的現實,但是隧道盡頭有光明。這是所有錄製工具面臨的一些常見挑戰,以及可以用來解決這些問題的一些技巧。
Web應用程式行為的不一致是錄製和播放技術將面臨的首要挑戰,並且很難克服。發生這種情況的幾種不同原因,以及一些可以幫助您診斷和潛在解決問題的技術。
問題1:即使您不知道該應用程式的狀態,該應用程式仍處於特定狀態。
軟體開發人員使用瀏覽器cookie來儲存Web應用程式特定使用者的會話資訊,或跟蹤相關應用程式之間的會話。Cookies可用於檢索有關使用者的資訊,而無需將資訊儲存在後端系統中。Cookie記錄資料,例如使用者的瀏覽器以前訪問過該Web應用程式的事實,或有關使用者當前會話的資訊。
出於自動化目的,現有的cookie可能容易引起問題。諸如Selenium之類的測試自動化框架通常以“乾淨”狀態啟動瀏覽器,其中已刪除所有cookie。如果您錄製的測試中存在Cookie,則該Web應用程式在播放過程中的行為將與錄製時不同,並且錄製的測試可能會失敗。
一個示例是儲存在Cookie中的會話資料,該資料允許使用者在瀏覽器會話之間保持登入到Web應用程式的狀態。如果您已經登入就開始記錄,則記錄的測試用例中不會捕獲任何登入資訊。在播放期間,將不存在任何cookie,因此應用程式將立即轉到登入頁面,並且測試將失敗。
當元素在回放過程中出現在頁面上而在錄製過程中沒有出現時,會發生同樣的問題。許多網路應用程式會在使用者首次訪問時顯示通知,例如有關應用程式使用Cookie的GDPR通知,或顯示特殊交易、銷售或新聞簡報註冊機會的彈出式div。在這種情況下,錄製的場景的回放將失敗,因為在錄製過程中沒有出現其他頁面元素,因此測試不知道如何與其他元素進行互動。
這是減輕麻煩的方法......
解決方案:以隱身/私人模式錄製和播放
可以將大多數瀏覽器設定為以隱身/私有模式啟動。在此模式下執行時,Cookie和配置檔案資訊將被刪除,因此該Web應用程式的行為就像您第一次訪問時一樣,並且您尚未登入。使用以隱身/私有模式啟動的瀏覽器記錄您的測試方案,並且您將為記錄的測試方案提供一個乾淨的基準。在Chrome中,設定如下所示:
建立測試指令碼後,通常可以允許它以正常模式播放。但是,在某些情況下,以隱身/私人模式播放可能會有所幫助。一個示例就是一個Web應用程式,它使用您當前的位置來自定義頁面上的體驗。我發現有些情況下,在硒測試的回放過程中檢索到的當前位置與錄製過程中檢索到的位置有所不同(我不確定為什麼)。以隱身/私人模式播放將阻止瀏覽器獲取您的當前位置,並穩定您的測試場景。在Selenium中,您可以指示以隱身/私有模式進行播放-檢視這些方便的Chrome和Firefox連結。
解決方案:設定特定的Cookie
如果您需要適當的cookie以確保在特定狀態下以Web應用程式開始播放,這可能會很有用。這是一篇很棒的論壇帖子,概述了在播放時捕獲和設定特定Cookie的過程。
問題2:更改螢幕尺寸
響應式Web設計的現代Web應用程式開發實踐在自動測試建立過程中引起了問題。為了使Web應用程式可同時在移動裝置和桌上型電腦上使用,開發人員建立了響應式應用程式,該應用程式根據螢幕尺寸而變化。當您調整視窗大小並且UI完全更改時,您會看到此資訊。想象一下這對自動化測試有何作用!
如果您在最大化的視窗中記錄測試,然後在一半大小的視窗中進行回放,則由於瀏覽器大小的不同,頁面元素可能會被隱藏或遮蓋。當播放機上的解析度與錄製機上的解析度不同時,也會發生類似的效果。無論哪種方式,它都會對您的測試自動化產生很大影響。
這是減輕麻煩的方法......
解決方案:最大化瀏覽器的播放效果
您可以使用Selenium命令來最大化瀏覽器的大小:
driver.manage().window().maximize();
options.addArguments("start-maximized”)
最大化瀏覽器可確保頁面全尺寸,並且在頁面上為該配置安排了元素。假設您以最大的螢幕尺寸進行錄製,即使進行播放的機器使用不同的解析度,錄製和播放之間的元素通常也會保持一致。
作為人類,當我使用Web應用程式時,我會尋找特定的元素,並在這些元素“就緒”時與它們互動。在自動化測試中,機器要知道什麼時候該做什麼與什麼時候該去做比較困難。
自動化測試工具將測試場景作為一系列步驟來執行。例如,在針對Amazon執行購物車測試時,下一步可能是將商品新增到購物車,然後單擊購物車按鈕。問題在於,新增商品後,購物車按鈕可能無法立即使用,並且圖示可能會立即更改。測試指令碼需要確切地知道要等待的正確時間,或者要前進的條件。測試中處理此問題的配置通常稱為“等待條件”。記錄員很難理解要在測試指令碼中建立哪些等待條件,因此您必須在測試中手動構建複雜的等待條件。
這是減輕麻煩的方法......
解決方案:使用顯式等待
顯式等待是在單個元素上設定的等待條件,指示Selenium WebDriver等待直到滿足特定條件——例如等待元素在頁面上出現或可見。等待條件指定等待條件滿足的最長時間。
每當測試嘗試查詢元素時,請使用顯式等待。如果根本沒有使用任何等待條件,那麼如果元素沒有立即以正確的狀態出現,則測試將失敗。Selenium WebDriver還支援隱式等待條件,該條件在整個測試場景中全域性設定,並在測試嘗試查詢元素時使用。但是,不建議隱式等待。有關顯式和隱式等待,請參見Selenium文件。
使用顯式等待時,Selenium可能會引發異常,從而中斷等待條件-但實際上您希望在這些情況下繼續等待條件。您可以透過配置顯式等待來忽略特定異常來處理此問題。需要忽略的一些常見異常是NoSuchElementException,
StaleElementReferenceException和
ElementClickInterceptedException。
這是忽略這些異常之一的顯式等待的一個好例子:
WebDriverWait wait = new WebDriverWait(driver, DEFAULT_WAIT_FOR_ELEMENT_TIMEOUT);
wait.ignoring(StaleElementReferenceException.class);
wait.until(ExpectedConditions.elementToBeClickable(element);
Web應用程式記錄器試圖為記錄的測試中引用的每個頁面元素構建一個良好的元素定位器,但是在許多情況下,記錄下來的定位器並不理想。例如,記錄的定位器可能會引用每次訪問頁面時都會更改的動態資訊,或者在以後修改頁面的不相關部分時容易產生中斷。
常見的示例可能是:
Logout user (bob)
這是減輕麻煩的方法......
解決方案:建立智慧定位器
識別包含動態資訊的元素定位器通常非常容易。當您回放錄製的場景時,這些定位器將失敗,因為它們所依賴的動態資訊是不同的。要處理這些情況,您需要找到可在元素定位器中使用的頁面元素的唯一標識屬性,而不是已記錄的動態屬性。
一種方法是在瀏覽器中手動導航到該元素出現的頁面,然後右鍵單擊該元素並選擇選單選項以檢查該元素(在Chrome中稱為Inspect,在Firefox中稱為Inspect Element)。這將帶您進入DOM結構,該結構將允許您檢視該元素的基礎DOM和HTML程式碼。在此檢視中,您可以標識用來標識元素的其他屬性。要查詢的常見屬性是“類”、“名稱”、“標題”和“ alt”,但是這些屬性也可能是動態的,您應該選擇一個或多個唯一標識元素的屬性。在某些情況下,可以在父元素上找到最能唯一地標識元素的屬性,因此您可能需要建立相對xpath,例如:
//div[@class=’actionButton’]/button
另一種方法是使用工具,該工具可以為您提供各種定位器選項,您可以從中選擇一個,然後根據需要進行調整。想到的一些特定工具是SeleniumIDE和TruePath,它們兩者都可以建立可用於標識元素的多個不同的定位器。您可以按原樣使用定位器,也可以選擇一個定位器並對其進行修改以適合您的需求。
第三種選擇是使用Parasoft Selenic,以在測試由於定位器損壞或執行時損壞的定位器自愈而失敗時生成更好的定位器建議。Selenic將使用來自先前測試執行的歷史資料以及有關頁面當前狀態的資訊來建議您可以使用的一組不同的定位器,以及對每個定位器的信心。
除了我已經提到的內容之外,從記錄建立測試方案時還會出現許多其他常見情況。以下是一些其他技巧,可以使使用UI錄製工具的麻煩減輕。
記錄懸停動作
傳統上,記錄和播放工具很難捕獲使用者將滑鼠置於另一個元素上時出現的頁面元素。通常不會記錄懸停操作,但是會記錄與出現的元素的互動。執行測試方案時,不會發生懸停操作,並且測試方案中定義的下一頁元素將永遠不會出現——這會使測試失敗。
為了減輕這種麻煩,請在記錄過程中注意懸停動作顯示其他元素的位置,當您看到其中一種情況時,請單擊該元素,而不是簡單地將其懸停在該元素上。這將導致單擊操作被記錄到該頁面元素的測試中。如果要使測試懸停而不是單擊元素,請在事實之後將測試中的單擊動作更改為懸停動作。這是一篇可以幫助您解決此問題的文章。
滾動
錄製時,您經常需要滾動頁面元素使其進入檢視以與其進行互動。錄製工具通常不錄製滾動操作,並且不需要,因為Selenium通常會為您處理滾動。但是,在某些情況下,當回放測試時,Selenium不會將頁面元素滾動到檢視中,並且測試將失敗,因為該元素不可見。為了減輕這種麻煩,請稍後使用JavaScript執行程式手動新增滾動互動。這是一篇很棒的文章,可以幫助您逐步理解。
未記錄某些動作
在錄製時,元素有時會不被錄製。通常,這是由於UI框架以獨特的方式構建頁面上的元素。
為了減輕這種麻煩,請在記錄時跟蹤您正在Web應用程式上執行的特定操作。錄製後,在Selenium指令碼中標識應該執行的操作並將其手動新增。您可以透過在瀏覽器中導航到缺少操作的頁面來標識要使用的定位器,然後使用前面提到的瀏覽器擴充套件之一捕獲定位器並將其手動放入測試中。
使用UI錄製工具建立測試場景可能會很麻煩,但這不是必須的。利用這些技術,您可以成功進行UI測試自動化實踐。祝測試愉快!
小技巧和竅門分享:減少UI錄製工具的麻煩