使用JNA解决自动化测试无法做密码输入操作的问题

发表于:2013-4-07 16:12

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:孙巨    来源:TaoBao QA Team

  其中用到的各种事件类型定义如下:

1.public class Win32MessageConstants { 
2. 
3.    public static final int WM_SETTEXT = 0x000C; //输入文本 
4.     
5.    public static final int WM_CHAR = 0x0102; //输入字符 
6. 
7.    public static final int BM_CLICK = 0xF5; //点击事件,即按下和抬起两个动作 
8. 
9.    public static final int KEYEVENTF_KEYUP = 0x0002; //键盘按键抬起 
10.     
11.    public static final int KEYEVENTF_KEYDOWN = 0x0; //键盘按键按下 
12. 
13.}

  下面写一段测试代码来测试支付宝密码安全控件的输入,测试代码如下:

1.import java.util.concurrent.TimeUnit; 
2. 
3.import static org.hamcrest.core.Is.is; 
4.import static org.junit.Assert.assertThat; 
5. 
6.import static org.hamcrest.core.IsNull.notNullValue; 
7.import org.junit.Test; 
8. 
9.import com.sun.jna.platform.win32.WinDef; 
10.import com.sun.jna.platform.win32.WinDef.HWND; 
11. 
12.public class AlipayPasswordInputTest { 
13. 
14.    @Test 
15.    public void testAlipayPasswordInput() { 
16.        String password = "your password"; 
17.        HWND alipayEdit = findHandle("Chrome_RenderWidgetHostHWND", "Edit"); //Chrome浏览器,使用Spy++可以抓取句柄的参数 
18.        assertThat("获取支付宝密码控件失败。", alipayEdit, notNullValue()); 
19.        boolean isSuccess = Win32Util.simulateCharInput(alipayEdit, password); 
20.        assertThat("输入支付宝密码["+ password +"]失败。", isSuccess,  is(true)); 
21.    } 
22.     
23.    private WinDef.HWND findHandle(String browserClassName, String alieditClassName) { 
24.        WinDef.HWND browser = Win32Util.findHandleByClassName(browserClassName, 10, TimeUnit.SECONDS); 
25.        return Win32Util.findHandleByClassName(browser, alieditClassName, 10, TimeUnit.SECONDS); 
26.    } 
27.}

  测试一下,看看是不是输入成功了!

  最后说下这个方法的缺陷,任何方法都有不可避免的存在一些问题,完美的事情很少。

  1、sendMessage和postMessage有很多重载的函数,不是每种都有效,从上面的Win32Util中就能看出,实现了很多个方法,需要尝试下,成本略高;

  2、输入时需要注意频率,输入太快可能导致浏览器中安全控件崩溃,支付宝的安全控件在Firefox下输入太快就会崩溃;

  3、因为是系统API,所以MAC、UNIX、WINDOWS下都不同,如果只是在windows环境下运行,可以忽略;

  4、从测试代码可以看到,是针对Chrome浏览器的,因为每种浏览器的窗口句柄不同,所以要区分,不过这个相对简单,只是名称不同;

  5、如果你使用Selenium的RemoteDriver,并且是在远程机器上运行脚本,这个方法会失效。因为remoteDriver最终是http操作,对操作系统API的操作是客户端行为,不能被翻译成Http Command,所以会失效。

44/4<1234
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号