1. 程式人生 > 實用技巧 >UI自動化指令碼執行找不到元素解決方案

UI自動化指令碼執行找不到元素解決方案

UI自動化解密之元素定位後為啥放在腳本里面找不到

我們是否在瀏覽器F12下面,進行右鍵Copy Element Xpath/Css 時,放在瀏覽器裡面直接就能夠正確查詢,為什麼放在腳本里面就找不到了呢(不考慮隱式、強式、顯式等待)?現在從以下幾點進行分析:

1.元素的定位一般用xpath比較好,如果在F12裡面定位出的,在自動化腳本里面元素無法定位,需要進行手寫xpath。如果某些元素如懸浮才能展示,然後移動到F12內她又消失了你說氣不氣?怎麼解決呢?在瀏覽器頁面右鍵選中右擊,然後不要點選挪動滑鼠到F12窗口裡面,再鍵盤上面輸入 N,此時懸浮框的原始碼就展示在F12的頁面。也可以通過F8進入檢視。

2.如果頁面有變化時,元素定位不到。可能是因為指令碼解析及瀏覽器執行的速度比較快,要快於客戶端從伺服器接受訊息產生的響應時間。所以需要加個sleep,因為sleep時間不足,導致瀏覽器雖然提示點選元素了成功了,但是沒有執行動作。

3.利用系統複製的Xpath有沒有發現特別的長,而且有的時間會變化呀。所以我們一般不用系統複製出來的,有二個方面,直接複製出來的有的可能是絕對路徑,這就可能導致你在自動化操作的時候,不一定能夠完全匹配到這個路徑。比如你在自動化的時候,同樣在這個頁面,點了某個按鈕,導致這個元素新增了或者展開了一個父類節點,這個時候這個絕對路徑就不能使用了。

解決方案:手寫xpath時,需要分析原始碼結構。找父級以上的唯一標籤屬性名,通過xpath進行遞迴找到該元素;同理,手寫xpath時,還可以根據子級唯一的標籤屬性名。需要用到“…/” 一層一層返回父級。

4.對於元素定位報錯後,比如執行了元素A的點選動作,頁面沒有跳轉,無法定位到元素B
確認下是否定位準確了,有可能是元素A定位出錯了,沒有定位到可點選的子節點。
前端的框架一般都有很層div巢狀,在瀏覽器除錯的時候,你需要確定你點選的那個div是否是觸發事件的div,如果實在不能確認的話,找下前端開發工程師。

5.在編寫測試用例的時候,要考慮用例的相互依賴關係。如列表先進行新增/刪除操作了,新增刪除時元素的xpath肯定會新增,如果在新增後的基礎上再進行其他操作xpath會有效,如果刪了後了,xpath消失,會導致同級下其他xpath路徑打亂,而失效。
如:我添加了一個4個子機構,我在第三個子機構做新增時沒問題。如果把第二個子機構給刪除了,再做第三個子機構的其他操作。就會導致定位失敗,無法操作。

此時解決的辦法就是調整用例的執行順序或者重新定位xpath。
建議在做UI自動化的時候,提前將case進行寫個大綱

6.如果元素被隱藏了,前端頁面不顯示,但是原始碼顯示,需要在前端進行操作。如上傳按鈕。
做一這塊的自動化,有2種方式,第一種就是利用軟體錄製一個exe檔案,放在腳本里面執行,不推薦使用;第二種就是找input=“file”的標籤,然後sendkeys檔案的路徑,瀏覽器會自動實現上傳資料夾的功能。大部分的前端在做上傳功能的時候,都將按鈕進行封裝在div標籤內了,並且隱藏了。所以我們需要利用JavaScript進行修改被隱藏的屬性值,讓他展示出原來的樣貌,實現上傳。

通過對比我們發現type=“file”的這個標籤,被隱藏了。style=“display:none”。
我們需要將 ** display:block ** 或者將display的屬性值給註釋
以下我們提供三種前端解決辦法

第一種:通過過濾關鍵字查詢標籤,在右側直接修改none的值,修改為 block顯示。

第二種:直接反勾選,註釋掉屬性和屬性值

第三種:在console裡面,輸入JS命令修改屬性值。語法為: 【二選一】
** document.querySelector(“css定位”).setAttribute(“style”,“display:block”)
document.querySelector(“css定位”).style.display=“block” **

這是博主封裝的一個方法,用來修改JS內的屬性

 def js_set_attribute(self,css,name,value):
            '''設定修改標籤內屬性'''
            self.logger.info("呼叫JS執行修改標籤內屬性")
            try:
                js="document.querySelector( '%s' ).setAttribute('%s','%s')" %(css,name,value)
                self.driver.execute_script(js)
                self.logger.info("修改成功")
            except Exception:
                self.get_screen()
                raise Exception("修改失敗")

最後的一句話,UI自動化