Watij中文弹出框问题的一个解决方案

最近刚开始研究watij,主要原因是我想在我自己的项目中使用自动化ST,无意中看到了这个watij的介绍,感觉使用起来很方便,但是当我试图将它引入我的项目当中时却发现一些不爽的地方:

问题一:点击一个按钮出现弹出框时,程序阻塞,无法继续进行.

当时非常郁闷,如果一出现弹出框就无法进行下去了,那还玩个鬼呀,于是打开下载的watij3.2.1的源码包,找到他自己提供的单元测试代码,看看它自己是怎么处理的(src\java-test包下为单元测试类),就在他watij包下找到了PopupsTest类,一看才明白,原来人家是直接new了一个线程出来触发click事件,无语...看来我也只能这么用了,于是我就添加了两个类来解决这个问题:

package watij.utilities;

import watij.elements.HtmlElement;

/**
 * 触发点击线程(ClickThread)事件
 * 
 * @author phrash
 * 
 */
public class AlertDialogEvent {

	public static void fire(final HtmlElement btn) {
		new Thread(new ClickThread(btn)).start();
		try {
            // 停一小会看一下效果
			Thread.sleep(100);
		} catch (InterruptedException e) {
			Debug.handleException(e);
		}
	}
}
 
package watij.utilities;

import watij.elements.HtmlElement;

/**
 * 点击线程
 * 
 * @author phrash
 * 
 */
public class ClickThread implements Runnable {

	private HtmlElement btn;

	public ClickThread(HtmlElement btn) {
		this.btn = btn;
	}

	public void run() {
		try {
			this.btn.click();
		} catch (Exception e) {
			Debug.handleException(e);
		}
	}
}

这样以后再碰到要触发弹出框的时候我就用如下写法:

AlertDialogEvent.fire(ie.button(SymbolFactory.name, value));

相对来说还是比较方便的.

问题二: 中文支持问题,刚刚我们已经可以点击并触发弹出框了,但是我却触发不到弹出框中的确认按钮?郁闷,如,我触发的是一个AlertDialog,我执行
ie.alertDialog().ok();
却没有反应,于是我就gg了一下,发现问此问题的同仁还不少,在网上逛了一下,有人提出直接操作底层控件,将IE的alertDialog的"确定"修改为"OK",牛人,但是我拿来试了一下,没有效果,不知道是不是我用错了,有人说直接修改源码,修改IEAlertDialog类,将
public void ok() throws Exception {
		Wnd wnd = IEUtil.waitDialogWnd(dialog, "Button", "OK");
		IEUtil.clickWindowUntilGone(wnd, dialog);
	}
修改为:
public void ok() throws Exception {
		Wnd wnd = IEUtil.waitDialogWnd(dialog, "Button", "确定");
		IEUtil.clickWindowUntilGone(wnd, dialog);
	}
我觉得挺好的,于是乎就照着修改,我还顺便打算把IEFileDownloadDialog,IEPromptDialog也修改了一下,可在修改的时候却发现,除了IEAlertDialog类是直接写死了按钮的value值外,其他的两个弹出窗口的按钮的value是从资源文件中读取的,呵呵,这下把我乐坏了, 原来人家支持国际化呀,于是我就解压jar包,在watij目录下果然发现了两个资源文件:WatijResources.properties和WatijResources_de.properties,于是我就复制了一份,另存为WatijResources_zh.properties,将里面对应的value修改为相应的中文,另外我还添加了一条,IEAlertDialog_OK="确定",然后修改IEAlertDialog类,将按钮value的值从"OK"修改为从资源文件中获取,然后在WatijResources类中添加一行代码:
IEAlertDialog_OK("IEAlertDialog_OK")

相关文件修改如下:

WatijResources_zh.properties:

IEAlertDialog_OK=\u786E\u5B9A
IEConfirmDialog_Cancel=\u53D6\u6D88
IEFileDownloadDialog_Cancel=\u53D6\u6D88
IEFileDownloadDialog_Close=\u5173\u95ED
IEFileDownloadDialog_CloseWhenComplete=\u4E0B\u8F7D\u5B8C\u6BD5\u540E\u5173\u95ED\u8BE5\u5BF9\u8BDD\u6846(&C)
IEFileDownloadDialog_Open=\u6253\u5F00(&O)
IEFileDownloadDialog_Save=\u4FDD\u5B58(&S)
IEFileDownloadDialog_Title_DownloadComplete=\u4E0B\u8F7D\u5B8C\u6BD5
IEFileDownloadDialog_Title_FileDownload=\u6587\u4EF6\u4E0B\u8F7D
IEFileDownloadDialog_Title_SaveAs=\u53E6\u5B58\u4E3A
IEFileField_ChooseFile=\u9009\u62E9\u6587\u4EF6
IEPromptDialog_Title_ExplorerUserPrompt=Explorer \u7528\u6237\u63D0\u793A

watij.utilities.WatijResources类

package watij.utilities;

/**
 * This enumeration lists all the resources available in the WatijResources bundle
 * @author Anson Mayers
 * @since 8.0
 */
public enum WatijResources {
    IEAlertDialog_OK("IEAlertDialog_OK"),
    IEConfirmDialog_Cancel("IEConfirmDialog_Cancel"),
    IEFileDownloadDialog_Cancel("IEFileDownloadDialog_Cancel"),
    IEFileDownloadDialog_Close("IEFileDownloadDialog_Close"),
    IEFileDownloadDialog_Open("IEFileDownloadDialog_Open"),
    IEFileDownloadDialog_CloseWhenComplete("IEFileDownloadDialog_CloseWhenComplete"),
    IEFileDownloadDialog_Save("IEFileDownloadDialog_Save"),
    IEFileDownloadDialog_Title_DownloadComplete("IEFileDownloadDialog_Title_DownloadComplete"),
    IEFileDownloadDialog_Title_FileDownload("IEFileDownloadDialog_Title_FileDownload"),
    IEFileDownloadDialog_Title_SaveAs("IEFileDownloadDialog_Title_SaveAs"),
    IEFileField_ChooseFile("IEFileField_ChooseFile"),
    IEPromptDialog_Title_ExplorerUserPrompt("IEPromptDialog_Title_ExplorerUserPrompt");

    private String key;

    WatijResources(String key) {
        this.key = key;
    }

    public String getKey() {
        return key;
    }
}

watij.runtime.ie.IEAlertDialog修改为:

package watij.runtime.ie;

import watij.dialogs.AlertDialog;
import watij.utilities.WatijResourceLoader;
import watij.utilities.WatijResources;

import com.jniwrapper.win32.ui.Wnd;

public class IEAlertDialog extends IEBaseDialog implements AlertDialog {

	public static AlertDialog findAlertDialog(IE ie) throws Exception {
		Wnd wnd = IEUtil.waitDialogWnd(IE.TITLE);
		return new IEAlertDialog(wnd, ie);
	}

	public IEAlertDialog(Wnd dialog, IE ie) {
		super(dialog, ie);
	}
	
	public void ok() throws Exception {
		Wnd wnd = IEUtil.waitDialogWnd(dialog, "Button", WatijResourceLoader.getString(WatijResources.IEAlertDialog_OK));
		IEUtil.clickWindowUntilGone(wnd, dialog);
	}
}

ok,最后将资源文件放到watij包下面,编写一个ant脚本将该源码打成jar包,然后引用到工程当中去,不过在使用的时候我们要设置一个环境变量:

System.getProperty("browser.ui.locale", "zh")

这样watij就会读到中文的资源文件了,弹出框中文按钮点不着的问题也就解决了,

呼,终于可以用的比较顺手了,再针对自己的项目封装一层,方便编写适合自己项目的ST代码,差不多一个操作一行代码,OK,收工!

如果各位不想修改源代码,可以安装上面的包路径创建相应的文件和java类来覆盖,也能达到效果。

注意:以上代码可能有出入的地方,因为是在公司修改的,公司有保密协议,所以无法发回家,回家后凭着自己的记忆写的,如果错误请各位同仁见谅并指正.

相关推荐