UI Automation 模擬滑鼠動作

之前在 UI Automation 簡介有提到說, UI Automation 要對元件做操作時要透過本身有支援的 Pattern 來對元件進行操作,但有時候有些元件本身沒有相關的 Pattern 來進行想做的操作,就會讓我們的自動化遇到困難。

舉例來說,在 UI Automation 裡要 Click button 必須透過 InvokePattern 來達成(參考: UI Automation Pattern 使用介紹), 如果想在一個 ListView 裡做 Click 的動作,但是 ListView 本身沒有支援 InvokePattern,所以我們無法透過 InvokePattern 來達成,因此我們就必須模擬滑鼠的動作來 Click 想要的元件。

如果要模擬滑鼠動作的話,我們可以先建立一個 Mouse 的 Class,再來我們要必須引用 System.Runtime.InteropServices 這個命名空間

using System.Runtime.InteropServices

在 Windows 裡有專門針對滑鼠操作的 API,這些 API 存在 user32.dll 裡,如果我們要使用的話必須要 import user32.dll

[DllImport("user32.dll")]
private extern static void SetCursorPos(int x, int y); //讓滑鼠移到指定位置

[DllImport("user32.dll")]
private static extern void mouse_event(MouseEventFlag flags,
               int incrementX, int incrementY, int data, int extraInfo);//模擬各種滑鼠行為
  • 其中 MouseEventFlag 是用來模擬滑鼠的各種行為,我們可以透過 enum 將所需要用到的行為整理在一起,以便使用。
    enum MouseEventFlag :int
    {
       MOVE = 0x0001,
       LEFTDOWN = 0x0002,
       LEFTUP = 0x0004,
       RIGHTDOWN = 0x0008,
       RIGHTUP = 0x0010,
       MIDDLEDOWN = 0x0020,
       MIDDLEUP = 0x0040
    }
    

    關於這兩個函式的詳細介紹可以參考 MSDN 的 mouse_event functionSetCursorPos function

    再來,我們就可以根據這兩個 Function 來定義相關行為,以下範例是定義 Click 的行為:

    public void click(AutomationElement item)
    {
       Rect rect = item.Current.BoundingRectangle;
    
       int x = (int)(rect.Left + rect.Width / 2);
       int y = (int)(rect.Top + rect.Height / 2);
    
       SetCursorPos(x, y);
       mouse_event(MouseEventFlag.LEFTDOWN, 0, 0, 0, 0);
       mouse_event(MouseEventFlag.LEFTUP, 0, 0, 0, 0);
    }
    

    在上面的範例中,我們先傳入一個 UI Automation 的元件,取得元件的 BoundingRectangle 範圍,再將滑鼠的位置設置在元件的中心點上,之後再透過 mouse_event 來達到點擊的動作。

    當我們完成透過模擬滑鼠動作,也發現執行 Click 的速度比直接用 InvokePattern 快許多,所以透過模擬滑鼠動作,除了可以讓自動化執行的速度再快一點外,也比較貼近 user 的操作。

    參考文章:
    MSDN mouse_event function
    使用UI Automation实现自动化测试–6 (模拟鼠标在自动化测试中的应用)

     

     

     

     

     

廣告

發表迴響

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