web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体的操作。
常见的元素定位方式非常多,如id,classname,tagname,xpath,cssSelector
常用的主要由cssSelector和xpath
选择器的功能:选中页面中指定的标签元素
选择器的种类分为基础选择器和复合选择器,常见的元素定位方式可以通过id选择器和子类选择器来进行定位。

定位百度首页的“百度热搜”元素,可以使用通过id选择器和子类选择器进行定位:#s-hotsearch- wrapper >div
“搜索输入框元素”:#kw
“百度一下按钮”:#su
XML路径语言,不仅可以在XML文件中查找信息,还可以在HTML中选取节点。
xpath使用路径表达式来选择xml文档中的节点

xpath语法中:
1)获取HTML页面所有的节点: //*
2)获取HTML页面指定的节点://[ 指定节点 ]
//ul :获取HTML页面所有的ul节点 //input:获取HTML页面所有的input节点
3)获取一个节点中的直接子节点:/
//span/input
4)获取一个节点的父节点:..
//input/.. 获取input节点的父节点
5)实现节点属性的匹配:[@...]
//*[@id='kw'] 匹配HTML页面中id属性为kw的节点
6)使用指定索引的方式获取对应的节点内容
#注:xpath的索引是从1开始的。
百度首页通过://div/ul/li[3] 定位到第三个百度热搜标签
更便捷的生成 selector/xpath 的方式:右键选择复制 "Copy selector/xpath"
#注:元素的定位方法必须唯一。
案例:如果想要匹配到百度首页指定的新闻文本或者节点集:,直接使用 #hotsearch-content-wrapper > li 能够满足吗?
问题:既然可以手动复制 selector/xpath 的方式 ,为什么还有了解语法?
手动复制的selector/xpath表达式并不一定满足上面的唯一性的要求,有时候也需要手动的进行修改表达式
案例:百度首页(需要登陆百度账号)右侧的热搜,复制li标签下的a标签,复制好的的selector为: #title-content ,xpath为: //*[@id="title-content"] ,大家可以手动操作一下, 手动复制的表达式是否唯一呢?
获取到了页面的元素之后,接下来就是要对元素进行操作了。常见的操作有点击、提交、输入、清除、获取文本。
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()
String bdtext = driver.findElement(By.xpath("//*[@id="title-content"]/span[1]")).getText();
System.out.println("打印的内容是:"+bdtext);#注:文本和属性值不要混淆了。获取属性值需要使用方法 getAttribute (" 属性名称 ") ;
5、获取当前页面标题:getTitle()
6、获取当前页面URL:getCurrentUrl()
打开一个新的页面之后获取到的title和URL仍然还是前一个页面的?
当我们手工测试的时候,我们可以通过眼睛来判断当前的窗口是什么,但对于程序来说它是不知道当前最新的窗口应该是哪一个。对于程序来说它怎么来识别每一个窗口呢?每个浏览器窗口都有一个唯一的属性句柄(handle)来表示,我们就可以通过句柄来切换。
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()之前需要切换到未被关闭的窗口
1)窗口的大小设置
//窗⼝最⼤化
driver.manage().window().maximize();
//窗⼝最⼩化
driver.manage().window().minimize();
//全屏窗⼝
driver.manage().window().fullscreen();
//⼿动设置窗⼝⼤⼩
driver.manage().window().setSize(new Dimension(1024, 768));我们的自动化脚本一般部署在机器上自动的去运行,如果出现了报错,我们是不知道的,可以通过抓拍来记录当时的错误场景
屏幕截图方法需要额外导入包:
<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));driver.close();
#注:窗⼝关闭后driver要重新定义