目录
操作浏览器的前进、后退 ;浏览器的滚动条操作;全屏;高和宽设置
自动化测试
在预设状态下运行应用程序或系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试转化为机器执行的过程。(将人工测试手段进行转换,让代码去执行)
自动化分类:单元测试 接口测试 UI自动化测试
selenium介绍
selenium是web应用中基于UI的自动化测试框架,支持多平台、多浏览器、多语言、有丰富的API。
工作原理
webdriver
Xpath 定位 CSS定位
private static void test01() throws InterruptedException {
int flag = 0;
//selenium操作
ChromeOptions options = new ChromeOptions();
//允许所有的请求
options.addArguments("--remote-allow-origins=*");
//创建驱动
WebDriver webDriver = new ChromeDriver(options);
//打开百度首页
webDriver.get("https://www.baidu.com");
//找到百度搜索输入框
//css选择器定位元素
//WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
//xpath
WebElement element1 = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
//输入软件测试
element1.sendKeys("软件测试");
//找到百度一下的按钮
//点击
webDriver.findElement(By.cssSelector("#su")).click();
sleep(3000);
//验证
//找到搜索结果
List<WebElement> elements = webDriver.findElements(By.cssSelector("a em"));
for (int i = 0; i < elements.size(); i++) {
//elements.get(i).getText()
// System.out.println(elements.get(i).getText());
//如果返回的结果有软件测试,证明测试通过,否则测试不通过
//
if (elements.get(i).getText().equals("测试")) {
flag = 1;
System.out.println("测试通过!");
break;
}
if (flag == 0) {
System.out.println("测试不通过");
}
}
}
操作测试对象
- click:点击对象
- send_keys:在对象上模拟按键输入
- clear:清除对象输入的文本内容
- submit:提交 (如果点击元素放在form标签中,实现的效果和click一样,如果放在非form标签中,会报错)
- text:用于获取元素的文本信息
private static void test02() throws InterruptedException {
//selenium操作
ChromeOptions options = new ChromeOptions();
//允许所有的请求
options.addArguments("--remote-allow-origins=*");
//创建驱动
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://www.baidu.com");
sleep(3000);
//百度搜索框输入人类
webDriver.findElement(By.cssSelector("#kw")).sendKeys("人类");
//搜索框点击按钮的id su 点击百度搜索框按钮
webDriver.findElement(By.cssSelector("#su")).click();
//清空百度搜索框中的内容
webDriver.findElement(By.cssSelector("#kw")).clear();
}
String url = webDriver.getCurrentUrl(); String title = webDriver.getTitle();
private static void test03() {
ChromeOptions options = new ChromeOptions();
//允许所有的请求
options.addArguments("--remote-allow-origins=*");
//创建驱动
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://www.baidu.com");
String url = webDriver.getCurrentUrl();
String title = webDriver.getTitle();
if (url.equals("https://www.baidu.com") && title.equals("百度一下,你就知道")) {
System.out.println("测试通过");
} else {
System.out.println(url + " " + title);
System.out.println("测试不通过");
}
}
- getText拿不到部分属性的值,getAttribute可以拿到属性的值
添加等待
强制等待
sleep休眠
隐式等待
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);
有条件的等待,隐式的等待并非一个固定的等待时间,当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则以它轮询的方式不断的判断元素是否被定位到,直到超出设置的时间。它等待页面上所有元素的加载,如果没有在规定时间加载完页面所有元素,就抛出异常。等到页面元素全部加载完成,执行下一步的代码。
显示等待
设置一个超时时间和一个元素查找条件,在这个时间内不断寻找这个元素,超时找不到就会抛出异常。程序会判断在等待时间内条件是否满足,如果满足则返回,如果不满足会继续等待,超过时间就会抛出异常。
private static void test05() {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
//显示等待
WebDriverWait wait = new WebDriverWait(webDriver, 10);
//判断元素是否可以被点击
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#bottom_layer > div > p:nth-child(8) > span")));
}
如果是只需等待页面中的一个元素加载就用显示等待,等待整个网页加载就用隐式等待。
同:它们都是智能等待
异:隐式等待等待所有的元素;显示等待等待一定的条件。
浏览器操作
操作浏览器的前进、后退 ;浏览器的滚动条操作;全屏;高和宽设置
private static void test07() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
//打开百度首页
webDriver.get("https://www.baidu.com");
//搜索521
webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
//强制等待3秒
webDriver.findElement(By.cssSelector("#su")).click();
sleep(3000);
//浏览器后退
webDriver.navigate().back();
sleep(3000);
//
webDriver.navigate().refresh();
sleep(3000);
webDriver.navigate().forward();
sleep(3000);
//浏览器的滚动条操作
((JavascriptExecutor) webDriver).executeScript("document.documentElement.scrollTop=10000");
sleep(3000);
//全屏
webDriver.manage().window().fullscreen();
sleep(3000);
//浏览器的高和宽
webDriver.manage().window().setSize(new Dimension(600, 1000));
}
键盘组合键用法
private static void test08() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
//打开百度首页
webDriver.get("https://www.baidu.com");
//搜索521
webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
//control+A 全选
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "A");
sleep(3000);
//control+X 剪切
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "X");
sleep(5000);
//control+V 粘贴
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "V");
sleep(3000);
}
鼠标操作,搜索520,鼠标右击图片
private static void test09() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
//打开百度首页
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");
webDriver.findElement(By.cssSelector("#su")).click();
sleep(3000);
//找到图片按钮
WebElement webElement = webDriver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic"));
//鼠标右击
Actions actions = new Actions(webDriver);
sleep(3000);
actions.moveToElement(webElement).contextClick().perform();
}
针对特殊场景如何通过SeleniumAPI完成
定位一组元素
//批量操作对象,比如将页面上所有的checkbox都勾上
private static void page01() {
WebDriver webDriver = new ChromeDriver();
webDriver.get("网址");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.DAYS);
List<WebElement> webElements = webDriver.findElements(By.cssSelector("input"));
for (int i = 0; i < webElements.size(); i++) {
//如果每个元素type值等于checkbox进行点击
//getAttribute获取页面上的元素属性值,里面的type是当前元素的属性
if(webElements.get(i).getAttribute("type").equals("checkbox")){
webElements.get(i).click();
}else {
;
}
}
}
多框架/窗口定位
private static void page02() {
WebDriver webDriver = new ChromeDriver();
webDriver.get("网址");
//定位一个fram:把当前定位的主体切换到fram中
webDriver.switchTo().frame("f1");
webDriver.findElement(By.cssSelector("")).click();
}
下拉框定位
private static void page03() {
WebDriver webDriver = new ChromeDriver();
webDriver.get("网址");
WebElement webElement = webDriver.findElement(By.cssSelector(""));
Select select = new Select(webElement);
//通过下标查找
select.selectByIndex(0);
//通过value属性对应的值查找
select.selectByValue("");
}
针对alert弹窗操作
private static void page04() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("网址");
webDriver.findElement(By.cssSelector("")).click();
sleep(3000);
//alert弹窗取消
webDriver.switchTo().alert().dismiss();
//点击按钮
webDriver.findElement(By.cssSelector("")).click();
//alert弹窗中输入姓名
webDriver.switchTo().alert().sendKeys("姓名");
//alert弹窗确定
webDriver.switchTo().alert().accept();
}
上传文件操作
private static void page05() {
WebDriver webDriver = new ChromeDriver();
webDriver.get("网址");
webDriver.findElement(By.cssSelector("input")).sendKeys("文件路径");
//关闭浏览器
webDriver.quit();
webDriver.close();
}
webDriver.quit(); 关闭了整个浏览器,并清空缓存 webDriver.close(); 只关闭当前页面,没有清空缓存
切换窗口,在新窗口中进行搜索
private static void test10() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
sleep(3000);
//通过getWindowHandles获取所有的窗口句柄
//通过getWindowHandle获取get打开页面窗口句柄
Set<String> handles = webDriver.getWindowHandles();
String target_handle="";
//获取最后一个窗口句柄(最新打开的)
for(String handle : handles){
target_handle=handle;
}
webDriver.switchTo().window(target_handle);
webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
sleep(3000);
webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
}
截图
private static void test11() throws InterruptedException, IOException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.cssSelector("#kw")).sendKeys("新闻联播");
webDriver.findElement(By.cssSelector("#su")).click();
sleep(3000);
//截图
File file = (TakesScreenshot(webDriver)).getScreenshortsAs(OutputType.FILE);
FileUtils.copyFile(file,new File("D://jeitu.png"));
}