今天使用WebDriver对服务端后台进行一个初步访问,实现登录、菜单跳转和数据初步判断的小功能。
服务端使用EXTJS的技术自动生成HTML,这种架构非常的不适合自动化测试,定位元素非常的困难。不过今天我们只是进行一下小尝试,不涉及深入的知识。
好了,废话不说了,上代码
1 package com.xws.support.ly; 2 3 import org.openqa.selenium.By; 4 import org.openqa.selenium.WebDriver; 5 import org.openqa.selenium.WebElement; 6 import org.openqa.selenium.chrome.ChromeDriver; 7 8 public class Login { 9 private String userName = ""; 10 private String passWord = ""; 11 private String identifying = ""; 12 private String url = ""; 13 WebDriver driver = new ChromeDriver(); 14 WebElement user = null; 15 WebElement pass=null; 16 WebElement identifyingcode = null; 17 18 19 Login(String userName,String PassWord,String identifying,String url){ 20 this.userName= userName; 21 this.passWord = PassWord; 22 this.identifying = identifying; 23 this.url = url; 24 } 25 26 public WebDriver SystemLogin(){ 27 //通过chrome打开测试地址 28 driver.get("http://172.23.69.144:8888/management/login.jsp"); 29 30 //通过By.name方法获取登录名、密码、验证码元素 31 user = driver.findElement(By.name("userName")); 32 pass = driver.findElement(By.name("password")); 33 identifyingcode = driver.findElement(By.name("yzm")); 34 35 //将登录名、密码、验证码文本框清空 36 user.clear(); 37 pass.clear(); 38 identifyingcode.clear(); 39 40 //输入登录名、密码、验证码 41 user.sendKeys(userName); 42 pass.sendKeys(passWord); 43 identifyingcode.sendKeys(identifying); 44 45 //进行登录 46 driver.findElement(By.xpath("//a[contains(@href,'login')]")).click(); 47 48 return driver; 49 } 50 }
上述代码完成了页面登录的操作(验证码这里我更改了servlet,输入任意的字符都验证通过)
1 public class OpenMenu { 2 3 WebElement menuUrl=null; 4 List<WebElement> list = null; 5 6 public void getMenu(WebDriver driver,String menuText){ 7 //将所有的tree图片元素放入list中 8 list = driver.findElements(By.cssSelector("img.x-tree-elbow-img.x-tree-elbow-plus.x-tree-expander")); 9 10 //循环list,将所有菜单全部展开 11 for(int i=0;i<list.size();i++){ 12 13 try { 14 //这里讲每次展开菜单做一个等待,以避免菜单未加载完成导致异常 15 Thread.sleep(1000); 16 } catch (InterruptedException e) { 17 e.printStackTrace(); 18 } 19 list.get(i).click(); 20 } 21 try{ 22 //在这里捕获一下未找到菜单的异常,如果没找到这个菜单,则提示菜单无法找到 23 driver.findElement(By.xpath("//span[text()='" + menuText + "']/parent::div")).click(); 24 }catch(NoSuchElementException e){ 25 System.out.println("对不起,这个菜单无法找到: " + menuText); 26 e.printStackTrace(); 27 } 28 } 29 }
上述代码完成了展开所有菜单,并跳转到相应菜单的操作
1 public class ContrastData { 2 WebDriver driver = null; 3 List<WebElement> list = null; 4 JavascriptExecutor jse=(JavascriptExecutor)driver; 5 String term = ""; 6 7 ContrastData(WebDriver driver,String term){ 8 this.driver=driver; 9 this.term= term; 10 } 11 12 public void DataContrast(){ 13 //这里通过调用JS的方式,将name为term的下拉条进行点击(这里不是select) 14 jse.executeScript("window.document.getElementsByName('"+term+"')[0].click()"); 15 16 try { 17 //设置等待时间,等待隐藏元素展示完整 18 Thread.sleep(2000); 19 } catch (InterruptedException e) { 20 e.printStackTrace(); 21 } 22 //用XPATH匹配已展示的lable元素,当text为对应值时,进行单击选择 23 driver.findElement(By.xpath("//*[text()='审核成功']")).click(); 24 /* 25 * 通过BYID方式,找到检索图片,并进行click 26 * 这里我要说明一下,这个并非button元素,所以不是submit 27 * 这个元素是动态加载,不能直接用byid方式,我在这里只是为了做而做,实际项目中不能用动态加载的ID来定位元素 28 */ 29 driver.findElement(By.id("button-1108-btnIconEl")).click(); 30 try { 31 //设置等待时间,等待检索结果展示完整 32 Thread.sleep(2000); 33 } catch (InterruptedException e) { 34 e.printStackTrace(); 35 } 36 //将显示出来的审核状态元素,全部放入list中 37 list = driver.findElements(By.cssSelector("div.x-grid-cell-inner")); 38 boolean test = true; 39 for(int i=0;i<list.size();i++){ 40 41 //遍历判断,如果有状态为非审核成功的,则测试不通过 42 if(!(list.get(i).equals("审核成功"))){ 43 test=false; 44 } 45 } 46 if(!test){ 47 System.out.println("测试不通过"); 48 }else{ 49 System.out.println("测试通过"); 50 } 51 } 52 }
上述代码已经完成了一个简单的case,可以看到 我们检查通过‘审核成功’状态检索的数据是否都是审核成功的,如果是则打印通过,否则打印不通过。
好了,这只是个玩具code,真实的自动化平台,对元素定位,用例执行,结果输出全部需要进行封装,而不是像这样写,非常难以维护。