文章目录
- 自动化测试
- 一、selenium
- 1.相关介绍
- 1.Selenium IDE
- 2.Webdriver
- webdriver的工作原理:
- 3.selenium Grid
- 2.Selenium + Java环境搭建
- 3.常用API的使用
- 1.定位元素
- 2.操作测试对象
- 3.添加等待
- 4.打印信息
- 5.浏览器的操作
- 6.键盘事件
- 7.鼠标事件
- 8.定位一组元素
- 9.多层框架定位
- 10.下拉框处理
- 11.处理alert弹窗
- 12.上传文件操作
- 13.截图
自动化测试
- 单元测试、接口测试、UI自动化测试…
一、selenium
- 是自动化测试框架
1.相关介绍
- Selenium是web应用中基于UI的自动化测试框架,支持多平台、多浏览器、多语言。
- 由Selenium IDE, Webdriver,Selenium Grid组成
1.Selenium IDE
Selenium IDE一个用于Selenium测试的完成集成开发环境,可以直接录制在浏览器的用户操作,并且 能回放,编辑和调试测试脚本。调试过程中可以逐步进行或调整执行的速度,并且可以在底部浏览日志出错信息。 录制的测试脚本可以以多种语言导出,比如java,C#,Python,Ruby等,方便掌握不同语言的测试人员操作。
2.Webdriver
Selenium RC 在浏览器中运行 JavaScript 应用,会存在环境沙箱问题,而WebDriver可以跳出 JavaScript的沙箱,针对不同的浏览器创建更健壮的,分布式的,跨平台的自动化测试脚本。基于特定语言(Java,C#,Python,Ruby,Perl,JavaScript等)绑定来驱动浏览器对Web元素进行操作和验证。
webdriver的工作原理:
启动浏览器后,selenium-webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为 webdriver的remote server。 客户端(也就是测试脚本),借助ComandExecutor发送HTTP请求给sever端(通信协议:The WebDriver Wire Protocol,在HTTP request的body中,会以WebDriver Wire协议规定的JSON格 式的字符串来告诉Selenium我们希望浏览器接下来做什么事情)。 Sever端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操 作。
3.selenium Grid
selenium Grid是一个服务器,提供对浏览器实例访问的服务器列表,管理各个节点的注册和状态信息。可以实现在同一时刻不同服务器上执行不同的测试脚本。
2.Selenium + Java环境搭建
下载浏览器驱动
<dependencies><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency></dependencies>
引入依赖
public static void main(String[] args) {ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");WebDriver webDriver = new ChromeDriver(options);webDriver.get("https://www.baidu.com");}
测试能否正确运行
3.常用API的使用
1.定位元素
findElement()
类选择器定位、xpath定位
public static void main(String[] args) {ChromeOptions options = new ChromeOptions();//创建一个选项对象options.addArguments("--remote-allow-origins=*");//添加参数,允许访问所有的页面WebDriver webDriver = new ChromeDriver(options);//打开百度webDriver.get("https://www.baidu.com");//找到百度搜索输入框// WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));//类选择器定位WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));//XPath定位element.sendKeys("软件测试");}
CSS选择语法
id选择器
WebElement element = webDriver.findElement(By.cssSelector("#kw"));//id选择器
类选择器
WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));//类选择器定位
xpath定位
1.绝对路径:以/html开头(/html/head/title)不常用
2.相对路径://开头
相对路径+索引: //form[1]/span[1]/input
//form[1]/span[1]/input//form[1]/span[2]/input
相对路径+属性值
//input[@class="s_ipt"]//input[@value="百度一下"]//input[@id="su"]
相对路径+通配符
//*[@*="su"]
相对路径+ 文本匹配
//a[text()="文库"]
进行校验
WebElement element = webDriver.findElement(By.cssSelector("#kw"));//id选择器element.sendKeys("软件测试");//输入软件测试webDriver.findElement(By.cssSelector("#su")).click();//找到百度一下按钮,进行点击sleep(3000);//校验//1.找到搜索结果List<WebElement> elements = webDriver.findElements(By.cssSelector("a em"));for (int i = 0;i<elements.size();i++){System.out.println(elements.get(i).getText());if (elements.get(i).getText().contains("测试")){flag = 1;System.out.println("测试通过");break;}}if (flag == 0){System.out.println("测试不通过");}
- CSS选择器定位元素效率更高
2.操作测试对象
click点击对象
send_keys在对象上模拟按键输入
clear清除对象输入的文本内容
submit 提交
text 用于获取元素的文本信息
getAttribute 获取元素对应属性的值
private static void test02() throws InterruptedException {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("翁佳明java");//找到输入框进行搜索webDriver.findElement(By.cssSelector("#su")).click();//点击按钮sleep(3000);webDriver.findElement(By.cssSelector("#kw")).clear();//清空输入框中的数据}
- 如果点击的元素放在form标签中,submit和click的效果是一样的。如果点击元素放在非form标签中,此时使用submit会报错。
// webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).click();webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).submit();//会出现报错
getAttribute 获取元素对应属性的值
String buttonValue = webDriver.findElement(By.cssSelector("#su")).getText();System.out.println(buttonValue);//获取不到属性值,所以用getAttribute获取属性的值System.out.println(webDriver.findElement(By.cssSelector("#su")).getAttribute("value"));//百度一下
3.添加等待
-
sleep强制等待
-
智能等待(隐式等待、显示等待)
隐式等待:通常用于等待页面元素出现,而不是等待页面加载完成。在等待时间内不断查询是否定位到元素
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.HOURS);
显示等待
WebDriverWait wait = new WebDriverWait(webDriver,3000);wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#bottom_layer > div111 > p:nth-child(8) > span")));//没找到,报错wait.until(ExpectedConditions.titleIs("百度一下,你就知道"));
隐式等待和显示等待之间的区别:
-
隐式等待:等待加载页面上所有的元素,所有元素加载完成后,再执行后续代码。如果超过时间仍没有加载出来,就会报错。等待的是所以的元素。
-
显示等待:设置的是等待的最长时间,只要满足了设置的条件,就可以执行后续的代码,等待的是设定的条件
-
4.打印信息
打印title 打印url
private static void test05() {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("测试不提供");}}
5.浏览器的操作
1.浏览器前进
2.浏览器后退
private static void test07() 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);//打开百度,搜索520webDriver.navigate().back();sleep(3000);//浏览器后退webDriver.navigate().refresh();sleep(3000);webDriver.navigate().forward();//浏览器前进}
3.浏览器滚动条操作
在console中输入
document.documentElement.scrollTop=1000;
sleep(3000);((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");//滚动:把webDriver强转成JS脚本执行JS代码
4.设置页面大小
webDriver.manage().window().maximize();//最大化sleep(3000);webDriver.manage().window().fullscreen();//全屏sleep(3000);webDriver.manage().window().setSize(new Dimension(600,1000));
5.关闭浏览器
- quit:关闭整个浏览器、会清空缓存
- close:关闭当前页面(get的)、不会清空缓存
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);
// webDriver.quit();退出整个浏览器webDriver.close();//关闭当前页面}
6.窗口切换
- 元素默认是在get的页面当中查找元素的,如果跳转了页面,就需要进行切换
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);
// webDriver.quit();退出整个浏览器
// webDriver.close();
// webDriver.getWindowHandles();//获取所有的窗口句柄
//
// webDriver.getWindowHandle();//获取get打开的窗口句柄Set<String> handles = webDriver.getWindowHandles();String target_handle = "";for (String handle:handles){target_handle = handle;}//拿到最后一个handlewebDriver.switchTo().window(target_handle);//进行窗口切换sleep(3000);webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
6.键盘事件
webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");//ctrl+AwebDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");sleep(3000);//ctrl+XwebDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X");sleep(3000);//ctrl+VwebDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");sleep(3000);
7.鼠标事件
//找到图片按钮//进行鼠标右击WebElement element = 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(element).contextClick().perform();//没有perform就没有效果
8.定位一组元素
定位一组元素
全选复选框webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS); List<WebElement> webElements = webDriver.findElements(By.cssSelector("input"));for (int i = 0; i < webElements.size(); i++) {if (webElements.get(i).getAttribute("type").equals("checkbox")){webElements.get(i).click();}}
9.多层框架定位
通过frame的id或者name或者frame自带的其它属性来定位框架,这里switchTo().frame把当前定位的主体切换了frame里
在<iframe>中,定位不到<a>,会报错。需要进行主体的转换webDriver.switchTo().frame("f1");webDriver.findElement(By.cssSelector("body>div>div>a")).click();
10.下拉框处理
WebElement webElement = webDriver.findElement(By.cssSelector("#ShippingMethod"));Select select = new Select(webElement);select.selectByIndex(1);//根据从0开始的索引选择select.selectByValue("12.51");//根据标签的value值选择
11.处理alert弹窗
webDriver.findElement(By.cssSelector("button")).click();sleep(3000);//alert弹窗的取消->点击按钮->在弹窗中输入“520”->alert弹窗的确认webDriver.switchTo().alert().dismiss();//取消sleep(3000);webDriver.findElement(By.cssSelector("button")).click();webDriver.switchTo().alert().sendKeys("520");sleep(3000);webDriver.switchTo().alert().accept();//确定
12.上传文件操作
webDriver.findElement(By.cssSelector("input")).sendKeys("D:\\test");//文件上传
13.截图
需要先添加依赖
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version>
</dependency>
private static void test12() 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 screenshotAs = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);//进行强转,进行截图FileUtils.copyFile(screenshotAs,new File("D://20240606jietu.png"));//把文件保存到磁盘中。}
点击移步博客主页,欢迎光临~