用ruby做自动化测试--入门
下面我就通过下面的方法来进行按键
"this is some text".upcase.each_byte do |b|keybd_event.call b, 0, KEYEVENTF_KEYDOWN, 0sleep 0.05keybd_event.call b, 0, KEYEVENTF_KEYUP, 0sleep 0.05end
这样代码就会顺序在页面输入文本信息了。
激活窗口有的时候窗口是在后侧的,不是在去前面,鼠标键盘的焦点也不在该窗口上,如果进行键盘操作的的话,可能会在其他窗口上。所以我们需要把激活,放到电脑最前面来。 这里需要win32api里面的一个函数:
BOOL SetForegroundWindow(HWND hWnd)
这里需要的函数只需要一个参数,这个参数就是窗口的句柄,返回是布尔型,如果失败返回0,成功返回1,那么可以用'L', ruby的代码就可以这么写
set_fore_window = user32 'SetForegroundWindow', ['L'], 'L'set_fore_window.call main_window
PS: 可能该操作要进行多次,直到返回值为1为止,这里的代码比较简单,只是执行了一次
关闭窗口打开 必有 关闭,我们打开的窗口,现在研究一下如何关闭窗口,关闭窗口。通过win32api关闭窗口,使用一个想窗口传递消息的函数:
BOOL PostMessage(HWND window,UINT message,WPARAM wParam,LPARAM lParam);
这里第一个参数不用说了,窗口的句柄,第二个参数就是消息的具体内容,后面是相关的参数。我们这里要用WM_SYSCOMMAND(0x0112)消息来发送关闭窗口,代码如下:
post_message = user32 'PostMessage' , ['L' , 'L' , 'L' , 'L' ], 'L'WM_SYSCOMMAND = 0x0112SC_CLOSE = 0xF060post_message.call main_window, WM_SYSCOMMAND, SC_CLOSE, 0
具体WM_SYSCOMMAND意义,可以参看文档[http://msdn.microsoft.com/en-us/library/windows/desktop/ms646360(v=vs.85).aspx]
如果你用记事本的话,他可能会发送完关闭消息后,会弹出一个窗口,询问是否保存,看来我们还有工作要做啊。
定位窗口的控件我们下面试着用鼠标,来把上面窗口上的按钮点了。不用说,要搞到页面上的控件,加入我们要点“否”的按钮。使用一个函数
HWND GetDlgItem(HWND dialog, int control);
改函数会获取对话框上的控件,control会是对话窗上按钮的ID,我们可以用spy++看到,当然一般系统对否的按钮默认就是7
get_dlg_item = user32 'GetDlgItem' , ['L' , 'L' ], 'L'dialog = find_window.call nil, 'Steganos LockNote' )IDNO = 7button = get_dlg_item.call dialog, IDNO
代码很简单,先找到对话框,然后找其中的控件
获取控件坐标找到了控件,我们需要计算出他的位置,然后把鼠标移动到相应的位置,然后执行鼠标的点击事件。 首先计算位置:
BOOL GetWindowRect(HWND window, LPRECT rectangle);
这个函数会获得控件的坐标和大小,会写入rectangle函数里,这里我们使用ruby的pack方法来设置这个值,我还是先上代码吧
get_window_rect = user32 'GetWindowRect' , ['L' , 'P' ], 'I'rectangle = [0, 0, 0, 0].pack 'L*'get_window_rect.call button, rectangleleft, top, right, bottom = rectangle.unpack 'L*'
在ruby里我们用'P'来作为来作为rectangle的类型,call之前先初始化,然后使用pack和unpack来分别获取坐标和长宽。 这里细节讲太细,会有很多边边角角的。不过这种用法可以直接记住,在使用的时候直接使用即可。
执行鼠标的点击事件知道位置我们就可以计算位置,然后移动鼠标了,然后点击了。最后这一步,其实很简单了,就是多了两个方法,直接上代码来看吧:
set_cursor_pos = user32 'SetCursorPos' , ['L' , 'L' ], 'I'mouse_event = user32 'mouse_event' , ['L' , 'L' , 'L' , 'L' , 'L' ], 'V'MOUSEEVENTF_LEFTDOWN = 0x0002MOUSEEVENTF_LEFTUP = 0x0004center = [(left + right) / 2, (top + bottom) / 2]set_cursor_pos.call *centermouse_event.call MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0mouse_event.call MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
首先 SetCursorPos会将光标移动到指定位置,而mouse_event和我们之前的键盘输入很相近了,移动好位置,直接点击OK,大功告成。 最后这点我没有仔细分析了,因为这部分代码我觉得都可以直接写个函数,经常用了。
##小小总结 其实写了这么长,基本上在不断调用win32api而已,所以只要看看win32api,我们能在window的界面上做很多事情。
##写在最后 其实这类代码在vb中有很多,很多让写游戏插件,脚本什么的,都曾用过,网上一大堆一大堆的。可以通过借鉴vb的方法,来学习使用ruby来进行自动化测试。