在这里getQuery是一个非常重要的方法,这在后面会介绍。
public abstract class CompositeControl extends Control { protected List <Control> children; public CompositeControl(WebDriver webDriver) { super(webDriver); children = new ArrayList<Control> (); } public void addChild(Control control) { this.children.add(control); control.parent = this; } } |
所有的可以包含其他控件的类型都从CompositeControl派生,包括Page。比如下面的Window就是这类元素:
public class Window extends CompositeControl { private String title; public Window(String title,WebDriver webDriver) { super(webDriver); this.title = title; } @Override public String getQuery(){ return String.format("Ext.ComponentQuery.query(\"window[title='%s']\")[0]",title); } } |
下面是一个基本控件Button的封装:
public class Button extends Control { private String text; public Button(String text, WebDriver webDriver) { super(webDriver); this.text = text; } @Override public String getQuery() { return this.parent.getQuery() + String.format(".query(\"button[text='%s']\")[0]", text); } public void click() { webDriver.findElement(By.id(getId())).click(); } } |
ExtJS提供了一个query接口,我们可以利用这个接口传入一些查询表达式查询到页面上的Ext控件,而这里的getQuery就是每个控件的查询表达式吧。因为页面上的ExtJS控件是层次的,所以我们可以利用这种嵌套关系进行精确的定位。
好了,来看看我们的登陆页面如何封装吧:
public class LoginPage extends ExtJSPage{ public LoginPage(WebDriver webDriver){ super(webDriver); } private TextBox txtUserName; private TextBox txtPassword; private Button btnLogin; @Override protected void init(){ txtUserName = new TextBox("userName", webDriver); txtPassword = new TextBox("password", webDriver); btnLogin = new Button("登录", webDriver); Window win = new Window("登陆", webDriver); win.addChild(txtUserName); win.addChild(txtPassword); win.addChild(btnLogin); this.addChild(win); } public void login(String userName, String password){ txtUserName.setValue(userName); txtPassword.setValue(password); btnLogin.click(); } } |
上面的TextBox和ExtJSPage没有提供代码,都很简单可以自行进行封装一下(熟悉ASP.NET的同学可能对这里代码有点眼熟)。
按照这种思路,只要我们封装好所有的基本ExtJS控件,对于所有的页面我们剩下的工作就是组装的工作了。在完成这些之后,我甚至发现使用ExtJS的应用比那些没有使用ExtJS的应用更容易进行测试。在这里我们只需要完善我们的基本控件封装就可以让我们的测试更佳稳固,而对于编写测试的人来说只需要集中精力关注Test case。