一、测试登录功能实现

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

 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. nginx四种均衡策略

    1.基于轮询的均衡策略: 轮询嘛,就是说对进到nginx的request按照遍历的方式进行分发,如果request 1 分发到 Server A,那么request 2将被分发到 Server B,. ...

  2. Ubuntu 18.04上交叉编译华硕路由器RT-AC88U的梅林384.15版本

    研究了半天官方wiki上的文档,最后却找到这个一键脚本.手动试了一下,丝般顺滑,成功编译出RT-AC88U的梅林固件384.15版本.也可以编译其他路由器型号的固件. 不过这个脚本比较暴力,上来就把/ ...

  3. UIAutomator2安装及连接

    记录一下自己的偿试过程,内容来自:https://github.com/openatx/uiautomator2 d.service("uiautomator").stop()是因 ...

  4. ATX插件机制-学习学习

    添加插件:记录一下 https://testerhome.com/topics/16074 webview操作: https://testerhome.com/topics/12599

  5. 要小心 JavaScript 的事件代理

    我们知道,如果给 form 里面的 button 元素绑定事件,需要考虑它是否会触发 form 的 submit 行为.除此之外,其它场合给 button 元素绑定事件,你几乎不用担心这个事件会有什么 ...

  6. 我的Android知识结构图——20200507停止更新,后续通过标签或分类继续完善结构图

    *持续更新中.调整中(带链接的是已经总结发布的,未带链接是待发布的) *个别知识点在多个分类中都是比较重要部分,为了分类完整性 可能多出都列出了 *每一篇都是认真总结并写出来的,若哪里有问题欢迎指正 ...

  7. [工具推荐]003.Tortoisegit使用教程(补充)

    前文介绍:       在前文<[工具推荐]003.Tortoisegit使用教程>中详细介绍了如何使用Tortoisegit的使用,但是大家使用后反映一点,就是每次操作都需要输入账号名和 ...

  8. [JavaWeb基础] 009.Struts2 上传文件

    在web开发中,我们经常遇到要把文件上传下载的功能,这篇文章旨在指导大家完成文件上传功能 1.首先我们需要一个上传文件的页面. <!--在进行文件上传时,表单提交方式一定要是post的方式, 因 ...

  9. NodeJS——在Sublime中配置NodeJS执行环境

    这种方式比在DOS窗中直接执行更加高效!!! nodejs 1.运行Sublime,菜单上找到Tools ---> Build System ---> new Build System 2 ...

  10. cors跨越深度刨析

    解决跨域的方式JSOP,和CORS JSONP不做介绍了. CORS跨域: 参考阮一峰http://www.ruanyifeng.com/blog/2016/04/cors.html 官方:https ...