【自动化测试函数 (上)】Web自动化测试实战精要:定位、操作与窗口管理三部曲

🔥艾莉丝努力练剑:个人主页
❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶、测试开发要点全知道
⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平
🎬艾莉丝的简介:

🎬艾莉丝的测试开发博客简介:
 
目录
1 ~> 元素的定位
1.1 cssSelector
1.2 xpath
1.2.1 获取HTML页面所有的节点
1.2.2 获取HTML页面指定的节点
1.2.3 获取一个节点中的直接子节点
1.2.4 获取一个节点的父节点
1.2.5 实现节点属性的匹配
1.2.6 使用指定索引的方式获取对应的节点内容
2 ~> 操作测试对象
2.1 点击 / 提交对象
2.2 模拟案件发生
2.3 清除文本内容
2.4 获取文本信息
2.5 获取当前页面标题
2.6 获取当前页面URL
3 ~> 窗口
3.1 切换窗口
3.1.1 获取当前页面句柄
3.1.2 获取所有页面句柄
3.1.3 切换当前句柄为最新页面
3.1.4 若页面发生跳转后未打开新的标签页,则不需要进行窗口的切换
3.2 窗口设置大小
3.2.1 窗口的大小设置
3.3 屏幕截图
3.4 关闭窗口
4 ~> 弹窗
4.1 警告弹窗 + 确认弹窗
4.2 提示窗口
结尾

1 ~> 元素的定位

web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体的操作。
常见的元素定位方式非常多,如id,classname,tagname,xpath,cssSelector等等:
其中最为常用的主要是cssSelector和xpath。

1.1 cssSelector
选择器的功能:选中页面中指定的标签元素。
选择器的种类分为基础选择器和复合选择器,常见的元素定位方式可以通过id选择器和子类选择器来进行定位。
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]定位到第三个百度热搜标签
更便捷的生成selector/xpath的方式:右键选择复制"Copyselector/xpath"
案例:如果想要匹配到百度首页指定的新闻文本或者节点集:直接使用#hotsearch-content-
 wrapper>li能够满足吗?
问题:既然可以手动复制selector/xpath的方式,为什么还有了解语法?
手动复制的selector/xpath表达式并不一定满足上面的唯一性的要求,有时候也需要手动的进行修改表达式。
案例:百度首页(需要登陆百度账号)右侧的热搜,复制li标签下的a标签,复制好的selector为:#title-content,xpath为://*[aid="title-content"],同学们可以手动操作一下,手动复制的表达式是否唯一呢?
鼠标直接复制可以解决问题,但是难免后面会需要手动的修改/编写选择器元素、xpath元素,因此我们对选择器和xpath要有定的了解。
2 ~> 操作测试对象
获取到了页面的元素之后,接下来就是要对元素进行操作了。常见的操作有点击、提交、输入、清除、获取文本。
2.1 点击 / 提交对象
click()
#找到百度⼀下按钮并点击 
driver.find_element(By.CSS_SELECTOR, "#su").click()
2.2 模拟案件发生
send_keys("")
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("迪丽热巴")
2.3 清除文本内容
输入文本后又想换一个新的关键词,这里就需要用到clear()。
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("迪丽热巴")
time.sleep(1)
driver.find_element(By.CSS_SELECTOR,"#kw").clear()
time.sleep(1)
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("古⼒娜扎")
2.4 获取文本信息
如果判断获取到的元素对应的文本是否符合预期呢?获取元素对应的文本并打印一下。
获取文本信息:text
text = driver.find_element(By.XPATH,'//*[@id="hotsearch-contentwrapper"]/li[1]/a/span[2]').text
print(f"text:{text}")问题:是否可以通过text获取到“百度一下按钮”上的文字“百度一下”呢?uu们可以尝试一下!
注意:文本和属性值不要混淆了。
获取属性值需要使用方法:get_attribute("属性名称")。

2.5 获取当前页面标题
title
title = driver.title
2.6 获取当前页面URL
current_url
url = driver.current_url3 ~> 窗口

打开一个新的页面之后获取到的title和URL仍然还是前一个页面的?
当我们手工测试的时候,我们可以通过眼睛来判断当前的窗口是什么,但对于程序来说它是不知道当前最新的窗口应该是哪一个。对于程序来说它怎么来识别每一个窗口呢?每个浏览器窗口都有一个唯一的属性句柄(handle)来表示,我们就可以通过句柄来切换。
3.1 切换窗口

3.1.1 获取当前页面句柄
driver.current_window_handle
3.1.2 获取所有页面句柄
driver.window_handles

3.1.3 切换当前句柄为最新页面
curWindow = driver.current_window_handle
allWindows = driver.window_handlesfor window in allWindows:if window != curWindow:driver.switch_to.window(window)注意:执行了driver.close()之前需要切换到未被关闭的窗口。
3.1.4 若页面发生跳转后未打开新的标签页,则不需要进行窗口的切换

3.2 窗口设置大小
3.2.1 窗口的大小设置
#窗⼝最⼤化 
driver.maximize_window()
#窗⼝最⼩化 
driver.minimize_window()
#窗⼝全屏 
driver.fullscreen_window()
#⼿动设置窗⼝⼤⼩ 
driver.set_window_size(1024,768)仅做了解即可,在自动化脚本执行过程中通常测试人员不关注页面的变化。
3.3 屏幕截图
我们的自动化脚本一般部署在机器上自动的去运行,如果出现了报错,我们是不知道的,可以通过抓拍(screenshot)来记录当时的错误场景。
driver.save_screenshot('../images/image.png')
代码演示如下——
#简单版本 
driver.save_screenshot('../images/image.png')
#⾼阶版本 
filename = "autotest-"+datetime.datetime.now().strftime('%Y-%m-%d-
%H%M%S')+'.png'
driver.save_screenshot('../images/'+filename)
3.4 关闭窗口
driver.close()
注意:窗⼝关闭后driver要重新定义
4 ~> 弹窗
弹窗是在页面是找不到任何元素的,这种情况怎么处理?使用selenium提供的Alert接口。
4.1 警告弹窗 + 确认弹窗

alert = driver.switchTo.alert
//确认
alert.accept()
//取消
alert.dismiss()4.2 提示窗口

alert = driver.switchTo.alert
alert.send_keys("hello")
alert.accept()
alert.dismiss()
结尾
本文的内容到这里就全部结束了,感谢您的阅读!
往期回顾:
【自动化测试:概念】初识自动化测试:从概念理论到上手实践
【测试分类 (下)】测试分类看这篇就够了:彻底告别概念混淆,轻松搞定工作面试
结语:本期我们学习了测试开发/测试内容中的自动化测试常用函数篇,希望对学习测试开发/测试相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!
🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡
૮₍ ˶ ˊ ᴥ ˋ˶₎ა

