Selenium webUI 自动化测试框架
前言:Selenium 框架是专门针对 webUI 进行测试的,在测试前需要将环境变量和依赖都安装好(传送门)。
测试起手式:
privatestaticvoidtest2()throwsInterruptedException{// 创建驱动WebDriver webDriver =newChromeDriver();// 打开百度
webDriver.get("https://www.baidu.com");// 通过 css 选择器找到百度输入框WebElement element = webDriver.findElement(By.cssSelector("#kw"));// 在百度搜索框输入内容
element.sendKeys("江边鸟");// 通过 css 选择器找到搜索按钮 并点击搜索sleep(3000);;//webDriver.findElement(By.cssSelector("#su")).submit();// 在输入框中清除 江边鸟sleep(3000);
webDriver.findElement(By.cssSelector("#kw")).clear();}
涉及 API:
- ***WebDriver new ChromeDriver(): 用于创建一个驱动*,Selenium 框架操控浏览器是通过驱动作为中间介进行操控的(上文说到过);
- ***webDriver.get():用于将 Chrome 浏览器打开并指向到哪个网页*;参数用于输入一个网页
- ***webDriver.findElement():要找的元素在哪*,参数为 By.cssSelector(“”) 或者 *By.xpath(“”)*,两个都为选择器,用于对网页上的便签元素进行指定,前者为 css 选择器,后置为 xpath 选择器。
- ***WebElement.sendKeys(“”):对找到的元素进行输入操作*,参数为想要输入的内容
- ***webDriver.findElement(By.cssSelector(“”)).click():对选中的元素执行点击事件*
- ***webDriver.findElement(By.cssSelector(“”)).clear():对选中的元素执行清除事件*
补充(对于两种选择器如何找到对应选择器的标签):
css 选择器语法
:-id 选择器
:使用# 号加 id 名
进行选择;例如指定百度的搜索框,其 id = “kw” ,如下图这样我们就可以通过 #kw 来指定到百度的搜索框上:-类选择器
:使用. 加 class 名
进行选择。例如通过类选择器指定百度搜索框:即通过 .s_ipt 指定到百度搜索框:-标签选择器
:通过标签名直接进行选择
。依然选择百度搜索框:-后代选择器
:在标签后面继续加元素
即可(父级选择器 子级选择器
)。选择百度搜索框:xpath 选择器语法
:-绝对路径
:/…/… (不常用)效率非常低。类似于下面这种:-相对路径(常见/常用)
:都以 // 开头,以 / 分割
,以下以选择百度搜索框为例-相对路径+索引
:索引是从1开始,不写索引默认为1;-相对路径+属性值
:标签名[@属性名="值"]
-相对路径+通配符
:使用 * 代表所有 路径/标签 下
,进行寻找-相对路径+文本匹配
:通过 text() = "文本内容"
,来确定元素位置。例如找到百度页面中的 新闻 :
Selenium 测试的方法用例
这里会对 Selenium 自动化测试的常用方法进行一一举例并说明
操作测试对象的方法
这里的方法也就是上面起手式的方法:click(),clear(),sendKeys(),submit()
click():方法点击事件
,即对指定的元素进行点击(无局限性);clear():清除指定元素中的内容
;sendKeys():针对输入框,在输入框中输入内容
;submit():和 click() 作用一样
,但局限于只能在 form 标签下选择才起作用,别的标签中会报错。
举例:打开谷歌浏览器,进入百度搜索页面,在百度输入框中输入 “江边鸟”,并进行搜索;再清除输入框中的 “江边鸟”:
打开浏览器,进入百度搜索,输入 江边鸟:
进行搜索,搜索完清除输入内容:
privatestaticvoidtest2()throwsInterruptedException{// 创建驱动WebDriver webDriver =newChromeDriver();// 打开百度
webDriver.get("https://www.baidu.com");// 通过 css 选择器找到百度输入框WebElement element = webDriver.findElement(By.cssSelector("#kw"));// 在百度搜索框输入内容
element.sendKeys("江边鸟");// 通过 css 选择器找到搜索按钮 并点击搜索sleep(3000);// 等待3秒。强制睡眠,后面会提到
webDriver.findElement(By.cssSelector("#su")).click();//webDriver.findElement(By.cssSelector("#su")).submit();// 在输入框中清除 江边鸟sleep(3000);
webDriver.findElement(By.cssSelector("#kw")).clear();}
补充:
getAttribute() 方法:用于找到指定按钮的值
举例: 通过 getAttribute() 方法找到 #su css选择器的值,预期结果是百度一下。
privatestaticvoidtest3(){WebDriver webDriver =newChromeDriver();
webDriver.get("https://www.baidu.com");String button_value = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");// 通过getAttribute() 方法找到 按钮的值if(button_value.equals("百度一下")){System.out.println(button_value);System.out.println("测试通过");}else{System.out.println(button_value);System.out.println("测试不通过");}}
添加等待的方法
强制等待 sleep()
:sleep(等待时间),单位为毫秒。必须等待指定的时间才会执行后面的代码。隐式等待 timeouts().implicitlyWait(参数1, 参数2)
:该方法设置了一个全局的等待时间,适用于整个浏览器会话期间。 它等待的时间是针对页面中的所有元素,一旦页面加裁完成,等侍就会结束。如果在设置的时间内找不到元素,则抛出NoSuchElementException 异常。 简言之:当代码执行完了的时候,隐式等待下面的代码就会立即执行,当前面没有执行完的时候,隐式等待就不会执行,即隐式等待最多等待时长为设定的参数值。 参数1 为等待时长,参数2为时长单位(秒,分,小时,天)。
举例:打开谷歌浏览器,进入百度搜索页面,在百度输入框中输入 “江边鸟”,强制等待3秒进行搜索;隐式等待3天再清除输入框中的 “江边鸟”:
privatestaticvoidtest4()throwsInterruptedException{// 强制等待 sleep() 和 隐式等待 webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS) 其中第一个参数指的是等待时长,第二个参数是时长单位(秒,分,小时,天)// 隐式等待和强制等待的区别:// 隐式等待:当前面执行完了的时候,隐式等待下面的代码就会立即执行,当前面没有执行完的时候,隐式等待就不会执行,即隐式等待最多等待时长为设定的参数值// 强制等待:必须等待完设置的时间后面代码才能执行// 创建驱动WebDriver webDriver =newChromeDriver();// 打开百度
webDriver.get("https://www.baidu.com");// 通过 css 选择器找到百度输入框WebElement element = webDriver.findElement(By.cssSelector("#kw"));// 在百度搜索框输入内容
element.sendKeys("江边鸟");// 通过 css 选择器找到搜索按钮 并点击搜索sleep(3000);// 强制等待
webDriver.findElement(By.cssSelector("#su")).click();//webDriver.findElement(By.cssSelector("#su")).submit();// 在输入框中清除 江边鸟long began =System.currentTimeMillis();// 记录时间,用于计算隐式等待具体时间
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.DAYS);// 隐式等待
webDriver.findElement(By.cssSelector("#kw")).clear();long end =System.currentTimeMillis();System.out.println("隐式等待实际等待时间: "+(end - began));}
执行结果:会立即清除输入框中的内容,而不会真的等待三天。
显示等待 WebDriverWait类
:用于显式等待条件的实现,这个类允许在一定的时间范围内等待某个条件的成立(例如元素是否存在、是否可见、是否可点击等),从而避免由于页面加载或动态内容渲染不完全而导致的错误。 - 使用两个参数的构造方法时: timeOutInSeconds : 等待最大时间,单位为秒,如果在这段时间内条件未满足,WebDriverWait 会抛出 TimeoutException 异常。- 使用三个参数的构造方法时:
例如:判断百度搜索页面中,新闻这个按钮是否可以点击
privatestaticvoidtest6(){// 显式等待: 即等待的是条件// 隐式等待和显式等待的区别:隐式等待等待的是整个页面,当整个页面加载完才执行等待语句下面的代码,当等待时间等待完整个页面还没有加载出来的话,就会报错;时间单位可以自己选择// 显式等待:等待的是条件,时间单位是秒; 对要判断的条件等待若干秒,若干秒之后还没有满足条件就会抛出 TimeoutException 异常WebDriver webDriver =newChromeDriver();
webDriver.get("https://www.baidu.com");WebDriverWait webDriverWait =newWebDriverWait(webDriver,3);// 显式等待 单位是秒; 对要判断的条件等待3秒,若3秒之后还没有满足条件就会抛出 TimeoutException 异常
webDriverWait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#s-top-left > a:nth-child(1)")));// 判断元素是不是可以点击}
可以看到代码正常退出:
当判断一个不可点击的标签时,就会报错(超时):
打印信息的方法
- 打印 URL :通过
*WebDriver.getCurrentUrl()* 方法
。返回值是 String 类型。 - 打印 Title :通过
WebDriver.getTitle()
方法。返回值是 String 类型。
用例:测试一下百度的网址和百度的 Title 名。预期结果:网址(https://www.baidu.com/),Tile(百度一下,你就知道)。
privatestaticvoidtest5(){// 打印网站的 URL 和 TitleWebDriver webDriver =newChromeDriver();
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("测试通过");System.out.println("测试网站是: "+ url +", 网站标题是: "+ title);;}else{System.out.println("测试不通过");}}
针对浏览器操作的方法
浏览器后退:WebDriver.navigate().back()
;浏览器前进:WebDriver.navigate().forward()
;浏览器刷新:WebDriver.navigate().refresh()
;浏览器最大化:WebDriver.manage().window().maximize()
;浏览器全屏:WebDriver.manage().window().fullscreen()
;自定义浏览器大小:WebDriver.manage().window().setSize(new Dimension(参数1,参数2));
其中参数1代表自定义宽度,参数2代表自定义高度;浏览器滚动条操作:((JavascriptExecutor)WebDriver).executeScript("参数");
在这里浏览器的滚动条需要依靠js 脚本(在使用脚本的同时需要对类型进行强转 ),参数如下: - 将浏览器滚动条滑到最顶端:document.documentElement.scrollTop=0- 将浏览器滚动条滑到最低端:document.documentElement.scrollTop=10000
浏览器中通过 js 脚本进行控制:
用例:在百度搜索框中输入 电脑,并点击搜索,对搜索出来的页面执行上述所有操作;
privatestaticvoidtest7()throwsInterruptedException{// 对浏览器进行前进,后退,刷新操作。 对浏览器滚动条进行操作,将浏览器最大化,全屏,自定义大小// 创建驱动WebDriver webDriver =newChromeDriver();
webDriver.get("https://www.baidu.com");// 搜索
webDriver.findElement(By.cssSelector("#kw")).sendKeys("电脑");// 在输入框中输入 电脑sleep(3000);// 强制睡眠3秒
webDriver.findElement(By.cssSelector("#su")).click();// 点击搜索// 等待3秒,浏览器后退sleep(3000);
webDriver.navigate().back();// 等待三秒,浏览器前进sleep(3000);
webDriver.navigate().forward();// 等待三秒,浏览器刷新sleep(3000);
webDriver.navigate().refresh();// 等待三秒,对浏览器滚动条进行操作((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");// 首先这里的操作通过 Js 执行,所以要先将 webDriver 强转成 Js ,// 然后通过 Js 代码来操控滚动条,让滚动条下滑到最下面// scrollTop = 10000 , 指的是让滚动条下滑到末尾,而 = 0 的时候,是滑到顶端/*
* 等待三秒,让浏览器最大化
* */sleep(3000);
webDriver.manage().window().maximize();// 等待三秒,让浏览器全屏sleep(3000);
webDriver.manage().window().fullscreen();// 等待三秒,自定义浏览器大小sleep(3000);
webDriver.manage().window().setSize(newDimension(700,1300));}
这里一系列操作的浏览器执行过程就不进行截图了(截图没法展示完整的效果),感兴趣的话可以复制代码自己运行下
键盘事件方法
sendKeys(Keys.组合键1,"组合键2")
:组合键1指的是例如 CONTROL,ALT,TAB等等这些键,组合键2指的是 “A”,“X”,“C”,"V"等等这些键;
源码如下:
用例:在百度搜索框中输入 发发发 ,然后执行 CONTROL+A,CONTROL+X,CONTROL+V;
privatestaticvoidtest8()throwsInterruptedException{// 键盘操作事件WebDriver webDriver =newChromeDriver();
webDriver.get("https://www.baidu.com");// 搜索
webDriver.findElement(By.cssSelector("#kw")).sendKeys("发发发发");// 在输入框中输入 发发发发// 等待三秒,执行 Control + asleep(3000);
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");// 其中 Control + a 等都是对搜索框中的内容进行操作的// 等待三秒,执行 Control + xsleep(3000);
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X");// 等待三秒,执行 Control + vsleep(3000);
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");}
鼠标点击事件
Actions.moveToElement(指定要被点击的元素).点击方式.perform()
:在 Actions 类中,需要先指定一个被点击的元素,然后通过点击方式进行点击,perform() 用于将点击后的结果显示出来;
点击方式(常见):
click(),click(WebElement onElement)
:左键单击contextClick(),contextClick(WebElement onElement)
:右击doubleClick(), doubleClick(WebElement onElement)
:双击dragAndDrop(WebElement source,WebElement target)
:拖动,将 source 元素 拖动到 target 的位置moveByOffset(int xOffset, int yOffset)、moveToElement(WebElement toElement)、moveToElement(WebElement toElement, int xOffset, int yOffset)
:移动
用例:
- 单击
WebDriver webDriver =newChromeDriver();Actions action =newActions(webDriver);
action.click().perform();// 鼠标左键在当前停留的位置进行单击操作
action.click(driver.findElement(By.选择器)).perform();// 鼠标左键点击指定的元素
- 右击
WebDriver webDriver =newChromeDriver();Actions action =newActions(webDriver);
action.contextClick().perform();// 鼠标右键在当前停留的位置进行单击操作
action.contextClick(driver.findElement(By.选择器)).perform();// 鼠标右键点击指定的元素
- 双击
WebDriver webDriver =newChromeDriver();Actions action =newActions(webDriver);
action.doubleClick().perform();// 鼠标在当前停留的位置进行双击操作
action.doubleClick(driver.findElement(By.选择器)).perform();// 鼠标双击指定的元素
- 拖动
WebDriver webDriver =newChromeDriver();Actions action =newActions(webDriver);
action.dragAndDrop(source,target).perform();// 将 source 元素拖动到 target 元素的位置。
- 移动
WebDriver webDriver =newChromeDriver();Actions action =newActions(webDriver);
action.moveByOffset(xOffset,yOffset).perform();// 以鼠标当前位置或者 (0,0) 为中心开始移动到 (xOffset, yOffset) 坐标轴,xOffset 为横坐标,yOfferset 为纵坐标WebElement toElement = webDriver.findElement(By.cssSelector(""));// 目标元素
action.moveToElement(toElement).perform();// 将鼠标移到 toElement 元素中心
action.moveToElement(toElement,xOffset,yOffset).perform();// 将鼠标移到元素 toElement 的 (xOffset, yOffset) 位置,这里的 (xOffset, yOffset) 是以元素 toElement 左上角为 (0,0) 开始的 (x, y) 坐标轴。
浏览器操作补充
- 关闭浏览器:
close() 和 quiet()
,close() 关闭第一个窗口,不会清理缓存;quiet() 关闭所有窗口并清理缓存; - 获取浏览器新窗口句柄:
WebDriver.getWindowHandles()
,通常与webDriver.switchTo().window(新窗口句柄)
转向新窗口 搭配使用。 原因:当页面转到另一个页面时,此时程序还控制的是之前的页面,而不会对新的页面进行控制,所有需要通过代码让程序转向到控制新的页面 - 对浏览器页面进行截图操作:
WebDriver.getScreenshotAs(输出类型)
用例:
- 关闭浏览器:
WebDriver webDriver =newChromeDriver();
webDriver.close();// webDriver.quit();
- 获取浏览器新窗口句柄:
privatestaticvoidtest2()throwsInterruptedException{// 获取新窗口的句柄; 当浏览器重新跳转到新窗口的时候,需要加载新窗口的句柄,才能在新窗口上进行操作WebDriver webDriver =newChromeDriver();
webDriver.get("https://www.baidu.com/");
webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();// 点击新闻Set<String> handles = webDriver.getWindowHandles();// 获取新窗口句柄String aim ="";for(String handle: handles){
aim = handle;}
webDriver.switchTo().window(aim);// 转向新的窗口sleep(2000);
webDriver.findElement(By.cssSelector("#ww")).sendKeys("黑神话悟空");// 在新闻搜索框中输入黑神话悟空sleep(2000);
webDriver.findElement(By.cssSelector("#s_btn_wr")).click();// 点击进行搜索}
- 截图操作
privatestaticvoidtest3()throwsInterruptedException,IOException{// 对浏览器的页面进行截图操作WebDriver webDriver =newChromeDriver();
webDriver.get("https://www.baidu.com/");
webDriver.findElement(By.cssSelector("#kw")).sendKeys("键盘");
webDriver.findElement(By.cssSelector("#su")).click();sleep(2000);// 进行截图File file =((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);// 以文件内容输出FileUtils.copyFile(file,newFile("E://Screenshot.png"));// 将上述文件放到 E 盘中}
定位一组元素
通过
WebDriver.findElements(选择器)
来进行实现,例如勾选某个页面的多个复选框:
privatestaticvoidPage1(){// 将复选框勾选,单选框不进行任何操作WebDriver webDriver =newChromeDriver();
webDriver.get("http://localhost:63342/TestClass/SeleniumTest/page/test01.html?_ijt=thp9mrlvh9h5fto6af61o491f5&_ij_reload=RELOAD_ON_SAVE");// 这个页面是本地路径List<WebElement> elements = webDriver.findElements(By.cssSelector("input"));// 针对 input 标签进行查找for(int i =0; i < elements.size(); i++){// getAttribute 用于获取页面上元素的属性值,里面的 type 是当前元素的属性值if(elements.get(i).getAttribute("type").equals("checkbox")){
elements.get(i).click();// 进行点击}else{// 啥也不做;}}}
层级定位
用例:找到 click 并点击,结构如下:
privatestaticvoidPage2()throwsInterruptedException{// 点击 iframe 标签中的 click 事件WebDriver webDriver =newChromeDriver();
webDriver.get("http://localhost:63342/TestClass/SeleniumTest/page/test02.html?_ijt=4ldrcatf1t651duqj4b7kdpnie&_ij_reload=RELOAD_ON_SAVE");// 指定 id 为 f1 的 iframe 标签
webDriver.switchTo().frame("f1");// 对于 iframe 标签需要指定事件是在哪个 iframe 标签中。 参数为 iframe 标签的 idsleep(2000);
webDriver.findElement(By.cssSelector("body > div > div > a")).click();// 执行点击事件}
下拉框处理
通过
Select.selectBy方法()
进行查找:
select.selectByValue(String value)
:通过标签里面的 Value 值来进行查找;select.selectByIndex(int index);
:通过 index 来进行查找;selectByVisibleText(String text)
:通过匹配到的可见字符来进行查找,其中 text 值就是页面下拉框肉眼看到的选项
用例:
privatestaticvoidPage3(){// 针对下拉框的操作 WebDriver webDriver =newChromeDriver();
webDriver.get("http://localhost:63342/TestClass/SeleniumTest/page/test03.html?_ijt=uu5ud0k9q45om9jks54c33jj6h&_ij_reload=RELOAD_ON_SAVE");WebElement webElement = webDriver.findElement(By.cssSelector("#ShippingMethod"));Select select =newSelect(webElement);
select.selectByValue("8.34");// 根据 value 查找,找到值为 8.34 的下拉框}
针对 alert 框进行操作
- 取消 alert 弹窗:
WebDriver.switchTo().alert().dismiss()
; - 点击弹窗:
WebDriver.findElement(By.cssSelector("button")).click()
; - 在弹窗中输入内容:
WebDriver.switchTo().alert().sendKeys("")
; - 确认弹窗中的内容:
WebDriver.switchTo().alert().accept()
。
用例:对 alert 框/弹窗 执行上述所有操作
privatestaticvoidPage4()throwsInterruptedException{// 实现 alert 框中的输入,点击,确认,取消事件WebDriver webDriver =newChromeDriver();
webDriver.get("http://localhost:63342/TestClass/SeleniumTest/page/test04.html?_ijt=fgvn5ms2fav9ieesu6d12lekcs&_ij_reload=RELOAD_ON_SAVE");
webDriver.findElement(By.cssSelector("button")).click();sleep(2000);// alert 弹窗取消
webDriver.switchTo().alert().dismiss();sleep(2000);// 点击 alert
webDriver.findElement(By.cssSelector("button")).click();sleep(2000);// 在 alert 弹窗中输入内容
webDriver.switchTo().alert().sendKeys("alert 输入框");sleep(2000);// 对输入的内容进行确认
webDriver.switchTo().alert().accept();}
实现文件上传
WebDriver.findElement(By.cssSelector("")).sendKeys("文件目录")
通过send_keys 添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在。
用例:将电脑中的任意文件进行上传
privatestaticvoidPage5(){// 实现文件的上传WebDriver webDriver =newChromeDriver();
webDriver.get("http://localhost:63342/TestClass/SeleniumTest/page/test05.html?_ijt=gitonvvonlr9avqffkoprbkilu&_ij_reload=RELOAD_ON_SAVE");
webDriver.findElement(By.cssSelector("input")).sendKeys("C:\\Users\\lenovo\\Pictures\\Camera Roll");// 上传本地文件}
总结即目录,创作不易,若对您有所帮助那就点个赞呗!!!
版权归原作者 small_snowball 所有, 如有侵权,请联系我们删除。