一、测试登录功能实现

     以慕课网的登录为例,分析登录的功能需求,编写测试用例,找到要定位的元素以及需要的操作,编写登录功能的测试代码。代码实现如下:

1 public static void main(String[] args) throws InterruptedException {   
 2         System.setProperty("webdriver.gecko.driver","c:\\Program Files\\Mozilla Firefox\\geckodriver.exe");
 3         WebDriver driver=new FirefoxDriver();
 4         driver.get("https://www.imooc.com");
 5         driver.manage().window().setSize(new Dimension(1456,876));//设置窗口的尺寸
 6         driver.findElement(By.id("js-signin-btn")).click();//点击登录按钮
 7         Thread.sleep(2000);


10         driver.findElement(By.name("email")).sendKeys("*********");
12         driver.findElement(By.name("password")).sendKeys("******");
13         
14         driver.findElement(By.cssSelector(".moco-btn")).click();
15         Thread.sleep(2000);
16      
17         Actions a=new Actions(driver);//鼠标移动,perform()执行所有Actions中存储的行为,可以理解成对整个操作事件的提交动作。
18         a.moveToElement(driver.findElement(By.cssSelector("#header-avator>img"))).perform();
19         
20         String s=driver.findElement(By.className("name")).getText();//获取标签属性
21         String t=driver.getTitle();
22         String v=driver.getCurrentUrl();
23         System.out.println(s+t+v);
24         assertEquals(s,"搁浅的青木");  //验证失败时该测试将停止。vertify:失败时,该测试将继续执行,并将错误记入日显示屏。Waitfor用于等待某些条件变为真。可用于AJAX应用程序的测试。
25         if(s.equals("搁浅的青木")) {
26             System.out.println("登陆成功,请退出");
27             driver.findElement(By.linkText("安全退出")).click();
28         }else {
29             System.out.println("登录失败");
30         }
31         driver.quit();    
32     }

二、代码重构之封装findElement()方法

    1.提取参数,包括:输入信息、定位属性、定位属性值

     2.封装findElement()方法

1 public class moocloginOne {
 2     public WebDriver driver;
 3     public void initDriver() throws InterruptedException {
 4         System.setProperty("webdriver.gecko.driver","c:\\Program Files\\Mozilla Firefox\\geckodriver.exe");
 5         driver=new FirefoxDriver();
 6         driver.get("https://www.imooc.com");
 7         driver.manage().window().setSize(new Dimension(1456,876));//设置窗口的尺寸
 8         Thread.sleep(3000);
 9         
10         driver.findElement(By.id("js-signin-btn")).click();
11     }
12     
13     public void loginScript() throws InterruptedException {
14         this.initDriver();
15         Thread.sleep(3000);
16         //1.提取定位参数,提高代码可用性
17         String userBy="name";
18         String userLocal="email";
19         String passowrdBy="name";
20         String PasswordLocal="password";
21         String loginbtnBy="cssSelector";
22         String loginbtnLocal=".moco-btn";
23         String userInfo="17839196010";
24         String passwordInfo="duhui619";
25         String userImgBy="cssSelector";
26         String userImgLocal="#header-avator>img";
27         String usernameBy="className";
28         String usernameLocal="name";
29         String usernameInfo="搁浅的青木";    
30         WebElement user=element(userBy,userLocal);
31         user.isDisplayed();
32         WebElement password=element(passowrdBy,PasswordLocal);
33         password.isDisplayed();
34         WebElement button=element(loginbtnBy,loginbtnLocal);
35         button.isDisplayed();        
36         user.sendKeys(userInfo);
37         password.sendKeys(passwordInfo);
38         button.click();
39         Thread.sleep(2000);
40         WebElement header=element(userImgBy,userImgLocal);
41         header.isDisplayed();
42         Actions a=new Actions(driver);
43         a.moveToElement(header).perform();
44         String s=element(usernameBy,usernameLocal).getText();
45         if(s.equals(usernameInfo)) {
46             System.out.println("登陆成功,请退出");
47         }else {
48             System.out.println("登录失败");
49         }
50         driver.quit();        
51     }
52     
53     //2.封装driver.findElement( By.id(local))
54      public WebElement element(String by,String local) {
55          WebElement element=null;
56          if(by.equals("id")) {
57             element=driver.findElement( By.id(local));
58          }else if(by.equals("name")) {
59             element=driver.findElement( By.name(local));
60          }else if(by.equals("className")) {
61             element=driver.findElement( By.className(local));
62          }else if(by.equals("linkText")) {
63             element=driver.findElement( By.linkText(local));
64          }else if(by.equals("xpath")) {
65             element=driver.findElement( By.xpath(local));
66          }else if(by.equals("cssSelector")) {
67             element=driver.findElement( By.cssSelector(local));
68          }else if(by.equals("tageName")){
69             element=driver.findElement( By.tagName(local));
70          }else {
71             element=driver.findElement( By.partialLinkText(local));
72          }
73          return element;
74      }    
75 
76     public static void main(String[] args) throws InterruptedException {
77         moocloginOne login=new   moocloginOne();
78         Thread.sleep(2000);
79         login.loginScript();
80     }

三、代码重构之封装读取配置文件的方法

   1.拆分findElement方法为by方法和element方法

   2.修改byStr函数中的代码,只返回by的方式 。
   3.将变量放到配置文件中,并编写读取文件类及方法-----ProUtil类。
   4.编写读取配置文件函数-----调用ProUtil类,读取配置文件。
   5.在byStr函数中调用读取文件函数--getproperties(),并修改byStr传入参数。

主函数:

1 public class moocloginTwo {
 2      public WebDriver driver;
 3         public void initDriver() throws InterruptedException {
 4             System.setProperty("webdriver.gecko.driver","c:\\Program Files\\Mozilla Firefox\\geckodriver.exe");
 5             driver=new FirefoxDriver();
 6             driver.get(this.getproperties("Url"));
 7             driver.manage().window().setSize(new Dimension(1456,876));//设置窗口的尺寸
 8             Thread.sleep(3000);
 9             element(this.byStr("closeLocal")).click();    
10             element(this.byStr("loginLocal")).click();
11         }
12         
13         public void loginScript() throws InterruptedException {
14             this.initDriver();
15             Thread.sleep(3000);        
16            //3.将变量放到配置文件中,并编写读取文件类及方法-----ProUtil类
17             WebElement user=this.element(this.byStr("userLocal"));
18             user.isDisplayed();
19         
20             WebElement password=this.element(this.byStr("PasswordLocal"));
21             password.isDisplayed();
22     
23             WebElement button=this.element(this.byStr("loginbtnLocal"));
24             button.isDisplayed();
25             user.sendKeys(this.getproperties("userInfo"));
26             password.sendKeys(this.getproperties("passwordInfo"));
27             button.click();
28             Thread.sleep(3000);
29             
30             WebElement header=this.element(this.byStr("userImgLocal"));
31             header.isDisplayed();
32             Actions a=new Actions(driver);
33             a.moveToElement(header).perform();
34             Thread.sleep(3000);
35         
36             String s=this.element(this.byStr("usernameLocal")).getText();//获取标签属性
37             System.out.println(s);
38         
39             if(s.equals(this.getproperties("usernameInfo"))) {
40                 System.out.println("登陆成功,请退出");
41                 this.element(this.byStr("logOut")).click();
42             }else {
43                 System.out.println("登录失败");
44             }
45             //driver.quit();        
46         }
47         
48          public By byStr(String local) {
49             //5.在byStr函数中调用读取文件函数--getproperties(),并修改byStr传入参数
50              String locator=this.getproperties(local);
51              String locatorType=locator.split(">")[0];
52              String locatorValue=locator.split(">")[1];
53             //2.修改byStr函数中的代码,只返回by的方式    
54              if(locatorType.equals("id")) {             
55                 return By.id(locatorValue);
56              }else if(locatorType.equals("name")) {
57                 return By.name(locatorValue);
58              }else if(locatorType.equals("className")) {
59                 return By.className(locatorValue);
60              }else if(locatorType.equals("linkText")) {
61                 return By.linkText(locatorValue);
62              }else if(locatorType.equals("xpath")) {
63                 return By.xpath(locatorValue);
64              }else if(locatorType.equals("cssSelector")) {
65                 return By.cssSelector(locatorValue);
66              }else if(locatorType.equals("tageName")){
67                 return By.tagName(locatorValue);
68              }else {
69                 return By.partialLinkText(locatorValue);
70              }
71 
72          }
73         //1.封装 driver.findElenment(),编写element函数————将byStr函数中的 driver.findElenment()与by.方式()拆开
74          public WebElement element(By location) {
75              return driver.findElement(location);
76          }
77          //4.编写读取配置文件函数-----调用ProUtil类,读取配置文件
78          public String getproperties(String local) {
79              ProUtil properties=new ProUtil("E:\\eclipse\\workspace\\mypro\\src\\mooc\\day01\\element.properties");
80              String locator=properties.getPro(local);
81              return locator;
82          }
83         public static void main(String[] args) throws InterruptedException {
84         
85             moocloginTwo login=new  moocloginTwo();
86             login.loginScript();
87         }
88 }

读取配置文件函数:

1 public class ProUtil {
 2     private Properties properties;
 3     private String filePath;
 4     public ProUtil(String filePath) {
 5         this.filePath=filePath;
 6         this.properties=readProperties();
 7     }
 8     
 9     public Properties readProperties() {
10         Properties pro=new Properties();    
11         try {
12         InputStreamReader inputstream=new InputStreamReader(new FileInputStream(filePath),"UTF-8" );//考虑到编码格式
13         BufferedReader in=new BufferedReader(inputstream);
14         pro.load(in);    
15         } catch (IOException e) {
16             e.printStackTrace();
17         }
18         return pro;
19         
20     }
21     
22     public String getPro(String key) {
23         
24         if(properties.containsKey(key)) {
25         String value=properties.getProperty(key);
26         return value;
27     }else {
28         System.out.println("获取的键值不对");
29         return "  ";
30     }
31       
32     }
33 }

配置文件:

1 #-----------登录页面元素部分:----------
 2 #登录网址
 3 Url=https://www.imooc.com
 4 #登录连接的位置
 5 loginLinkLocal=id>js-signin-btn
 6 #输入登录账号
 7 userLocal=name>email
 8 #输入登录密码
 9 PasswordLocal=name>password
10 #点击登录按钮
11 loginbtnLocal=cssSelector>.moco-btn
12 #个人头像
13 userImgLocal=cssSelector>#header-avator
14 #个人用户名
15 usernameLocal=className>name
16 #安全退出
17 logOut=linkText>安全退出
18 #--------登录参数部分:--------
19 #登录账号
20 userInfo=*********
21 #登录密码
22 passwordInfo=*******
23 #用于比对的用户名
24 usernameInfo=搁浅的青木