一、元素的定位

web⾃动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进⾏具体的操作。
常⻅的元素定位⽅式⾮常多,如 id,classname,tagname,xpath,cssSelector
常⽤的主要由 cssSelector 和 xpath

1.1 cssSelector

选择器的功能:选中页面中指定的标签元素
选择器的种类分为基础选择器和复合选择器,常见的元素定位⽅式可以通过 id选择器 和⼦类选择器来进⾏定位。
1.1.1 id选择器

语法:#id_value,其中id_value是 HTML 元素的id属性值。

1.1.2 子类选择器 

语法:parent_element > child_element,表示选择parent_element元素的直接子元素child_element。例如,ul > li表示选择ul元素的所有直接子元素li。 

以百度页面为例:
定位百度⾸⻚的“百度热搜”元素,可以使⽤通过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] 定位到第三个百度热搜标签

更便捷的生成 selector/xpath 的方式:右键选择复制"Copy selector/xpath" 

注意:元素的定位方法必须唯⼀。

二、操作测试对象

获取到了页面的元素之后,接下来就是要对元素进⾏操作了。常⻅的操作有点击、提交、输⼊、清
除、获取文本。

2.1 点击/提交对象

click()
//找到百度⼀下按钮并点击
driver.findElement(By.cssSelector("#su")).click();

2.2 模拟按键输入

sendKeys("") 

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()
String bdtext = driver.findElement(By.xpath("//*[@id="title-content"]/span[1]")).getText();
System.out.println("打印的内容是:"+bdtext);
文本和属性值不要混淆了。获取属性值需要使用方法 getAttribute("属性名称") ;

2.5 获取当前页⾯标题getTitle()

2.6获取当前⻚⾯URL  getCurrentUrl()

三、窗口

打开⼀个新的⻚⾯之后获取到的title和URL仍然还是前⼀个⻚⾯的?
当我们⼿⼯测试的时候,我们可以通过眼睛来判断当前的窗⼝是什么,但对于程序来说它是不知道当前最新的窗⼝应该是哪⼀个。对于程序来说它怎么来识别每⼀个窗⼝呢?每个浏览器窗口都有⼀个唯⼀的属性句柄(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 窗口设置大小

//窗⼝最⼤化
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要重新定义

四、等待

通常代码执⾏的速度⽐⻚⾯渲染的速度要快,如果避免因为渲染过慢出现的⾃动化误报的问题呢?可以使⽤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")));
优点:显⽰等待是智能等待,可以⾃定义显⽰等待的条件,操作灵活
缺点:写法复杂

不要混合隐式和显式等待,可能会导致不可预测的等待时间

五、浏览器导航

1)打开⽹站

// 更⻓的⽅法
driver.navigate().to("https://selenium.dev");
// 简洁的⽅法
driver.get("https://selenium.dev");

2)浏览器的前进、后退、刷新

driver.navigate().back();   //后退
driver.navigate().forward();   //前进
driver.navigate().refresh();   //刷新

六、弹窗

弹窗是在⻚⾯是找不到任何元素的,这种情况怎么处理?使⽤selenium提供的Alert接⼝

6.1 警告弹窗+确认弹窗

6.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");

八、浏览器设置无头模式.

无头浏览器的主要应用场景

无头浏览器主要应用在: GUI 自动化测试、页面监控、网络爬虫以及没有桌面的linux系统中。在这里我们重点说一下 GUI 自动化测试,在 GUI 测试过程中,使用无头浏览器的好处主要体现在以下几个方面:

测试执行速度更快。 无头浏览器无需加载 CSS 以及渲染页面,在测试用例的执行速度上有很大的优势。

减少对测试执行的干扰。 可以减少操作系统以及其他软件(比如杀毒软件等)不可预期的弹出框,对浏览器测试的干扰。

一台机器上同时运行不同厂商的无头浏览器(无头浏览器占用内存资源,要比正常浏览器小),实现测试用例的并发执行。

缺点:

不能完全模拟真实的用户行为

不便于调试(各个浏览器的开发者工具)

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐