java web自动化
java+selenium+testng+Jenkins
想要使用Selenium实现web自动化测试,主要需要的东西。
1.需要安装jdk,配置jdk,(selenium3需要jdk1.8以上)
2. 安装eclipse(编写工具)
3. 安装webdrver(集成selenium api jar文件)
需要下载webdriver-java-zip
下载好以后
步骤:
1.创建一个java 工程 java project
2.在工程下创建一个lib文件夹
3.将下载的webdriver下的jar文件及lib下的jar文件复制到新建的lib文件夹下
4.选中lib下的所有jar–build path–add build to path
浏览器驱动
这个不能少,不然驱动不了浏览器,我用的是chrome浏览器
安装浏览器和对应的驱动 (浏览器的版本要和驱动版本一致)
驱动下载地址
配置好以后就可以写代码了
第一个自动化脚本
public static void main(String[] args) throws InterruptedException {//设置驱动System.setProperty("webdriver.chrome.driver", "D:\\JavaZhiDong/chromedriver.exe");//创建ChromeDriver对象ChromeDriver driver = new ChromeDriver();//创建窗口最大化driver.manage().window().maximize();//打开网页driver.get("https://www.baidu.com");
然后你就成功的打开了
自动化就是这么简单,要想学好自动化必须有代码能力,还要动手敲。
你要牢记少年
元素定位
public static void main(String[] args) {//配置驱动System.setProperty("webdriver.chrome.driver", "D:\\JavaZhiDong/chromedriver.exe");//创建ChromeDriver对象ChromeDriver driver = new ChromeDriver();//窗口最大化driver.manage().window().maximize();//打开网站driver.get("https://www.baidu.com");
常用用的
1.ID定位,因为id是唯一的能用id不用其他
//用ID定位输入框WebElement id = driver.findElement(By.id("kw"));//输入Pythonid.sendKeys("python");//用ID定位WebElement ById = driver.findElementById("su");//点击百度一下ById.click();
2.name定位
//用name定位输入框WebElement Name = driver.findElementByName("wd");//输入奇艺科技Name.sendKeys("小强");//强制等待Thread.sleep(1000);//用class定位元素driver.findElementByClassName("s_btn").click();//关闭网页driver.close();
3.class定位
//className定位输入框WebElement name = driver.findElementByClassName("s_ipt");//输入吾爱破解name.sendKeys("吾爱破解");//定位点击按钮driver.findElementByClassName("s_btn").click();//关闭网页driver.close();
4.超链接定位
//用linkText等位超链接WebElement xinwen= driver.findElementByLinkText("新闻");//点击新闻xinwen.click();//设置强行等待时间Thread.sleep(3000);//关闭网页driver.close();
5.部分超链接
driver.get("https://www.baidu.com");//用partialLinkText 定位部分超链接WebElement tieba = driver.findElementByPartialLinkText("贴");//点击贴吧tieba.click();//设置强制等待Thread.sleep(3000);//关闭网页driver.close();
6.css定位
层叠样式表(#代表id属性,"."代表class属性)
通过id属性找元素,语法:E#idName,E代表某个元素
driver.findElementByCssSelector("#kw");
通过class属性找元素,语法:E.className,E代表某个元素
driver.findElementByCssSelector("input.s_ipt");
PS:class里面有空格,我们用“.”来代替空格,形如:bg s_btn
driver.findElementByCssSelector("input.bg.s_btn");
7.xpash定位
//用xpash等位输入框driver.findElementByXPath("//*[@id='kw']");
定位到元素–右键–copy–Copy Xpash
对元素操作方法
sendKeys(" ") 输入数据
clear(); 清空输入框
click(); 对元素进行点击
getText() 获取元素文本的值
getAttribut(“属性名”) 获取某个属性的值
操作网页元素 下拉菜单
选中下拉菜单有三种方式
1.selectByIndex: 通过索引选中某个条目
2.selectByVisibleText: 通过下拉列表中选项的可见文本选中某个条目
3.selectByValue: 通过下拉列表某个选项的value值,选中该选项
PS:html标签里面一定是select才可以这样使用
//定位下拉框WebElement xiala = driver.findElementById("cardType");Select select = new Select(xiala);select.selectByIndex(3);Thread.sleep(1000);select.selectByValue("C");Thread.sleep(1000);select.selectByVisibleText("中国居民身份证");
浏览器多窗口间切换的问题
Selenium为每一个窗口提供了一个唯一的id号
这个id号在selenium中被称为window handle(窗口句柄,手柄)
通过这个id号来实现多窗口间的切换
获取当前窗口的id号使用driver.getWindowHandle();(获取主窗口的句柄)
获取所有打开窗口的id号使用driver.getWindowHandles();
窗口切换使用driver.switchTo().window(winHandle);
判断逻辑:
获取第一个窗口的id号
获取所有窗口的id号
如果不是第一个窗口,说明是新窗口,切换到新窗口
driver.switchTo().window(winHandle)
Selenium中的多个窗口切换(3个及以上的窗口切换)
获取第一百度窗口手柄
//获取百度窗口手柄String baiduHandle = driver.getWindowHandle();
窗口切换及判断
//点击12306网站driver.findElementByXPath("//*[@id='1']/h3/a[1]").click();//从所有窗口中判断是否第一个窗口,如果不是第一个进行窗口切换Set<String> windowHandles = driver.getWindowHandles();for(String string : windowHandles){System.out.println(string);if(string!=baiduHandle){//进行窗口切换driver.switchTo().window(string);}}
附带全部代码注册12306网站
package com.qiyi.testuser;import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;import javax.swing.plaf.FontUIResource;import org.junit.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;public class TestWangZhan {
public static void main(String[] args) throws InterruptedException {//启动驱动System.setProperty("webdriver.chrome.driver", "D:\\JavaZhiDong\\chromedriver.exe");//创建ChromeDriver对象ChromeDriver driver = new ChromeDriver();//窗口最大化driver.manage().window().maximize();//添加隐式等待时间driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//打开百度网页driver.get("https:www.baidu.com");//用ID定位输入框WebElement id = driver.findElement(By.id("kw"));//输入12306id.sendKeys("12306");//用ID定位WebElement ById = driver.findElementById("su");//点击百度一下ById.click();//获取百度窗口手柄String baiduHandle = driver.getWindowHandle();//点击12306网站driver.findElementByXPath("//*[@id='1']/h3/a[1]").click();//从所有窗口中判断是否第一个窗口,如果不是第一个进行窗口切换Set<String> windowHandles = driver.getWindowHandles();for(String string : windowHandles){System.out.println(string);if(string!=baiduHandle){//进行窗口切换driver.switchTo().window(string);}}//注册超链接driver.findElementByLinkText("注册").click();//定位用户名WebElement yonghu = driver.findElementById("userName");yonghu.sendKeys("dawdadasdfvgbhnfdasfasflasfaf");//定位密码WebElement mima = driver.findElementById("passWord");mima.sendKeys("wei8520");//等位确定密码WebElement quren = driver.findElementById("confirmPassWord");quren.sendKeys("wei8520");//强制等待Thread.sleep(3000);//定位下拉框WebElement xiala = driver.findElementById("cardType");Select select = new Select(xiala);select.selectByIndex(3);Thread.sleep(1000);select.selectByValue("C");Thread.sleep(1000);select.selectByVisibleText("中国居民身份证");//定位姓名WebElement xingming = driver.findElementByName("loginUserDTO.name");xingming.sendKeys("郑杰武");//定位身份证号WebElement shenfen = driver.findElementById("cardCode");shenfen.sendKeys("440582198712141558");//定位邮箱WebElement youxiang = driver.findElementById("email");youxiang.sendKeys("329625679@qq.com");//定位手机号WebElement shouji = driver.findElementByName("userDTO.mobile_no");shouji.sendKeys("18569942232");//定位方框driver.findElementById("checkAgree").click();//定位下一步driver.findElementById("nextBtn").click();//获取文本WebElement wenben = driver.findElementById("content_defaultwarningAlert_hearder");String text = wenben.getText();System.out.println("----------"+text);//断言Assert.assertEquals("该证件号码已被注册。请确认是否您本人注册,\"是\"请使用原账号登录,\"不是\"请通过铁路12306App办理抢注或持该证件原件到就近的办理客运业务的铁路车站办理被抢注处理,完成后即可继续注册,或致电12306客服咨询。", text);//点击确定driver.findElementById("qd_closeDefaultWarningWindowDialog_id").click();//关闭网页driver.close();}
}
怎对这样的窗口
iframe 元素定位
1.切换到iframe里面
driver.switchTo().frame(webElement);
webElement 是iframe元素
2.切换到之前的页面
driver.switchTo().defaultContent();
package com.qiyi.testuser;import java.time.format.TextStyle;
import java.util.concurrent.TimeUnit;import org.openqa.selenium.chrome.ChromeDriver;public class TestYingXiongLianMeng {public static void main(String[] args) throws InterruptedException {// 启动驱动System.setProperty("webdriver.chrome.driver", "D:\\JavaZhiDong/chromedriver.exe");//创建ChromeDriver对象ChromeDriver driver = new ChromeDriver();//窗口最大化driver.manage().window().maximize();//设置隐式等待时间driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//打开网站driver.get("https://lol.qq.com/act/a20191216demacia/index.shtml?e_code=500410&idataid=294614");//超链接点击登录driver.findElementByLinkText("登录").click();//切换窗口driver.switchTo().frame(driver.findElementById("loginIframe"));//强制等待Thread.sleep(3000);//点击头像进行登入driver.findElementById("img_out_319625679").click();//切换之前页面driver.switchTo().defaultContent();}}
testng集成(连续运行多个用例,执行多个脚本)
testng:下一代测试技术,是一个插件
管理用例,生成测试报告
eclipse安装testng
1.下载、解压testng插件,将plugins文件夹下的文件夹放到eclipse对应的plugins目下
2.重启eclipse
3.项目中引入testng 右键项目 --BuildPath --AddLibraries–选择testng
创建testng类,testng类里面带有@Test的方法能够像main方法一样执行。
.集成reportng(https://www.cnblogs.com/xubc/p/7265070.html)
为了让测试报告可读性更好,我们使用reportng
1.lib集成reportNg的jar包,build path
reportng-1.1.4.jar
guice-4.2.2.jar
velocity-dep-1.4.jar
2.设置里面勾选默认的监听(不要勾选绝对路径)
window --preference–勾选disable default listener
设置里面增添:org.uncommons.reportng.HTMLReporter
3.testng.xml添加新的监听代码<listeners><listener class-name="org.uncommons.reportng.HTMLReporter" /><listener class-name="org.uncommons.reportng.JUnitXMLReporter" /></listeners>
.命令行运行批处理脚本
1.创建批处理文件
新建文本文档,修改后缀名为.bat
2.文件中输入执行的命令
Java -cp bin;lib/* org.testng.TestNG testng.xml
pause
PS:Java -cp将编译和执行位于bin目录下的.class文件和所有lib目录下jar包文件。因我们基于TestNG框架,所以指定org.testng.TestNG作为java主程序入口。testng.xml则告诉testNG要执行的测试脚本,名字可更换。3.工程lib目录下需要引入testng.jar,并build pathPS:testng.xml和批处理文件在同一个目录下
.Jenkins通过命令调起脚本
1.新建一个自由风格项目
2.增加构建步骤–执行windows批处理命令
3.输入命令,形如:
D:
cd D:\workspace\Test09Web
call qiyi09.bat
exit 0
4.设置定时任务:比如晚上12点运行