Selenium Webdriver实现BKredcoil website 账户自动登录

来源:互联网 发布:儿童模式软件下载 编辑:程序博客网 时间:2024/06/03 16:24

Selenium Webdriver实现BKredcoil website 账户自动登录(一)

一、项目结构:


(1)base包:用来存放元素对象,将测试的元素对象插入数据库中保存,好用来做为测试用例维护。

ObjectTest.java

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. package com.annie.base;  
  2.   
  3. import java.util.Date;  
  4.   
  5. public class ObjectTest {  
  6.     private int id;  
  7.     private String website;  
  8.     private String page;  
  9.     private String area;  
  10.     private String object_type;  
  11.     private String object_key_type;  
  12.     private String object_pagename;  
  13.     private String object_key;  
  14.     private String description;  
  15.     private String status;  
  16.     private Date createtime;  
  17.     private String createuser;  
  18.     private Date updatetime;  
  19.     private String updateuser;  
  20.     private Date deletetime;  
  21.     private String deleteuser;  
  22.     //后面省去get/set方法   
  23.       
  24.   
  25. }  
(2)util包:用来存放工具类,比如ExelData这样的工具类

(注意1.exel测试数据文档的路径;2.exel测试数据文档名;3.exel测试数据文档的testcase名,即sheet名)

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. package com.annie.util;  
  2.   
  3. import java.io.File;  
  4. import java.util.Iterator;  
  5. import java.util.Map;  
  6. import java.util.TreeMap;  
  7. import java.util.regex.Matcher;  
  8. import jxl.*;  
  9.   
  10. public class ExcelData implements Iterator<Object[]> {  
  11.     private Workbook book = null;  
  12.     private Sheet sheet = null;  
  13.     private int rowNum = 0;  
  14.     private int curRowNo = 0;  
  15.     private int columnNum = 0;  
  16.     private String[] columnnName;  
  17.   
  18.     public ExcelData(String filepath, String casename) {  
  19.         try {  
  20.             File directory = new File(".");  
  21.             String ss = "open.anniewang.exceldata.";  
  22.             book = Workbook.getWorkbook(new File(directory.getCanonicalPath()  
  23.                     + "\\resources\\"  
  24.                     + ss.replaceAll("\\.", Matcher.quoteReplacement("\\"))  
  25.                     + filepath + ".xls"));  
  26.             this.sheet = book.getSheet(casename);  
  27.             this.rowNum = sheet.getRows();  
  28.   
  29.             Cell[] c = sheet.getRow(0);  
  30.             this.columnNum = c.length;  
  31.             columnnName = new String[c.length];  
  32.             for (int i = 0; i < c.length; i++) {  
  33.                 columnnName[i] = c[i].getContents().toString();  
  34.             }  
  35.             this.curRowNo++;  
  36.   
  37.         } catch (Exception e) {  
  38.             e.printStackTrace();  
  39.         }  
  40.     }  
  41.   
  42.     @Override  
  43.     public boolean hasNext() {  
  44.   
  45.         if (this.rowNum == 0 || this.curRowNo >= this.rowNum) {  
  46.             try {  
  47.                 book.close();  
  48.             } catch (Exception e) {  
  49.                 e.printStackTrace();  
  50.             }  
  51.             return false;  
  52.         } else  
  53.             return true;  
  54.     }  
  55.   
  56.     @Override  
  57.     public Object[] next() {  
  58.   
  59.         Cell[] c = sheet.getRow(this.curRowNo);  
  60.         Map<String, String> s = new TreeMap<String, String>();  
  61.         for (int i = 0; i < this.columnNum; i++) {  
  62.             String temp = "";  
  63.             try {  
  64.                 temp = c[i].getContents().toString();  
  65.             } catch (ArrayIndexOutOfBoundsException ex) {  
  66.                 temp = "";  
  67.             }  
  68.             s.put(this.columnnName[i], temp);  
  69.         }  
  70.   
  71.         Object r[] = new Object[1];  
  72.         r[0] = s;  
  73.         this.curRowNo++;  
  74.         return r;  
  75.     }  
  76.   
  77.     @Override  
  78.     public void remove() {  
  79.         throw new UnsupportedOperationException("remove unsupported.");  
  80.     }  
  81. }  

(3)testng包:用来存放公共的方法实现“高内聚,低耦合”的初衷(需要后面完善)
[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. package com.annie.testng;  
  2.   
  3. import java.util.Iterator;  
  4. import java.util.concurrent.TimeUnit;  
  5.   
  6. import org.openqa.selenium.By;  
  7. import org.openqa.selenium.WebDriver;  
  8. import org.openqa.selenium.WebElement;  
  9. import org.openqa.selenium.chrome.ChromeDriver;  
  10. import org.openqa.selenium.firefox.FirefoxDriver;  
  11. import org.testng.Assert;  
  12. import org.testng.annotations.BeforeTest;  
  13. import org.testng.annotations.DataProvider;  
  14. import org.testng.annotations.Parameters;  
  15. import org.testng.annotations.Test;  
  16.   
  17. import com.annie.util.ExcelData;  
  18.   
  19. ;  
  20.   
  21. public class TestNG {  
  22.     private WebDriver driver;  
  23.   
  24.     @Parameters({ "browser" })  
  25.     @BeforeTest  
  26.     public void setupBrowser(String browser) {  
  27.         if (browser.equals("firefox")) {  
  28.             driver = new FirefoxDriver();  
  29.         } else {  
  30.   
  31.             driver = new ChromeDriver();  
  32.         }  
  33.   
  34.     }  
  35.   
  36.     @Parameters({ "url""keyword" })  
  37.     @Test  
  38.     public void search(String url, String keyword) {  
  39.         driver.get(url);  
  40.         WebElement element = driver.findElement(By.name("q"));  
  41.         element.sendKeys(keyword);  
  42.         element.submit();  
  43.         Assert.assertTrue(driver.getTitle().contains(keyword),  
  44.                 "Title is  wrong!");  
  45.     }  
  46.   
  47.     // 传入登录用户名、密码,获取元素,验证空用户/密码登录  
  48.     @Parameters({ "url""login_name_txtUserName""login_name_txtPwd",  
  49.             "login_name_btnLogin" })  
  50.     // 参数: URL、用户名name、密码name、登陆按钮name   
  51.     @Test(groups = { "login" })  
  52.     public void login_username_empty(String login_name_txtUserName,  
  53.             String login_name_txtPwd, String login_name_btnLogin)  
  54.             throws Exception {  
  55.         System.out.print("login_username_empty");  
  56.         driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);  
  57.         driver.findElement(By.name(login_name_txtUserName)).clear();  
  58.         driver.findElement(By.name(login_name_txtPwd)).clear();  
  59.         driver.findElement(By.name(login_name_txtUserName)).sendKeys("");  
  60.         driver.findElement(By.name(login_name_txtPwd)).sendKeys("");  
  61.         driver.quit();  
  62.     }  
  63.   
  64.   
  65. }  

(4)testcase包:用来存放编写的测试用例

LoginTest.java

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. package com.annie.testcase;  
  2.   
  3. import java.util.Iterator;  
  4. import java.util.Map;  
  5. import java.util.Set;  
  6.   
  7. import java.util.concurrent.TimeUnit;  
  8.   
  9. import org.openqa.selenium.By;  
  10. import org.openqa.selenium.WebDriver;  
  11. import org.openqa.selenium.firefox.FirefoxDriver;  
  12. import org.testng.annotations.DataProvider;  
  13. import org.testng.annotations.Test;  
  14.   
  15. import com.annie.testng.TestNG;  
  16. import com.annie.util.ExcelData;  
  17.   
  18. public class LoginTest {  
  19.   
  20.     private WebDriver driver;  
  21.     private String username, password;  
  22.   
  23.     TestNG tn = new TestNG();  
  24.   
  25.     @DataProvider(name = "accounts")  
  26.     // 登录用户的账户Excel,返回的是Object数组   
  27.     public Iterator<Object[]> data() throws Exception {  
  28.         return (Iterator<Object[]>) new ExcelData("accounts_login""testA");  
  29.   
  30.     }  
  31.   
  32.     public void prmap(Map<String, String> arr) {  
  33.         driver = new FirefoxDriver();  
  34.         driver.get("http://10.0.0.88:8080/bkredcoil/index.html");  
  35.   
  36.         driver.manage().timeouts().implicitlyWait(500, TimeUnit.SECONDS);  
  37.         driver.findElement(By.id("username")).clear();  
  38.         driver.findElement(By.id("password")).clear();  
  39.   
  40.         Set<String> set = arr.keySet();  
  41.         Iterator<String> it = set.iterator();  
  42.   
  43.         while (it.hasNext()) {  
  44.             String s = (String) it.next();  
  45.             if (s.equals("Email")) {  
  46.                 username = arr.get(s);  
  47.             } else {  
  48.                 password = arr.get(s);  
  49.             }  
  50.             System.out.println(arr.get(s));  
  51.   
  52.             driver.findElement(By.id("username")).sendKeys(username);  
  53.             driver.findElement(By.id("password")).sendKeys(password);  
  54.             driver.findElement(By.id("btn-login")).click();  
  55.             driver.manage().timeouts().implicitlyWait(500, TimeUnit.SECONDS);  
  56.             //driver.quit();   
  57.         }  
  58.   
  59.     }  
  60.   
  61.     // 写一个类似prmap的方法,将Map类型的exel数据传入,并在指定的URL进行登录,将Map中的Email和password 做参数传入登陆即可  
  62.   
  63.     @Test(dataProvider = "accounts")  
  64.     public void ts(Map<String, String> data) throws Exception {  
  65.   
  66.         this.prmap(data);  
  67.   
  68.         // 每次打印一组account,则调用登录用例   
  69.   
  70.         System.out.println("=====over=====");  
  71.         System.out.println("");  
  72.     }  
  73.   
  74. }  

testng.xml
[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <suite name="Suite" parallel="false">  
  3.    <test name="LoginTest" preserve-order="true">  
  4.     <classes>  
  5.       <class name="com.annie.testcase.LoginTest"/>  
  6.     </classes>  
  7.   </test> <!-- Test -->  
  8. </suite> <!-- Suite -->  
build.xml
[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <project name="TestNGTest" default="testoutput" basedir=".">    
  2.     <!-- Define <testng> task -->    
  3.     <taskdef name="testng" classname="org.testng.TestNGAntTask">    
  4.         <classpath>    
  5.             <pathelement location="lib/testng-6.8.jar" />    
  6.         </classpath>    
  7.     </taskdef>    
  8.     <property name="testoutputdir" location="test-output" />    
  9.     <property name="srcdir" location="src" />    
  10.     <property name="libdir" location="lib" />    
  11.     <property name="full-compile" value="true" />    
  12.     <property name="basedir" value="D:/workspace/BKRedcoil_TestCase/" />    
  13.     
  14.     <path id="classpath.test">    
  15.         <fileset dir="${libdir}">    
  16.             <include name="**/*.jar" />    
  17.         </fileset>    
  18.         <pathelement location="${testoutputdir}" />    
  19.         <pathelement location="${srcdir}" />    
  20.     
  21.     </path>    
  22.     <target name="clean">    
  23.         <delete dir="${basedir}/bin" />    
  24.     
  25.     </target>    
  26.     
  27.     <target name="compile" depends="clean">    
  28.         <mkdir dir="${basedir}/bin" />    
  29.         <javac srcdir="${srcdir}" encoding="UTF-8" destdir="${basedir}/bin" verbose="${full-compile}" classpathref="classpath.test" includeantruntime="off" debug="on" debuglevel="lines,vars,source" />    
  30.     
  31.     </target>    
  32.     
  33. <path id="classes">    
  34.     <fileset dir="${libdir}" includes="*jar"/>    
  35.     <fileset dir="${libdir}" includes="*zip"/>    
  36.     <pathelement location="${basedir}/bin/"/>    
  37.     
  38. </path>    
  39.     
  40.     <target name="runtest" depends="compile">    
  41.         <testng outputdir="${testoutputdir}" classpathref="classes" delegateCommandSystemProperties="true">    
  42.             <xmlfileset dir="${srcdir}" includes="testng.xml" />    
  43.         </testng>    
  44.     </target>    
  45.     
  46.     <target name="testoutput" depends="runtest">    
  47.         <xslt in="${testoutputdir}/testng-results.xml" style="${testoutputdir}/testng-results.xsl" out="${testoutputdir}/index.html ">    
  48.     
  49.             <param name="testNgXslt.outputDir" expression="D:/workspace/BKRedcoil_TestCase/test-output/" />    
  50.     
  51.             <classpath refid="classpath.test" />    
  52.     
  53.         </xslt>    
  54.     
  55.     </target>    
  56. </project>    
则执行后,会不断打开页面进行exel表格中的账户登录accounts_login.xls





测试报告在test-output文件夹中生成

打开默认生成的测试报告(后面会美化测试报告)


从测试的ExelData数据中可以看到有26组账户数据,其中25个pass,1个fail,原因是我在运行过程中手动kill了一个browser导致remote browser. It may have died.

这些可以在report报告中查看到。(未完待续)


0 0
原创粉丝点击