一、测试登录功能实现

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

 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. 【pyecharts】地图显示不全

    官网给的解释如下: 自从 0.3.2 开始,为了缩减项目本身的体积以及维持 pyecharts 项目的轻量化运行,pyecharts 将不再自带地图 js 文件. 如用户需要用到地图图表,可自行安装对 ...

  2. JVM中的垃圾收集

    引用计数(Reference Counting) 循环引用问题 标记­清除(Mark and Sweep) 内存池(Memory Pools) Eden 是内存中的一个区域, 用来分配新创建的对象 . ...

  3. sql-分组查询

    分组查询: 关键字:group by 可以将查询结果分组,并返回行的汇总信息 注意: 1.出现在select后面的字段 要么是是聚合函数中的,要么就是group by 中的 2.要筛选结果 可以先使用 ...

  4. 百度前端技术学院2018笔记 之 利用 CSS animation 制作一个炫酷的 Slider

    前言 题目地址 利用 CSS animation 制作一个炫酷的 Slider 思路整理 首先页面包含三种东西 一个是type为radio的input其实就是单选框 二是每个单选框对应的label 三 ...

  5. Java的字节流,字符流和缓冲流对比探究

    目录 一.前言 二.字节操作和字符操作 三.两种方式的效率测试 3.1 测试代码 3.2 测试结果 3.3 结果分析 四.字节顺序endian 五.综合对比 六.总结 一.前言 所谓IO,也就是Inp ...

  6. webpack+vue2.0项目 (二)热加载,vue-router

    目录创建好之后,命令行输入 npm run dev 因为在配置文件config/index.js里: dev: { env: require('./dev.env'), port: 8080, aut ...

  7. Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)

    ** 算法训练 字符串的展开 ** 题目: 在初赛普及组的"阅读程序写结果"的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于"d-h" ...

  8. Java实现 LeetCode 面试题13. 机器人的运动范围(DFS)

    面试题13. 机器人的运动范围 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一格(不能移动 ...

  9. Java实现 LeetCode 636 函数的独占时间(栈)

    636. 函数的独占时间 给出一个非抢占单线程CPU的 n 个函数运行日志,找到函数的独占时间. 每个函数都有一个唯一的 Id,从 0 到 n-1,函数可能会递归调用或者被其他函数调用. 日志是具有以 ...

  10. Java实现 LeetCode 451 根据字符出现频率排序

    451. 根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入: "tree" 输出: "eert" 解释: 'e ...