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自動化