
一、元素的定位
web自动化测试的核心操作是能够找到页面对应的元素,然后才能对元素进行具体的操作。
常见的元素定位方式非常多,如:id,classname,tagname,xpath,cssSelector
常见有cssSelector和xpath
1. cssSelector
选择器的功能:选中页面中指定的标签元素
选择器的种类分为基础选择器和复合选择器,常见的元素定位方式可以通过id选择器和子类选择器来进行定位。
2.xpath
2.1 获取HTML页面所有的节点
//*
2.2 获取HTML页面指定的节点
//[ 指定节点 ]
//ul :获取HTML页面所有的ul节点
//input :获取HTML页面所有的input节点
2.3 获取一个节点中的直接子节点
/
//span/input
2.4 获取一个节点的父节点
..
//input/.. 获取input节点的父节点
2.5 实现节点属性的匹配
[ @ ... ]
//*[@id='kw'] 匹配HTML页面中id属性为kw的节点
2.6 使用指定索引的方式获取对应的节点内容
注意:xpath的索引是从1开始的。
百度首页通过://div/ul/li[3]定位到第三个百度热搜标签
便捷生成selector/xpath的方法:右键选择复制“Copy selector/xpath”
注:元素的定位方法唯一
二、操作测试对象
1.点击/提交对象
click()
//找到百度一下按钮并点击
driver.findElement(By.cssSelector("#su")).click();
2. 模拟按键输入
sendKeys(" ")
driver.findElement(By.cssSelector("#kw")).sendKeys("输入文字");
3. 清除文本内容
clear()
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱游戏");
driver.findElement(By.cssSelector("#kw")).clear();
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱学习");
4. 获取文本信息
getText()
5. 获取当前页面标题
getTitle()
6. 获取当前页面url
getCurrentUrl()
三、窗口
每个浏览器窗口都有一个唯一的属性句柄(handle)来表示,
我们可以通过句柄来切换窗口。
1.切换窗口
1.1 获取当前页面句柄:
driver.getWindowHandle();
1.2 获取所有页面句柄:
driver.getWindowHandles();
切换当前句柄为最新页面:
String curWindow = driver.getWindowHandle();
Set<String> allWindow = driver.getWindowHandles();
for(String w : allWindow) {if(w!=curWindow) {driver.switchTo().window(w);}
}
注:执行了driver.close()之前需要切换到未被关闭的窗口
2.窗口设置大小
//窗口最大化
driver.manage().window().maximize();
//窗口最小化
driver.manage().window().minimize();
//全屏窗口
driver.manage().window().fullscreen();
//手动设置窗口大小
driver.manage().window().setSize(new Dimension(1024,768));
3.窗口切换
去掉等待后,获取跳转后的页面元素失败
//获取所有句柄
//获取当前停留页面句柄
String curWindow = driver.getWindowHandle();
Set<String> allWindow = driver.getWindowHandles();
for(String w : allWindow) {if(w!=curWindow) {driver.switchTo().window(w);}
}
4.屏幕截图
File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file,new File(filename));
5.关闭窗口
driver.close();
注:窗口关闭后driver要重新定义
四、等待
1.强制等待
Thread.sleep()
优点:使用简单,测试时比较有效
缺点:影响运行效率,浪费大量时间
2.隐式等待
隐式等待是一种智能等待,可以规定在查找元素时,在指定时间内不断查找元素。如果找到则代码继续执行,直到超时没找到元素才会报错。
implicitlyWait() 参数:Duration类中提供的毫秒、秒、分钟等方法
//隐式等待1000毫秒
driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000));
//隐式等待5秒
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
隐式等待作用域是整个脚本的所有元素。只要driver对象没有被释放掉,隐式等待就一直生效。
优点:智能等待,作用于全局
3.显式等待
显式等待也是智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续代码。
new WebDriverWait(driver,Duration.ofSeconds(3)).until($express)
WebDriverWait foo = new WebDriverWait(driver,Duration.ofSeconds(3))
foo.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#id")));
优点:智能等待,可以自定义显示等待的条件,操作灵活
缺点:写法复杂
4.显式等待和隐式等待混用
二者混用,可能会导致不可预测的等待时间
五、浏览器导航
1.打开网站
//方法一
driver.navigate().to("https://selenium.dev");
//方法二
driver.get("https://selenium.dev");
2.浏览器的前进、后退、刷新
driver.navigate().back();
driver.navigate().forward();
driver.navigate().refresh();
六、弹窗
弹窗在页面找不到任何元素,那我们该如何处理这种情况呢?
可以使用Selenium提供的Alert接口
1.警告弹窗 + 确认弹窗
Alert alert = driver.switchTo.alert();
//确认
alert.accept()
//取消
alert.dismiss()
2.提示弹窗
Alert alert = driver.switchTo.alert();
alert.sendKeys("hello");
alert.accept();
alert.dismiss();
七、文件上传
点击文件上传的场景下会弹出系统窗口,进行文件的选择。
Selenium无法识别非web的控件,上传文件窗口为系统自带,无法识别窗口元素,
但是可以使用sendkeys来上传指定路径的文件,达到的效果是一样的。
WebElement ele = driver.findElement(By.cssSelector("body > div > div >
input[type=file]"));
ele.sendKeys("D:\\selenium2html\\selenium2html\\upload.html");