目录
1.元素的定位
web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体的操作。
常见的元素定位方式非常多,如id,classname,tagname,xpath,cssSelector
常用的主要由cssSelector和xpath
1.1cssSelector
选择器的功能:选中页面指定的标签元素
选择器的种类分为基础选择器和复合选择器,常见的元素定位方式可以通过id选择器和子类选择去来进行定位。
定位百度首页的“百度热搜”元素,可以使用通过id选择题和子类选择器进行定位:#s-hotsearch-wrapper>div
“搜索输入框元素”:#kw
“百度一下按钮”:#su
1.2 xpath
XML路径语言,不仅可以在XML文件中查找信息,还可以在HTML中选取节点。
xpath使用路径表达式来选择xml文档中的节点。
xpath语法中:
1.2.1获取HTML页面所有的节点
//*
1.2.2 获取HTML页面指定的节点
//[指定节点]
//ul:获取HTML页面所有的ul节点
//input:获取HTML页面所有的input节点
1.2.3 获取一个节点中的直接子节点
/
//span/input
1.2.4 获取一个节点的父节点
..
// input/..获取input节点的父节点
1.2.5实现节点属性的匹配
[@...]
//*[@id='kw']匹配HTML页面中id属性为kw的节点
1.2.6使用指定索引的方式获取对应的节点内容
注意:xpath的索引是从1开始的。
百度首页通过://div/ul/li[3]定位到第三个百度热搜标签
注意:元素的定位必须是唯一的。
2.操作测试对象
获取到了页面的元素之后,接下来就是要对元素进行操作。常见的操作有点击、提交、输入、清楚、获取文本。
2.1点击/提交对象
click()
/找到百度⼀下按钮并点击
driver.findElement(By.cssSelector("#su")).click();
2.2模拟按键输入
sendKeys(“”)
1 driver.findElement(By.cssSelector("#kw")).sendKeys("输⼊⽂字");
2.3清除文本内容
输入文本后又想换一个新的关键词,这里就需要用到clear()
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱游戏");
driver.findElement(By.cssSelector("#kw")).clear();
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱学习");
2.4获取文本信息
如果判断获取到的元素对应的文本是否符合预期呢?获取元素对应的文本并打印一下
获取文本信息:getText()
1 String bdtext = driver.findElement(By.xpath("//*[@id="title-
content"]/span[1]")).getText();
2 System.out.println("打印的内容是:"+bdtext);
2.5 获取当前页面标题
getTitle()
2.6 获取当前页面URL
getCurrentUrl()
2.5和2.6都是判断测试页面跳转对不对
3.窗口
当我们手工测试的时候,我们可以通过眼睛来判断当前的窗口是什么,但是对于程序来说它是不知道当前最新的窗口应该是哪一个。对于程序来说他怎么来识别每一个窗口呢?每个浏览器窗口都有一个唯一的属性句柄(handle)来表示,我们就可以通过句柄来切换。
3.1 切换窗口
(1)获取当前页面句柄:
driver.getWindowhandle();
(2)获取所有页面句柄:
driver.getWindowHandles();
(3)切换当前句柄为最新页面:
String curWindow = driver.getWindowHandle();
Set<String> allWindow = driver.getWindowHandles();
for( String w : allWindow){
if(w!=curWindow){
driver.switchTo().window(w);
}
}
注意:执行了driver.close()之前需要切换到未被关闭的窗口。
3.2 窗口设置大小
(1)窗口的大小设置
//窗⼝最⼤化
driver.manage().window().maximize();
//窗⼝最⼩化
driver.manage().window().minimize();
//全屏窗⼝
driver.manage().window().fullscreen();
//⼿动设置窗⼝⼤⼩
driver.manage().window().setSize(new Dimension(1024, 768));
3.3 窗口切换
去掉等待后,获取跳转后的页面元素失败
//获取所有句柄
//获取当前停留⻚⾯句柄
String curWindow = driver.getWindowHandle();
Set<String> allWindow = driver.getWindowHandles();
for( String w : allWindow){
if(w!=curWindow){
driver.switchTo().window(w);
}
}
3.4 屏幕截图
我们的自动化脚本一般部署再机器上自动的去运行,如果我们出现了报错,我们是不知道的,可以通过抓拍来记录当时的错误场景
屏幕截图方法需要额外导入包:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file,new File(filename));
代码演示
//简单版本
File srcfile = driver.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(srcfile,new File("my.png"));
//⾼阶版本
List<String> times = getTime();
//⽣成的⽂件夹路径./src/test/autotest-2022-08-01/goodsbroser-20220801-214130.png
String filename ="./src/test/autotest-"+times.get(0)+"/"+str+"-
"+times.get(1)+".png";
File srcfile = driver.getScreenshotAs(OutputType.FILE);
//把屏幕截图放到指定的路径下
FileUtils.copyFile(srcfile,new File(filename))
3.5 关闭窗口
driver.close();
注意:窗⼝关闭后driver要重新定义
4. 等待
通常代码执行的速度要比页面渲染的速度要快,如果避免因为渲染过慢出现的自动化误报的问题呢?可以使用selenium中提供的三种等待方法:
4.1 强制等待
Thread.sleep()
优点:使用简单,调试的时候比较有效
缺点:影响运行效率,浪费大量的时间
4.2 隐式等待
隐式等待是一种智能等待,他可以规定在查找元素时,在指定时间内不短查找元素如果找到则代码继续执行,直到超时没找到元素才会报错。
implicitlyWait() 参数:Duration类中提供的毫秒、秒、分钟等方法。
示例:
//隐式等待1000毫秒
driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000));
//隐式等待5秒
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
隐式等待作用域时是整个脚本的所有元素。即只要driver对象没有被释放掉(driver.quit()),隐式等待就一直生效。
优点:智能等待,作用于全局
4.3 显示等待
显示等待也是一种智能等待,在指定超时时间范围内只要能满足操作的条件就会继续执行后续代码
new WebDriverWait(driver, Duration.ofSeconds(3)).until($express)
$press:涉及到selenium.support.ui.ExpectedConditions包下的ExpectedConditions类
返回值:boolean
⽰例:
WebDriverWait foo = new WebDriverWait(driver, Duration.ofSeconds(3))
foo.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#id")));
ExpectedConditions预定义⽅法的⼀些⽰例:
• elementToBeClickable(By locator) ‒ ⽤于检查元素的期望是可⻅的并已启⽤,以便您
可以单击它。
• textToBe(Bylocator,String str) - 检查元素。
• presenceOfElementLocated(Bylocator) ‒ 检查⻚⾯的 DOM 上是否存在元素。
• urlToBe(java.lang.String url) ‒ 检查当前⻚⾯的 URL 是⼀个特定的 URL。
WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(10));
boolean ispass = wait.until(ExpectedConditions.textToBe(By.cssSelector("#s-topleft > a:nth-child(1)"), "新闻"));
if(ispass){
System.out.println("测试通过");
}else {
System.out.println("测试失败");
优点:显示等待是智能等待,可以自定义显示等待的条件,操作灵活
缺点:写法复杂
隐式等待和显示等待一起使用效果如何呢?
测试一下:
//隐式等待设置为5s,显⽰等待设置为10s,那么结果会是5+10=15s吗?
SimpleDateFormat sim =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sim.format(System.currentTimeMillis()));
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nthchild(1) > a > span.title-content"));
WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(10));
try{
wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#hotsear
ch-content-wrapper > li:nth-child(1) > a > span.title-content")));
}catch (Exception e){
System.out.println("nosuelement!");
}
System.out.println(sim.format(System.currentTimeMillis()));
结果:重试多次,最终打印的等待时间有10s、11s……
结论:不要混合隐式和显示等待,可能会导致不可预测的等待时间。
5.浏览器导航
常见操作:
(1)打开网站:
// 更⻓的⽅法
driver.navigate().to("https://selenium.dev");
// 简洁的⽅法
driver.get("https://selenium.dev");
(2)浏览器的前进,后退,刷新
driver.navigate().back();
driver.navigate().forward();
driver.navigate().refresh();
6.弹窗
弹窗是在页面找不到任何元素的,这种情况怎么处理?使用selenium提供的Alert接口。
6.1 警告弹窗+确认弹窗
Alert alert = driver.switchTo.alert();
//确认
alert.accept()
//取消
alert.dismiss()
6.2 提示弹窗
Alert alert = driver.switchTo.alert();
alert.sendKeys("hello");
alert.accept();
alert.dismiss();
7. 文件上传
点击文件上传的场景下会弹窗系统窗口,进行文件的选择。
selenium无法识别非Web的控件,上传文件窗口为系统自带,无法识别窗口元素。
但是可以使用sendskeys来上传指定路径的文件,达到的效果是一样的。
WebElement ele = driver.findElement(By.cssSelector("body > div > div >
input[type=file]"));
ele.sendKeys("D:\\selenium2html\\selenium2html\\upload.html");
8.浏览器参数设置
(1)设置无头模式
(2)设置浏览器加载策略
options.setPageLoadStrategy(PageLoadStrategy.NONE);