當 iOS App 內的控制元件沒 Accessibility 可以定位元件時,我們 UI 自動化測試該如何操作?

軟體測試部門在做 iOS UI 自動化測試時,會透過抓取 UI 元件的 Accessibity 屬性值來取得該控制元件,再針對取得的控制元件進行操作。

我們可以透過開啓「Accessibility Inspector」視窗來檢視該元件的屬性:
透過滑鼠點選畫面中 search bar 右方的「排序」按鈕,如下圖所示,紅色邊框框出來範圍的地方就是該元件的範圍。

註:開啓 iOS 模擬器的 Accessibility Inspector 步驟: 設定 > 一般 > 輔助使用 > 開啓Accessibility Inspector。

1 3.png

檢視 Accessibility Inspector 資訊:

  1. Label 為該元件的 Accessibility ,其 name 為 sort。
  2. Traits 描述該元件的型態,其型態為 Button。
  3. Frame 描述該元件的座標位置與長寬大小資訊。在 iOS 裡計算座標是以螢幕左上角為原點,向右下角是終點。其值 { {195, 64}, {75, 43} },第一個屬性 {195, 64} 表示該元件左上角座標位置,而第二個屬性 {75, 43} ,第一個數值為元件寬度,第二個數值為元件高度。

如果我們要做點擊上圖「排序」按鈕的動作,可透過下面程式碼來點擊按鈕,陣列索引值使用 Accessibility 值,也就是元件 name 的資訊,「排序」按鈕的 name 為 sort。

window.buttons()[“sort”].tap();

iOS 程式設計裡,如果我們使用原生 UITableView 來條列式顯示資料,當我們要抓取 UITableViewCell 裡的某個元件的 Accessibility 時會抓取到一整個資料欄位 (cell) 而不會是該元件,如下圖所示:

 2.png

此時我們用滑鼠點選 iOS 模擬器,不管是點選「i」按鈕或是點選左方圖片,點選時紅色範圍都是包含整個 tableView 的一個 cell 區塊,這意味著我們無法單獨抓到「i」按鈕或是點選左方圖片,而無法讓 UI 自動化測試進行。

那這樣我們該如何做 UI 自動化呢?

於是我就用了一個很暴力的方法來解決,讓程式點選畫面中某一個座標位置,如:點選 (100,  200) 位置來模擬使用者點擊動作,執行上都沒有問題,但這個做法有些不合理的假設,就是我把設備螢幕的解析度給固定了!我們無法確定 Apple 之後出的設備螢幕解析度(Resolution) 都一樣,如果螢幕解析度改變,固定點選某座標的方法就很有可能點不到原本指定的位置,因為 UI 會跟著螢幕解析度而調整,這樣所寫的 test case 就需要再修改,所以這不是很好的做法。

為了去除 UI 元件位置與螢幕解析度相依性的問題,我就修改成根據「i」按鈕在整個 UITableViewCell 中位置的比例來點選,如下圖所示:

如果我要點選「i」的按鈕,我們可以知道「i」按鈕的位置是在整個 tableView 的 cell 座標中的 (0.9, 0.5) 位置,如下圖所示:

3.png

我們就可用下面的程式來點選,以上圖 tableView 的 cell 說明,左上角座標是 (0, 0)、右下角座標是 (1, 1),而「i」按鈕在此 cell 座標中的 (0.9, 0.5) 位置。

window.tableViews()["空白列表"].cells()[0].tapWithOptions({tapOffset:{x:0.90, y:0.50}});

透過點選 tableView 的 cell 指定比例的座標位置,讓點選位置可以根據螢幕解析度動態且有彈性地調整,而不是把程式固定寫死,點選某控制元件在單一解析度的螢幕中的座標位置。這樣就可以解決設備螢幕解析度與點擊位置相依性的問題。

廣告

發表迴響

Please log in using one of these methods to post your comment:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s