使用selenium测试zk组件技巧

对zk开发的ajax应用,在使用selenium这样的自动化测试工具测试时会遇到很多困难。这里简单了总结了几点遇到的问题和解决办法:

  • 快速寻找到某个组件
zk组件生成的html代码很乱,有一点很恼人的是,其中每个Html元素的id号不是固定的,而是每次刷新页面都会变化。

这直接导致selenium.click("id=xxx")这样的代码不能使用了,要得到页面上的一个链接或者一个输入框,我都得小心翼翼的去翻zk生成的长长的html代码,而且页面一有更改,可能之前写的代码都不能用了。如果要是能在生成的html中,也能看到zk中的组件的id号就方便多了。

解决方法:

修改zk的源码。修改org.zkoss.zk.ui.HtmlBasedComponent这个类,在getOuterAttrs()方法中增加了一句
HTMLs.appendAttribute(sb, "autotest", getId());
这样比如一个输入框生成的html代码里就会有类似<input autotest='input1'>这样的代码了,这样在selenium中就可以直接用
selenium.click("xpath=//*[@autotest='" + id + "']");
来操作这个对象,方便多了。
  • 输入框事件

在zk生成的按钮可以增加自定义的事件来检查某个输入框内输入字符串是否符合要求。这时候如果使用selenium.type命令在输入框中输入,就会发现zk总会认为输入的内容是空的。原因为,selenium的type命令和手工在浏览器中输入字符有不相同的地方,手工在浏览器中输入字符会自动触发此输入框的onchange和onblur这两个javascript事件。而selenium的type命令不会,

解决方法:

在使用type后,手工触发一下change和blue事件。如:

selenium.type("xpath=//*[@autotest='" + element + "']", type);
		selenium.fireEvent("xpath=//*[@autotest='" + element + "']", "change");
		selenium.fireEvent("xpath=//*[@autotest='" + element + "']", "blur");

相关推荐