1、近期发现很多人在写webdriver脚本代码的时候,页面元素信息都是与脚本混合写在一起,这种情况,在后期产品出现UI变动的时候,就需要进行大面积的UI元素信息位置的修改,成本将非常的高,也一度降低了脚本的复用性。利用java接口这一特性,可以很好的解决这一个问题。下面以worktile网站登录功能进行实例讲解。
2、在没有进行页面封装的时候进行登录操作的脚本如下:
publicclassTest2 {
publicstaticvoidmain(String[]args) {
WebDriverdriver=newFirefoxDriver();
driver.get("https://worktile.com/signin");
driver.findElement(By.name("login_name")).sendKeys("test");
driver.findElement(By.name("login_password")).sendKeys("lp2010520334455");
driver.findElement(By.xpath("//button[@type='button']")).click();
driver.quit();
}
}
注意:可以发现,findElement后面查找的页面元素信息都是直接写在脚本当中,并未有进行与脚本进行隔离,当前端页面ui出现改动的时候,变更的成本将非常之大。
3、接下来定义一个pageObjectStore接口,在接口里面定义信息保存页面元素位置信息,如下内容:
publicinterfacePageObjectStore{
StringloginName="name=login_name";//登录名称输入框
StringPWD="name=login_password";//登录密码输入框
StringloginButton="xpath=//button[@type='button']";//登录按钮
StringlogoutLink="xpath=//a[contains(text(),'退 出')]";//退出按钮
}
注意:接口里面定义的变量默认为public static
final修饰。
4、接下来针对driver.findElement(by)方法进行一次封装,因为每次查找页面元素定位的方式都不一样,需要对这些by的方法进行统一的封装,调用同一个查找方法,亦可判断出是那种查找方式。
publicclassWebDriverLib {
publicstaticWebDriverdriver;
publicstaticBy parseObject(Stringp_object) {
StringnewObjecyt=null;
if(p_object.startsWith(".//") ||p_object.startsWith("//")) {
returnBy.xpath(p_object);
}elseif(p_object.startsWith("link=") ||p_object.startsWith("Link=")) {
newObjecyt=p_object.substring(p_object.indexOf("=") + 1);
returnBy.linkText(newObjecyt);
}elseif(p_object.startsWith("xpath=")) {
newObjecyt=p_object.substring(p_object.indexOf("=") + 1);
returnBy.xpath(newObjecyt);
}elseif(p_object.startsWith("id=")) {
newObjecyt=p_object.substring(p_object.indexOf("=") + 1);
returnBy.id(newObjecyt);
}elseif(p_object.startsWith("css=")) {
newObjecyt=p_object.substring(p_object.indexOf("=") + 1);
returnBy.cssSelector(newObjecyt);
}elseif(p_object.startsWith("class=")) {
newObjecyt=p_object.substring(p_object.indexOf("=") + 1);
returnBy.className(newObjecyt);
}elseif(p_object.startsWith("tagName=")) {
newObjecyt=p_object.substring(p_object.indexOf("=") + 1);
returnBy.tagName(newObjecyt);
}elseif(p_object.startsWith("name=")) {
newObjecyt=p_object.substring(p_object.indexOf("=") + 1);
returnBy.name(newObjecyt);
}else
returnnull;
}
}
5、通过以上方式,最后利用接口保存页面元素,进行调用接口中的方法获取到页面元素信息,实现脚本分离。
publicclassTest2extendsWebDriverLib{
publicstaticvoidmain(String[]args) {
driver=newFirefoxDriver();
driver.get("https://worktile.com/signin");
driver.findElement(parseObject(PageObjectStore.loginName)).sendKeys("test");
driver.findElement(parseObject(PageObjectStore.PWD)).sendKeys("lp2010520334455");
driver.findElement(parseObject(PageObjectStore.loginButton)).click();
driver.quit();
}
}
可以看出:parseObject(PageObjectStore.loginName))这种方式从接口中读取页面元素信息,即使后期出现页面元素信息变动,只需要修改接口中的变量即可,而且只修改一次。