一、测试登录功能实现

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

 public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.gecko.driver","c:\\Program Files\\Mozilla Firefox\\geckodriver.exe");
WebDriver driver=new FirefoxDriver();
driver.get("https://www.imooc.com");
driver.manage().window().setSize(new Dimension(1456,876));//设置窗口的尺寸
driver.findElement(By.id("js-signin-btn")).click();//点击登录按钮
Thread.sleep(2000); driver.findElement(By.name("email")).sendKeys("*********");
driver.findElement(By.name("password")).sendKeys("******"); driver.findElement(By.cssSelector(".moco-btn")).click();
Thread.sleep(2000); Actions a=new Actions(driver);//鼠标移动,perform()执行所有Actions中存储的行为,可以理解成对整个操作事件的提交动作。
a.moveToElement(driver.findElement(By.cssSelector("#header-avator>img"))).perform(); String s=driver.findElement(By.className("name")).getText();//获取标签属性
String t=driver.getTitle();
String v=driver.getCurrentUrl();
System.out.println(s+t+v);
assertEquals(s,"搁浅的青木"); //验证失败时该测试将停止。vertify:失败时,该测试将继续执行,并将错误记入日显示屏。Waitfor用于等待某些条件变为真。可用于AJAX应用程序的测试。
if(s.equals("搁浅的青木")) {
System.out.println("登陆成功,请退出");
driver.findElement(By.linkText("安全退出")).click();
}else {
System.out.println("登录失败");
}
driver.quit();
}

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

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

2.封装findElement()方法

 public class moocloginOne {
public WebDriver driver;
public void initDriver() throws InterruptedException {
System.setProperty("webdriver.gecko.driver","c:\\Program Files\\Mozilla Firefox\\geckodriver.exe");
driver=new FirefoxDriver();
driver.get("https://www.imooc.com");
driver.manage().window().setSize(new Dimension(1456,876));//设置窗口的尺寸
Thread.sleep(3000); driver.findElement(By.id("js-signin-btn")).click();
} public void loginScript() throws InterruptedException {
this.initDriver();
Thread.sleep(3000);
//1.提取定位参数,提高代码可用性
String userBy="name";
String userLocal="email";
String passowrdBy="name";
String PasswordLocal="password";
String loginbtnBy="cssSelector";
String loginbtnLocal=".moco-btn";
String userInfo="17839196010";
String passwordInfo="duhui619";
String userImgBy="cssSelector";
String userImgLocal="#header-avator>img";
String usernameBy="className";
String usernameLocal="name";
String usernameInfo="搁浅的青木";
WebElement user=element(userBy,userLocal);
user.isDisplayed();
WebElement password=element(passowrdBy,PasswordLocal);
password.isDisplayed();
WebElement button=element(loginbtnBy,loginbtnLocal);
button.isDisplayed();
user.sendKeys(userInfo);
password.sendKeys(passwordInfo);
button.click();
Thread.sleep(2000);
WebElement header=element(userImgBy,userImgLocal);
header.isDisplayed();
Actions a=new Actions(driver);
a.moveToElement(header).perform();
String s=element(usernameBy,usernameLocal).getText();
if(s.equals(usernameInfo)) {
System.out.println("登陆成功,请退出");
}else {
System.out.println("登录失败");
}
driver.quit();
} //2.封装driver.findElement( By.id(local))
public WebElement element(String by,String local) {
WebElement element=null;
if(by.equals("id")) {
element=driver.findElement( By.id(local));
}else if(by.equals("name")) {
element=driver.findElement( By.name(local));
}else if(by.equals("className")) {
element=driver.findElement( By.className(local));
}else if(by.equals("linkText")) {
element=driver.findElement( By.linkText(local));
}else if(by.equals("xpath")) {
element=driver.findElement( By.xpath(local));
}else if(by.equals("cssSelector")) {
element=driver.findElement( By.cssSelector(local));
}else if(by.equals("tageName")){
element=driver.findElement( By.tagName(local));
}else {
element=driver.findElement( By.partialLinkText(local));
}
return element;
} public static void main(String[] args) throws InterruptedException {
moocloginOne login=new moocloginOne();
Thread.sleep(2000);
login.loginScript();
}

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

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

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

主函数:

 public class moocloginTwo {
public WebDriver driver;
public void initDriver() throws InterruptedException {
System.setProperty("webdriver.gecko.driver","c:\\Program Files\\Mozilla Firefox\\geckodriver.exe");
driver=new FirefoxDriver();
driver.get(this.getproperties("Url"));
driver.manage().window().setSize(new Dimension(1456,876));//设置窗口的尺寸
Thread.sleep(3000);
element(this.byStr("closeLocal")).click();
element(this.byStr("loginLocal")).click();
} public void loginScript() throws InterruptedException {
this.initDriver();
Thread.sleep(3000);
//3.将变量放到配置文件中,并编写读取文件类及方法-----ProUtil类
WebElement user=this.element(this.byStr("userLocal"));
user.isDisplayed(); WebElement password=this.element(this.byStr("PasswordLocal"));
password.isDisplayed(); WebElement button=this.element(this.byStr("loginbtnLocal"));
button.isDisplayed();
user.sendKeys(this.getproperties("userInfo"));
password.sendKeys(this.getproperties("passwordInfo"));
button.click();
Thread.sleep(3000); WebElement header=this.element(this.byStr("userImgLocal"));
header.isDisplayed();
Actions a=new Actions(driver);
a.moveToElement(header).perform();
Thread.sleep(3000); String s=this.element(this.byStr("usernameLocal")).getText();//获取标签属性
System.out.println(s); if(s.equals(this.getproperties("usernameInfo"))) {
System.out.println("登陆成功,请退出");
this.element(this.byStr("logOut")).click();
}else {
System.out.println("登录失败");
}
//driver.quit();
} public By byStr(String local) {
//5.在byStr函数中调用读取文件函数--getproperties(),并修改byStr传入参数
String locator=this.getproperties(local);
String locatorType=locator.split(">")[0];
String locatorValue=locator.split(">")[1];
//2.修改byStr函数中的代码,只返回by的方式
if(locatorType.equals("id")) {
return By.id(locatorValue);
}else if(locatorType.equals("name")) {
return By.name(locatorValue);
}else if(locatorType.equals("className")) {
return By.className(locatorValue);
}else if(locatorType.equals("linkText")) {
return By.linkText(locatorValue);
}else if(locatorType.equals("xpath")) {
return By.xpath(locatorValue);
}else if(locatorType.equals("cssSelector")) {
return By.cssSelector(locatorValue);
}else if(locatorType.equals("tageName")){
return By.tagName(locatorValue);
}else {
return By.partialLinkText(locatorValue);
} }
//1.封装 driver.findElenment(),编写element函数————将byStr函数中的 driver.findElenment()与by.方式()拆开
public WebElement element(By location) {
return driver.findElement(location);
}
//4.编写读取配置文件函数-----调用ProUtil类,读取配置文件
public String getproperties(String local) {
ProUtil properties=new ProUtil("E:\\eclipse\\workspace\\mypro\\src\\mooc\\day01\\element.properties");
String locator=properties.getPro(local);
return locator;
}
public static void main(String[] args) throws InterruptedException { moocloginTwo login=new moocloginTwo();
login.loginScript();
}
}

读取配置文件函数:

 public class ProUtil {
private Properties properties;
private String filePath;
public ProUtil(String filePath) {
this.filePath=filePath;
this.properties=readProperties();
} public Properties readProperties() {
Properties pro=new Properties();
try {
InputStreamReader inputstream=new InputStreamReader(new FileInputStream(filePath),"UTF-8" );//考虑到编码格式
BufferedReader in=new BufferedReader(inputstream);
pro.load(in);
} catch (IOException e) {
e.printStackTrace();
}
return pro; } public String getPro(String key) { if(properties.containsKey(key)) {
String value=properties.getProperty(key);
return value;
}else {
System.out.println("获取的键值不对");
return " ";
} }
}

配置文件:

 #-----------登录页面元素部分:----------
#登录网址
Url=https://www.imooc.com
#登录连接的位置
loginLinkLocal=id>js-signin-btn
#输入登录账号
userLocal=name>email
#输入登录密码
PasswordLocal=name>password
#点击登录按钮
loginbtnLocal=cssSelector>.moco-btn
#个人头像
userImgLocal=cssSelector>#header-avator
#个人用户名
usernameLocal=className>name
#安全退出
logOut=linkText>安全退出
#--------登录参数部分:--------
#登录账号
userInfo=*********
#登录密码
passwordInfo=*******
#用于比对的用户名
usernameInfo=搁浅的青木

0.1---selenium+java自动化测试进阶02----项目实战之登录代码重构的更多相关文章

  1. Java自动化测试框架-02 - TestNG之理论实践 - 纸上得来终觉浅,绝知此事要躬行(详细教程)

    理论 TestNG,即Testing, NextGeneration,下一代测试技术,是一套根据JUnit 和NUnit思想而构建的利用注释来强化测试功能的一个测试框架,即可以用来做单元测试,也可以用 ...

  2. Java自动化测试框架-02 - TestNG之理论到实践

    TestNG,即Testing, NextGeneration,下一代测试技术,是一套根据JUnit 和NUnit思想而构建的利用注释来强化测试功能的一个测试框架,即可以用来做单元测试,也可以用来做集 ...

  3. selenium+java破解极验滑动验证码的示例代码

    转自: https://www.jianshu.com/p/1466f1ba3275 selenium+java破解极验滑动验证码 卧颜沉默 关注 2017.08.15 20:07* 字数 3085  ...

  4. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十二) 代码重构使用反射工厂解耦(一)缓存切换

    前言 上一篇中,我们用了反射工厂来解除BLL和UI层耦合的问题.当然那是最简单的解决方法,再复杂一点的程序可能思路相同,但是在编程细节中需要考虑的就更多了,比如今天我在重构过程中遇到的问题.也是接下来 ...

  5. 0.1---selenium+java自动化测试进阶01---PageObject设计模式

    一.PageObject设计模式   1.简介 PageObject设计模式,又称页面对象模式,是使用Selenium的广大同行最为公认的一种设计模式.在设计测试时,把元素和方法按照页面抽象出来,分离 ...

  6. selenium java 自动化测试 基于火狐浏览器/谷歌浏览器

    :环境 java1.8+ieda 直接上代码 pom.xml <?xml version="1.0" encoding="UTF-8"?> < ...

  7. cumber + selenium +java自动化测试

    1.新建一个maven项目,pom文件为: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&quo ...

  8. Selenium+Java自动化测试的方法

    1.设置等待时间Thread.sleep(2000); (1000代表1s)2.断言assertion:验证应用程序的状态是否同所期望的一致.常见的断言包括:验证页面内容,如标题是否为X或当前位置是否 ...

  9. Java自学基础、进阶、项目实战网站推荐

    推荐一个自学的好平台,有Java基础,前端,后端,基础的内容都有讲解,还有框架的讲解和实战项目,特别适合自学 JAVA 自学网站 JAVA 练习题 Spring 教程 Mybatis 教程 Sprin ...

随机推荐

  1. Java——Json字符串与Object互转

    public static void JacksonTest() {//推荐 //{"MNG001":[{"ID":"1","PW ...

  2. PHP实现插入100万条数据优化

    第一种方法一条一条执行插入,结果会很慢 <?php header("Content-Type:text/html;charset=utf-8"); date_default_ ...

  3. IO流基础,创建File对象与方法是用

    1.io流主要用途读取本地文件或服务器文件,进行本地或者服务器开呗工作 构造函数   绝对路径够构造方法:    File f = new File("D:\\test\\a.txt&quo ...

  4. Java IO(八) PipedInputStream 和 PipedOutputStream

    Java IO(八) PipedInputStream 和 PipedOutputStream 一.介绍 PipedInputStream 和 PipedOutputStream 是管道输入流和管道输 ...

  5. Springboot 内置tomcat 基本配置收集整理

    配置一: server:# tomcat 配置  tomcat:    # 接收队列长度    accept-count: 1000    # 最小空闲线程数    min-spare-threads ...

  6. SpringCloud Netflix (六):Config 配置中心

    ------------恢复内容开始------------ SpringCloud Config 配置中心 Config 配置中心 Spring Cloud Config为分布式系统中的外部化配置提 ...

  7. Rocket - tilelink - TLArbiter

    https://mp.weixin.qq.com/s/0ob-Fq-ZOoj-_S7pTJu6rQ   介绍TLArbiter的实现,主要关注如何实现burst的多个beat的输出.   ​​   1 ...

  8. Rocket - diplomacy - DUEB参数模型分析

    https://mp.weixin.qq.com/s/533bJxcPRgO4W2gf_OEhEw   分析DUEB参数模型中各种参数类型的可能性.     1. 节点类型   根据参数的传播方向,可 ...

  9. 使用turtle库绘制奥运五环

    import turtle as t t.setup(600,600,50,50) t.pensize(3) t.pencolor("red") t.penup() t.pendo ...

  10. (Java实现)洛谷 P1093 奖学金

    题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高 ...