Selenium
Selenium是什么
1.概念
selenium是用来做web自动化测试的框架
2.特点
- 支持各种浏览器
- 支持各平台
- 支持各种语言
- 有丰富的API
自动化测试是什么
自动化测试是使用专门的软件工具来验证软件解决方案,这通常涉及自动化功能作为测试过程的一部分。
定位元素
对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象。一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪个街
道、楼层、门牌找到这个人。
Selenium提供了8种定位方式:
- id
- name
- class name
- tag name
- link text
- partial link text
- xpath
- css selector
例如,我们去对百度页面的输入框进行测试,定位到输入框,输入软件测试
private static void test() throws InterruptedException, IOException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
//通过id来定位
webDriver.findElement(By.id("kw")).sendKeys("软件测试");
//通过name来定位
webDriver.findElement(By.name("wd")).sendKeys("软件测试");
//通过xpath来定位
webDriver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("软件测试");
//通过css选择器来定位
webDriver.findElement(By.cssSelector(".s_ipt")).sendKeys("软件测试");
}
css选择器
id选择器:#id
类选择器:.class
标签选择器:标签名,例如input、h3等
后代选择器:父级选择器,子级选择器
例如:
定位input输入框:
id选择器:#id
WebElement element=webDriver.findElement(By.cssSelector("#kw"));
类选择器:.class
WebElement element=webDriver.findElement(By.cssSelector(".s_ipt"));
标签选择器:标签名
点击名为area的标签
webDriver.findElement(By.cssSelector("area")).click();
后代选择器:父级选择器,子级选择器
点击名为area的标签
webDriver.findElement(By.cssSelector("map>area")).click();
该例子中,map为父级,area为子级
xpath选择器
绝对路径:从根目录开始,是一个完整的路径。
例:D:\demo\img\car.jpg
相对路径:指相对于当前目录的路径。当前工作目录是指用户当前正在工作的目录。在开发中引用js、css、或者图片等,都是使用相对路径。
例如:. ./img/bg.jpg"
查找:
- 相对路径+索引 :
//form[1]/span[1]/input
webDriver.findElement(By.xpath("//form[1]/span[1]/input")).submit();
- 相对路径+属性值 :
//input[@class="s_ipt"]或者//input[@id="kw"]
webDriver.findElement(By.xpath("//input[@class="s_ipt"]")).submit();
- 相对路径+通配符 :
//*[@*="kw"]
webDriver.findElement(By.xpath("//*[@*="kw"]")).submit();
- 相对路径+文本匹配:
//a[text()="新闻"]
webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).submit();
操作对象
清空文本内容clear():
webDriver.findElement(By.cssSelector("#kw")).clear();
输入sendKeys():
webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
单击click():
webDriver.findElement(By.cssSelector("#su")).click();
提交表单submit():
webDriver.findElement(By.cssSelector("#su")).submit();
获取空间大小getSize():
webDriver.findElement(By.cssSelector("title")).getSize();
获取对象的属性值getAttribute(“属性名称”):
String button_value = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
注意:click和submit的区别
如果点击的元素放在form标签中,则使用submit和click的效果都是一致的,否则,就使用click,因为使用submit会报错
窗口定位
WebDriver提供了switchTo().window()方法可以实现在不同的窗口之间切换
webDriver.switchTo().window();
private static void test() 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打开的页面窗口句柄
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);
sleep(3000);
webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
}
添加等待
sleep(强制)休眠:
//表示休眠3秒,单位是毫秒
sleep(3000);
隐式等待:
隐式等待并非一个固定的等待时间,当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长
//隐式等待,TimeUnit.DAYS表示单位为天
webDriver.manage().timeouts().setScriptTimeout(3, TimeUnit.DAYS);
显式等待:
隐式等待和显式等待的区别:
隐式等待等待的是所有的元素,也就是等待把当前的页面元素加载完全
显式等待等待的是一定的条件,即以下例子
//显式等待,等指定元素加载出来了,就结束等待
WebDriverWait wait=new WebDriverWait(webDriver,3000);
wait.until(ExpectedConditions.titleIs("百度一下,你就知道"));
}
打印信息
getTitle():
String title=webDriver.getTitle();
getCurrentUrl():
String url=webDriver.getCurrentUrl();
getText():获取对象文本
webDriver.findElement(By.cssSelector("title")).getText();
浏览器操作
back()浏览器后退:
//浏览器后退
webDriver.navigate().back();
forward()浏览器前进:
//浏览器前进
webDriver.navigate().forward();
refresh()刷新:
//刷新
webDriver.navigate().refresh();
maximize()浏览器最大化:
webDriver.manage().window().maximize();
setSize()设置浏览器高、宽:
根据指定的大小显示
webDriver.manage().window().setSize(new Dimension(width,high));
fullscreen()浏览器全屏:
webDriver.manage().window().fullscreen();
quit()关闭浏览器:
关闭整个浏览器,并且会清空缓存
webDriver.quit();
webDriver.close();
close()关闭窗口:
关闭当前窗口,不会清空缓存
浏览器滚动:
//将浏览器滚动条滑到最顶端
document.documentElement.scrollTop=0
//将浏览器滚动条滑到最底端
document.documentElement.scrollTop=10000
使用说明:
((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
鼠标操作
perform()执行所有Actions中存储的行为
contextClick()右击
moveToElement()移动
doubleClick()双击
dragAndDrop()拖动
Actions(webDriver):
生成用户的行为,所有的行动都存储在Actions对象。通过perform()执行所有Actions中存储的行为
private static void test() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
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();
}
键盘操作
以下为常用的键盘操作:
- 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)
代码 | 键 |
---|---|
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) |
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");//全选
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X");//剪切
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"C");//复制
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");//粘贴
下拉框处理
Select select = new Select(webElement);
select.selectByIndex(下标);//下标从0开始
或select.selectByValue("");//填入属性为value的值
alert、confirm、prompt的处理
text返回alert、confirm、prompt中的文字信息
dismiss()点击取消按钮
accept()点击确认按钮
sendKeys()输入值,如果alert没有对话框就不能用了,不如会报错
注意:switchTo().alert()只能处理原生的alert
alert:
// alert弹窗取消
webDriver.switchTo().alert().dismiss();
// 在alert弹窗中输入
webDriver.switchTo().alert().sendKeys("测试");
// alert弹窗确认
webDriver.switchTo().alert().accept();
//获取文字
webDriver.switchTo().alert().getText();
截图操作
//截图,以文件的形式存储
File file=((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
//存储的文件名
FileUtils.copyFile(file,new File("E://20230901jietu.png"));
上传文件操作
private static void page() {
WebDriver webDriver = new ChromeDriver();
webDriver.get("http://localhost:63342/_20230512testcode/src/main/Page/test05.html?_ijt=7asvni2vctahrdl90k8v4lvq5&_ij_reload=RELOAD_ON_SAVE");
//sendKeys里是上传文件的路径
webDriver.findElement(By.cssSelector("input")).sendKeys("D:\\untitled");
}