Selenium自动化框架介绍
Selenium是一款是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,模拟真实用户操作浏览器进行交互。支持大部分主流浏览器(IE、GoogleChrome、火狐、Safari等等)和其版本。可以通过Selenium测试项目与不同浏览器的兼容性(在不同浏览器和操作系统上是否能正常与运行),支持多种编程语言(Java、Python等)检验软件功能和用户需求。
Selenium的底层工作原理
Selenium的运行流程是调用对应浏览器驱动去进行控制操作浏览器。Selenium底层就是对浏览器driver的二次封装,调用driver中的及接口再利用浏览器原生API,封装成一套Selenium WebDriver API,而使用浏览器原生API,直接操作浏览器中的元素,也能让速度大大提升,同时大部分主流浏览器的驱动都遵守WebDriver规范,所以Selenium可以兼容多种不同浏览器驱动。
Selenium基本操作
1.元素定位
Selenium的定位主要是通过目标元素的属性值或者元素在页面中的路径,id和name具有唯一性所以在元素定位中它们的精准度相对较高,通常来说多层嵌套下的元素直接复制xpath来进行定位即可,如果要定位多个元素只需要修改为driver.findElements()。
2.元素交互
Selenium可以通过定位元素后对元素进行操控,模拟真实用户对浏览器进行操作交互。
click 点击对象
send_keys 在对象上模拟按键输入
clear 清除对象输入的文本内容
submit 提交
text 用于获取元素的文本信息
private static void test() throws InterruptedException {
// 打开百度首页
webDriver.get("https://www.baidu.com");
// 利用类选择器定位元素,百度输入框
WebElement element = webDriver.findElement(By.cssSelector("#kw"));
element.sendKeys("测试");
sleep(2000);
// 输入内容进行点击
webDriver.findElement(By.cssSelector("#su")).click();
sleep(2000);
}
3.添加等待
sleep休眠
sleep是让页面强制等待,通常来说测试过程中网速问题或者服务器响应问题导致页面元素未加载,此时的解决方案就可以增加sleep()等待元素加载完成之后再进行后续操作。
隐式等待
通过添加driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS)的方法去添加隐式等待,通过隐式等待,WebDriver在试图查找_任何_元素时在一定时间内轮询DOM。当网页上的某些元素不是立即可用并且需要一些时间来加载时是很有用的。
4.浏览器操作
back() 模拟浏览器后退按钮
forward() 模拟浏览器前进按钮
refresh() 刷新页面(F5)
maximize() 设置浏览器最大化
setSize() 设置浏览器宽高
private static void test() throws InterruptedException {
webDriver.findElement(By.cssSelector("#kw")).sendKeys("你好");
// 点击
webDriver.findElement(By.cssSelector("#su")).click();
// 浏览器后退
sleep(2000);
webDriver.navigate().back();
// 浏览器刷新
sleep(2000);
webDriver.navigate().refresh();
// 浏览器前进
sleep(2000);
// 浏览器显示最大化
webDriver.manage().window().maximize();
sleep(2000);
// 浏览器全屏
webDriver.manage().window().fullscreen();
sleep(2000);
// 按照指定大小来显示
webDriver.manage().window().setSize(new Dimension(800,800))
webDriver.navigate().forward();
}
5.键盘操作
sendKeys(Keys.BACK_SPACE) 回格键(BackSpace)
sendKeys(Keys.SPACE) 空格键 (Space)
sendKeys(Keys.TAB) 制表键 (Tab)
sendKeys(Keys.ESCAPE) 回退键(Esc)
sendKeys(Keys.ENTER) 回车键(Enter)
sendKeys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
sendKeys(Keys.CONTROL,‘c’) 复制(Ctrl+C)
sendKeys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)
sendKeys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
private static void test() throws InterruptedException {
webDriver.findElement(By.cssSelector("#kw")).sendKeys("你好");
// 测试Ctrl+A
sleep(2000);
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "A");
// 测试Ctrl+X
sleep(2000);
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "X");
// 测试Ctrl+V
sleep(2000);
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "V");
// 点击
sleep(2000);
webDriver.findElement(By.cssSelector("#su")).click();
}
6.鼠标操作
contextClick() 右击
clickAndHold() 鼠标点击并控制
doubleClick() 双击
dragAndDrop() 拖动
release() 释放鼠标
perform() 执行所有Actions中存储的行为
private static void test() throws InterruptedException {
webDriver.findElement(By.cssSelector("#kw")).sendKeys("你好");
// 点击百度一下按钮
webDriver.findElement(By.cssSelector("#su")).click();
sleep(2000);
//找到测试鼠标右键点击"网页"
WebElement webElement = webDriver.findElement(By.cssSelector("#s_tab > div > b"));
// 鼠标右击
Actions actions = new Actions(webDriver);
sleep(2000);
actions.moveToElement(webElement).contextClick().perform();
}
7.切换窗口句柄
页面点击后有时会以新窗口打开,此时我们的元素定位依然在当前窗口,这时就需要切换到新打开的窗口上进行操作。WebDriver提供switchTo().window()方法可以实现在不同的窗口之间切换。
private static void test() {
// 点击百度页面的新闻按钮
webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
// getWindowHandles获取所以得窗口句柄
// getWindowHandles获取当前页面的窗口句柄
// System.out.println(webDriver.getWindowHandle());
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("你好");
webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
}
8.窗口截图
程序在执行自动化用例中,打印的错误信息不是很好分析,可以在执行过程中使用窗口截图来记录保存,使用getScreenshotAs()来截取当前窗口。
private static void test() throws IOException, InterruptedException {
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,new File("D://selenium/t01.png"));
}
9.上传文件
使用input实现的上传功能,只需要把他看作一个输入框,通过sendKey()指定本地文件路径来实现上传,如果想要实现点击弹窗来选择本地文件,可以搭配AutoIT脚本来实现对window的操作,使用java代码在自动化代码中执行.exe脚本来实现。
private static void test() {
webDriver.get("http://39.104.54.203:58880");
// sendKeys里是上传文件的路径
webDriver.findElement(By.cssSelector("input")).sendKeys("D:\\Bin\\xnn_res");
}
常见问题
1.弹窗处理
JavaScript 有三种弹窗 alert (警告框) 、confirm (确认框) 、prompt (提框)alert (警告框)和confirm (确认框)的处理步骤:
使用 driver.switchTo ().alert ( 切换到警告框的上下文.
使用 accept () 方法接受警告框 (确认框) 或 dismiss ( 方法关闭警告 (确认框)
2.滚动条
Java +selenium 页面弹框中有滚动条,元素未找到问题,有时候明明页面中存在元素,但因为元素处于页面下方,不在当前显示出来的部分中,这是因为 Selenium 默认只会查找可见的元素,而滚动条中的元素处于不可见状态,这里采用在定位元素前进行一次滚动操作,让元素进入可见区域在进行元素定位。
public static void scrollToElement(WebDriver driver, WebElement element) {
JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
jsExecutor.executeScript("arguments[0].scrollIntoView(true);", element);
}
也可以直接执行Js语句,(x,y) x和y都是必填参数,x正数表示向右负数表示向左,y正数表示向下负数表示向上
//(0,1000)表示直接到浏览器底部
driver.executeScript("window.scrollTo(0,1000)");