目前,在自動化測試的實際應用中,介面自動化測試被廣泛使用,但UI自動化測試也並不會被替代。讓我們看看二者的對比:
介面自動化測試是跳過前端介面直接對服務端的測試,執行效率和覆蓋率更高,維護成本更低,整體而言投出產出比更高,因此在專案上的使用更廣泛。而UI自動化測試則是模擬使用者在前端頁面中的操作行為進行測試,雖然在執行過程中易收到其他因素的影響(如電腦卡頓,瀏覽器卡頓,網速等)而導致用例執行失敗,且後期維護成本較高,但是UI自動化測試更貼近使用者使用時的真實情況,也能夠發現一些介面自動化無法發現的bug。因此,在實際專案的自動化測試中,通常採用以介面自動化為主、系統穩定後透過UI自動化對重點業務流程進行覆蓋的方案。而UI自動化的基礎,就是元素定位。只有完成了元素定位,才可以操作定位到的元素,模擬手工測試進行一系列的頁面互動,比如點選、輸入等。
1. 常用的元素定位方式對於web端的UI自動化測試,元素定位通常使用selenium提供的以下8種定位方式:
id:根據id定位,是最常用的定位方式,因為id具有唯一性,定位準確快捷。name:透過元素的【name】屬性定位,會存在不唯一的情況。class_name:透過class 屬性名稱進行定位。tag_name:透過標籤名定位,一般不建議使用。link_text:專用於定位超連結元素(即a標籤),需要完全匹配超連結的內容。partial_link_text:同樣用於定位超連結元素,但可以模糊匹配超連結的內容。xpath:根據元素路徑進行定位,分為絕對路徑和相對路徑,可以定位到所有目標元素。css_selector:selenium官方推薦的元素定位方式,比xpath效率更高,但需要掌握一些css基礎。在實際的專案中,更推薦使用xpath和css定位方式,這兩種可以定位到頁面中的所有元素,使用限制較小。如果對css沒有了解的話,推薦使用xpath的方式,上手更快;如果對css有一定基礎的朋友,更推薦使用css進行元素定位。
接下來,以百度首頁為例,在實際使用中對各種定位方式進行詳細介紹。
2. 元素定位的實際應用以百度首頁的搜尋框為例,介紹id、name、class、tag_name四種元素定位方式。
2.1 id定位透過id屬性對百度首頁的的輸入框進行定位。
# 透過input標籤的id屬性進行定位find_element_by_id('su')
2.2 name定位透過name屬性對百度首頁的輸入框進行定位。
# 透過input標籤的name屬性進行定位find_element_by_name('wd')
2.3 class_name定位
透過class屬性對百度首頁的輸入框進行定位。
# 透過input標籤的class屬性進行定位find_element_by_class_name('s_ipt')
2.4 tag_name定位
透過標籤名稱來定位,這種方式很少會使用,因為頁面中的同一個標籤通常都會重複。
# 透過input標籤名進行定位find_element_by_tag_name('input')
接下來,以頁面底部的“意見反饋”為例,介紹linkText和partialLinkText兩種定位方式。
2.5 linkText定位透過a標籤的文字資訊進行定位,僅用於定位超連結a標籤。
# 透過a標籤的文字資訊進行定位find_element_by_link_text('意見反饋')
2.6 partialLinkText定位透過對a標籤的部分文字資訊模糊匹配進行定位。
# 透過對a標籤的部分文字資訊模糊匹配進行定位find_element_by_partial_link_text('反饋')
2.7 xpath定位
xpath定位方式是透過頁面元素的屬性和路徑進行元素定位,理論上可以對頁面中所有的元素精選定位。下面介紹xpath的幾種定位方式。
首先,介紹一下xpath的路徑節點表示式,如圖:
(1) xpath絕對路徑定位
仍已百度首頁的搜尋框為例進行介紹。
find_element_by_xpath('/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input')
通常情況下,不會選擇使用xpath絕對路徑進行元素定位,原因有二:一是絕對路徑繁瑣冗長,影響執行速度;二是涉及的層級較多,任何一個層級發生變化都會導致定位失敗,需要重新進行修改,不利於後期維護。
(2) xpath相對路徑和元素屬性結合定位
若目標元素的某個屬性具有唯一性,則可直接對目標元素進行定位;否則,需要在目標元素附近尋找一個具有唯一性的元素,然後透過二者的層級關係進行定位。
接下來,依然以百度首頁的頁面元素為例,對xpath定位的方式舉例說明。
# 透過元素屬性定位百度首頁的搜尋框find_element_by_xpath("//input[@id='su']")find_element_by_xpath("//input[@name='wd']")find_element_by_xpath("//input[@class='s_ipt']")find_element_by_xpath("//input[@autocomplete='off']")# 透過文字資訊定位(和text_link方法不同,不侷限於a標籤)find_element_by_xpath("//a[text()='意見反饋']")find_element_by_xpath("//span[text()='設定']")# 透過父級定位子級元素,舉例百度首頁搜尋按鈕find_element_by_xpath("//span[@class='bg s_btn_wr']/input")# 透過子級定位父級元素,舉例百度首頁百度熱榜的換一換find_element_by_xpath("//span[text()='換一換']/..")# 透過contains方法模糊匹配定位,舉例百度首頁搜尋按鈕find_element_by_xpath("//input[contains(@class,'s_btn')]")find_element_by_xpath("//a[contains(text(),'反饋')]")
(3) 瀏覽器複製xpath
除了上述兩個方法之外,還有一個簡單的方法,就是在瀏覽器的F12開發者工具中找到目標元素,滑鼠右鍵進行復制即可,如下圖。
但複製的xpath路徑可能會很冗長,還是推薦大家根據需求自己寫目標元素的xpath路徑。
2.8 css_selector定位(1) css定位簡介
css_selector定位(下文簡稱css定位),它的定位方式,利用選擇器進行的。在CSS 中,選擇器是一種模式,用於選擇需要新增樣式的物件。透過css進行元素定位,理論上也是可以定位到頁面中的所有元素的。
和xpath相比,css的語法更簡潔、定位速度更快,但是css的語法比xpath較為複雜一些,相對難記。
(2) css定位例項
下面,仍以百度首頁搜尋框為例,對css定位方式舉例說明。
# 透過id定位,id名前加# find_element_by_css_selector("#kw")# 透過class定位,class名前加. find_element_by_css_selector(".s_ipt")# 透過標籤定位find_element_by_css_selector("input")# 透過其它屬性定位 find_element_by_css_selector("[name='wd']")# 標籤和屬性組合定位 find_element_by_css_selector("input#kw")find_element_by_css_selector("input.s_ipt")find_element_by_css_selector("input[name='wd']")find_element_by_css_selector("[name='wd'][autocomplete='off']")# 透過父級定位子級元素 find_element_by_css_selector("from#form>span[@class='bg s_ipt_wr']>input")
3. 小結以上,就是selenium的各種元素定位方法的簡單介紹。專案的實際使用中,在定位方法的選擇上,比較推薦大家採用“id > name > xpath/css > 其它”的順序進行選擇。
雖然UI自動化測試沒有介面自動化測試使用廣泛,但也是自動化測試中不可獲取的一部分,希望本文能對學習UI自動化的小夥伴產生一定的幫助。
PS: