一、为什么要做自动化
二、适合自动化测试的情况
三、界面自动化
四、变量&if判断&打印
package com.guoyasoft.autoUI.guoya_1810;
import com.guoyasoft.autoUI.common.BaseUI;
import org.openqa.selenium.By;
import org.testng.annotations.Test;
/**
* @program: guoya-test
* @description:
* @author: guoya
* @create: 2018-11-14 09:44
**/
public class GuoyaLoging extends BaseUI {
//全局变量 写在class 类里面 public公众的 意思后面所有都可以引用的
//格式:变量类型(常见的三种类型:文本、数字、布尔值) 别名=变量内容
public String username="guoy88";
public String realname="xyz";
public String passwoed="qweasd";
public String phone="18619988668";
public String age="26";
@Test
public void signup () {
driver.get("http://47.98.226.232:8080/guoya-medium/jsp/user/signUp.jsp");
driver.findElement(By.xpath("//input[@id='userName']")).clear();
driver.findElement(By.xpath("//input[@id='userName']")).sendKeys(username);
driver.findElement(By.xpath("//input[@id='realName']")).sendKeys(realname);
driver.findElement(By.xpath("//input[@id='password']")).sendKeys(passwoed);
driver.findElement(By.xpath("//input[@id='password2']")).sendKeys(passwoed);
driver.findElement(By.xpath("//input[@id='phone']")).sendKeys(phone);
driver.findElement(By.xpath("//input[@id='age']")).sendKeys(age);
driver.findElement(By.xpath("//input[@id='checkCode']")).sendKeys("1234");
driver.findElement(By.xpath("//input[@id='submitBtn']")).click();
driver.switchTo().alert().accept();
/*
if 判断
getPageSource 获取页面源代码 contains 包含 contains的结果只有两种
所有用布尔值 用变量 result结果 存起来 供后面判断使用
计算机的逻辑是先赋值 再考虑是否引入变量
*/
boolean result = driver.getPageSource().contains("登录界面");
//== 判断值是否相等
if (result == true) {
//打印
System.out.println("用户注册成功");
}
//else 否则
else {
System.out.println("用户注册失败");
}
}
@Test
public void login () {
/*
局部变量 写在方法里面 ()代表方法 没有小括号是命令
public String username="guoy88";
public String passwoed="qweasd";
*/
driver.get("http://47.98.226.232:8080/guoya-medium/jsp/user/login.jsp");
driver.findElement(By.xpath("//input[@id='userName']")).clear();
driver.findElement(By.xpath("//input[@id='userName']")).sendKeys(username);
driver.findElement(By.xpath("//input[@id='password']")).sendKeys(passwoed);
driver.findElement(By.xpath("//input[@id='checkCode']")).sendKeys("12345");
driver.findElement(By.xpath("//input[@id='loginBtn']")).click();
}
}
五、循环
1、for循环
import com.guoyasoft.autoUI.common.BaseUI;
public class GuoyaLoging extends BaseUI {
public void login () {
/*for 如果 设置循环 起始值 最大值(最小值) 增量(减量)
格式:for (int i=起始值小;i<=最大值;i++){}
或者for(int i=起始值大;i>=最小值;i--){}
i++ 的意思是i=i+1 i-- 的意思是i=i-1
*/
for (int i = 0; i <= 10; i++) {
//打印 文本和变量之间用 + 连接
System.out.println("循环操作次数" + i);
driver.get("http://47.98.226.232:8080/guoya-medium/jsp/user/login.jsp");
driver.findElement(By.xpath("//input[@id='userName']")).clear();
driver.findElement(By.xpath("//input[@id='userName']")).sendKeys(username);
driver.findElement(By.xpath("//input[@id='password']")).sendKeys(passwoed);
driver.findElement(By.xpath("//input[@id='checkCode']")).sendKeys("12345");
driver.findElement(By.xpath("//input[@id='loginBtn']")).click();
}
}
}
2、while循环
(1)数值型
和for的循环很相似,关键就是增量(减量)一定要放在打印的后面
import com.guoyasoft.autoUI.common.BaseUI;
public class GuoyaLogin3 extends BaseUI {
/* while循环 可以是数值型 最小值 ,最大值,增量,判断条件
格式: int i=0;
while(i<=9){
i++
}
补充 如果增量i++放在while里打印内容的前面,则执行的时候直接从i+1开始
如果想要从起始值开始,增量i++一定要放在while里打印内容的后面*/
public void login () {
int i=0;
while(i<10) {
//i++ 增量一定要放在打印的后面
System.out.println("i的值"+i);
i++;
driver.get("http://47.98.226.232:8080/guoya-medium/jsp/user/login.jsp");
driver.findElement(By.xpath("//input[@id='userName']")).clear();
driver.findElement(By.xpath("//input[@id='userName']")).sendKeys(username);
driver.findElement(By.xpath("//input[@id='password']")).sendKeys(passwoed);
driver.findElement(By.xpath("//input[@id='checkCode']")).sendKeys("12345");
driver.findElement(By.xpath("//input[@id='loginBtn']")).click();
}
}
}
输出结果
打断点看开始执行的详细步骤
注意:如果i++放在打印输出之前,开始执行是从起始值+1开始的,不过循环次数是不会改变的
(2)判断条件
while还可以用于判断,条件成立则一直执行循环,条件不满足就结束,所以while很容易出现死循环。
import com.guoyasoft.autoUI.common.BaseUI;
public class GuoyaLogin3 extends BaseUI {
/*while还可以用于判断 条件成立则一直执行循环,条件不满足就结束
格式: boolean result;
//= 是赋值运算
while(result=true){ 大括号里是要循环的内容
result=赋值
}
补充 boolean后面的变量result一定要赋值 */
public void login () {
boolean result
while(result=true) {
System.out.println("登录成功");
driver.get("http://47.98.226.232:8080/guoya-medium/jsp/user/login.jsp");
driver.findElement(By.xpath("//input[@id='userName']")).clear();
driver.findElement(By.xpath("//input[@id='userName']")).sendKeys(username);
driver.findElement(By.xpath("//input[@id='password']")).sendKeys(passwoed);
driver.findElement(By.xpath("//input[@id='checkCode']")).sendKeys("12345");
driver.findElement(By.xpath("//input[@id='loginBtn']")).click();
result=driver.getpagessource.contains("学生查询");
}
}
}
六、数组
1、一维数组
类似csv,也是循环取值
import com.guoyasoft.autoUI.common.BaseUI;
public class GuoyaLogin3 extends BaseUI {
public String passwoed="qweasd";
//[] 是数组 =后面是值 {} 一维数组是固定长度
public String users []={
"ye008",
"ye007",
"ye006",
"ye005",
"ye004",
"ye003",
"ye002",
"ye001",
"ye000",
"ye009"};
public void login(){
//for循环的内容要放在for的{}里 users.length 数组长度
for (int i=0; i
2、二维数组
public class Demo {
//数组的特点是一旦创建了就固定了大小
public String users [][]={
{"hj12304","qweasd1"},
{"hj12305","qweasd2"},
{"hj12306","qweasd3"},
{"hj12307","qweasd4"},
{"hj12308","qweasd5"}
};
@Test
public void demo1() {
for (int i = 0; i < 5; i++) {
System.out.println(users[i][0]);
System.out.println(users[i][1]);
}
}
@Test
public void list(){
//创建一个list列表 好处就是列表不固定,用数据时可以直接添加
List list=new ArrayList();
//列表添加数据 list.add
list.add("李阳");
list.add("王维");
System.out.println(list.get(1));
System.out.println(list.size());
}
@Test
public void map(){
//Map 用来存储键值对数据 取数据通过键来取值
Map m=new HashMap();
m.put("李阳",21);
m.put("王维",18);
System.out.println("李阳的年龄是"+m.get("李阳"));
System.out.println("王维的年龄是"+m.get("王维"));
}
}
七、方法类型
1、无参 只是引用了一个变量 值是固定的
import com.guoyasoft.autoUI.common.BaseUI;
public class GuoyaLogin3 extends BaseUI {
public String passwoed="qweasd";
public String username="ye008";
public void login() {
driver.get("http://47.98.226.232:8080/guoya-medium/jsp/user/login.jsp");
driver.findElement(By.xpath("//input[@id='userName']")).clear();
driver.findElement(By.xpath("//input[@id='userName']")).sendKeys(username);
driver.findElement(By.xpath("//input[@id='password']")).sendKeys(passwoed);
driver.findElement(By.xpath("//input[@id='checkCode']")).sendKeys("12345");
driver.findElement(By.xpath("//input[@id='loginBtn']")).click();
//声明查询的条件 这个是自己声明的,如果下面没有引用会直接提示报错
queryuser();
queryrealname();
queryage();
}
//声明的方法
public void queryuser () {
driver.findElement(By.xpath("//input[@name='userName']")).clear();
driver.findElement(By.xpath("//input[@name='userName']")).sendKeys(username);
driver.findElement(By.xpath("//input[@type='submit']")).click();
}
public void queryrealname () {
driver.findElement(By.xpath("//input[@name='userName']")).clear();
driver.findElement(By.xpath("//input[@name='realName']")).sendKeys(realname);
driver.findElement(By.xpath("//input[@type='submit']")).click();
}
public void queryage () {
driver.findElement(By.xpath("//input[@name='realName']")).clear();
driver.findElement(By.xpath("//input[@type='number'][1]")).sendKeys(age);
driver.findElement(By.xpath("//input[@type='submit']")).click();
}
}
2、封装 用方法和参数---谁使用谁赋值
主要是用于简化代码
例如上文中的driver.findelement(By.xpath()).sendKeys() 一直在重复输入。这种重复性太高的,可以引用参数,赋值,封装数据
import com.guoyasoft.autoUI.common.BaseUI;
public class GuoyaLogin3 extends BaseUI {
public void login() {
/* driver.get("http://47.98.226.232:8080/guoya-medium/jsp/user/login.jsp");
driver.findElement(By.xpath("//input[@id='userName']")).clear();
driver.findElement(By.xpath("//input[@id='userName']")).sendKeys(users[i]);
driver.findElement(By.xpath("//input[@id='password']")).sendKeys(passwoed);
driver.findElement(By.xpath("//input[@id='checkCode']")).sendKeys("12345");
driver.findElement(By.xpath("//input[@id='loginBtn']")).click();*/
//简化
//引用参数 然后赋值 谁引用,谁赋值 简化书写 也是封装数据
get("http://47.98.226.232:8080/guoya-medium/jsp/user/login.jsp");
clear("//input[@id='userName']");
send("//input[@id='userName']","ye008");
send("//input[@id='password']","qweasd");
send("//input[@id='checkCode']", "12345");
click("//input[@id='loginBtn']");
}
//声明一个方法 用() 括号里面是参数 参数格式:参数类型 自己起的名称(){}
public void get(String url){
driver.get(url);
}
public void clear(String clear){
driver.findElement(By.xpath(xpath)).clear();
}
public void send(String xpath, String date){
driver.findElement(By.xpath(xpath)).sendKeys(date);
}
public void click(String xpath){
driver.findElement(By.xpath(xpath)).click();
}
}
八、前端页面iframe的切换
import com.guoyasoft.autoUI.common.BaseUI;
public class GuoyaLogin3 extends BaseUI {
public void login() {
get("http://47.98.226.232:8080/guoya-medium/jsp/user/login.jsp");
clear("//input[@id='userName']"));
send("//input[@id='userName']", "ye008");
send("//input[@id='password']","qweasd");
send("//input[@id='checkCode']", "12345");
click("//input[@id='loginBtn']");
//打印 获取的标题
System.out.println(driver.getTitle());
//boolean 布尔类型 变量类型 true 真 false 假
//获取页面源代码使用contains 方法 判断是否包含文本内容,是true 否false ,然后用布尔值变量进行存储
boolean result=driver.getPageSource().contains("学生查询");
//assert断言 判断预期结果与实际结果是否相等 布尔值不需要用"",文本字符串都需要加""
//调用Assert对象.assertEquals方法 判断 实际结果,预计结果是否相等,如果不相等,打印错误 抛出异常
Assert.assertEquals(result,true,"用户登录页面失败");
//调用自己封装的 查询用户的方法 入参 用户名
queryuser("ye008");
sleep(2000);
//切换iframe 窗口条件是name 或者 Id 展示窗口
driver.switchTo().frame("result");
//断言 查询后展示页面是否包含查询用户 断言的结果是布尔值不用""
boolean guoya=driver.getPageSource().contains(users[i]);
Assert.assertEquals(guoya,true);
//打印切换后的页面 获取的标题
System.out.println(driver.getTitle());
//切换回默认窗口
//driver.switchTo().defaultContent();
}
}
public void get(String url){
driver.get(url);
}
public void clear(String clear){
driver.findElement(By.xpath(xpath)).clear();
}
public void send(String xpath, String date){
driver.findElement(By.xpath(xpath)).sendKeys(date);
}
public void click(String xpath){
driver.findElement(By.xpath(xpath)).click();
}
public void queryuser(String name){
send("//input[@name='userName']",name);
click("//input[@type='submit']");
}
}
九、下拉框的查询
package com.guoyasoft.autoUI.guoya_1810;
import com.guoyasoft.autoUI.common.BaseUI;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.Select;
import org.testng.annotations.Test;
public class GuoyaLogin4 extends BaseUI {
public String username="ye008";
public String password="qweasd";
@Test
public void login(){
for (int i=0;i<= users.length;i++) {
get("http://47.98.226.232:8080/guoya-medium/jsp/user/login.jsp");
clear("//input[@name='userName']");
send("//input[@name='userName']", username);
send("//input[@id='password']", password);
send("//input[@id='checkCode']", "12345");
click("//input[@id='loginBtn']");
queryeducation("大专");
queryclass("提高班");
}
}
public void get(String url){
driver.get(url);
}
public void clear(String xpath){
driver.findElement(By.xpath(xpath)).clear();
}
public void send(String xpath,String sendKeys){
driver.findElement(By.xpath(xpath)).sendKeys(sendKeys);
}
public void click(String xpath){
driver.findElement(By.xpath(xpath)).click();
}
public void queryeducation(String education){
clear("//input[@type='number'][1]");
//Select select=send("//select[@name='education']",education);
//使用findelement 查找select元素 使用Webelement 对象声明的变量用element进行保存
WebElement element=driver.findElement(By.xpath("//select[@name='education']"));
//新建一个selenium 下拉框处理对象 Select进行处理下拉框 使用时需要传参 传参为定位的select下拉框
Select select=new Select(element);
select.selectByVisibleText(education);
click("//input[@type='submit']");
}
public void queryclass(String classType){
clear("//select[@name='education']");
WebElement element=driver.findElement(By.xpath("//select[@name='classType']"));
Select select=new Select(element);
select.selectByVisibleText(classType);
click("//input[@type='submit']");
}
}