【软件测试】第7章 自动化测试常用函数(上)

片头

嗨!小伙伴们,今天咱们一起来学习第7章 自动化测试常用函数,准备好了吗?咱们开始咯~


一、元素的定位

web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体的操作

常见的元素定位方式非常多,如:id、classname、tagname、xpath、cssSelector

常用的主要由cssSelector和xpath

1.1 cssSelector

选择器的功能:选中页面中指定的标签元素

选择器的种类分为基础选择器和复合选择器,常见的元素定位方式可以通过id选择器和子类选择器来进行定位

定位百度首页的"百度热搜"元素,可以使用通过id选择器和子类选择器进行定位:

#s-hotsearch-wrapper > div > a.hot-title > div > img

"搜索输入框元素":#chat-textarea

"百度一下按钮":#chat-submit-button

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开始的

百度首页通过://*[@id="hotsearch-content-wrapper"]/li[7]/a/span[2],定位到第3个百度热搜标签

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

案例:如果想要匹配到百度首页指定的新闻文本或者节点集,直接使用 #hotsearch-content-wrapper > li 能够满足吗?

**Q:**既然可以手动复制selector/xpath的方式,为什么还要了解语法?

**A:**手动复制的selector/xpath表达式并不一定满足上面的唯一性的要求,有时候也需要手动的进行修改表达式

案例:百度首页(需要登陆百度账号)右侧的热搜,复制li标签下的a标签,复制好的selector为:

#title-content,xpath为:/ / *[@id="title-content"],大家可以手动操作一下,手动复制的表达式是否唯一呢?


补充:查找元素

查找元素,我们有2种查找方式:

python 复制代码
find_element(方式,"元素") #查找1个元素
find_elements(方式,"元素") #查找多个元素

若要获取页面中多个元素时,可以使用 find_elements

python 复制代码
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager


#1、打开浏览器 --- 驱动管理
ChromeIns = ChromeDriverManager().install()

#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))

driver.get("https://www.baidu.com")
ret = driver.find_elements(By.CSS_SELECTOR,"#s-hotsearch-wrapper")
for i in ret:
    print(i.text) #获取每个元素对应的文本信息

driver.quit()

查找元素的方式:选择器、XPATH、ID、classname

常用的主要由css_selector和xpath


二、操作测试对象

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

2.1 点击/提交对象

页面上任意位置/元素都可以实现点击操作

click()

python 复制代码
#点击事件
#查找元素 + 点击元素
driver.find_element(By.CSS_SELECTOR,"#chat-submit-button").click() #连写
ele = driver.find_element(By.CSS_SELECTOR,"#chat-submit-button")   #拆开写
ele.click()
2.2 模拟按键输入

模拟键盘输入,因此键盘上可以输入的内容都可以填写上去

send_keys(" ")

python 复制代码
#查找元素 + 输入文本
driver.find_element(By.CSS_SELECTOR,"#chat-textarea").send_keys("迪丽热巴")  #连写
ele = driver.find_element(By.CSS_SELECTOR,"#chat-textarea")                 #分开写
ele.send_keys("迪丽热巴")
2.3 清除文本内容

输入文本后又想换一个新的关键词,这里就需要用到 clear()

python 复制代码
driver.find_element(By.CSS_SELECTOR,"#chat-textarea").send_keys("迪丽热巴")
time.sleep(1)
driver.find_element(By.CSS_SELECTOR,"#chat-textarea").clear()  #清除输入框中的内容
time.sleep(1)
driver.find_element(By.CSS_SELECTOR,"#chat-textarea").send_keys("古力娜扎")
2.4 获取文本信息

如何判断获取到的元素对应的文本是否符合预期呢?获取元素对应的文本并打印一下~

获取文本信息:text

python 复制代码
#获取文本信息: text
text = driver.find_element(By.XPATH,'//*[@id="hotsearch-content-wrapper"]/li[7]/a/span[2]').text
print(text)

获取到元素对应的文本信息后,通过断言assert来判断文本是否符合预期

python 复制代码
#获取文本信息: text
text = driver.find_element(By.XPATH,'//*[@id="hotsearch-content-wrapper"]/li[7]/a/span[2]').text
print(text)
#验证文本信息是否符合预期
assert text == "全力应对台风桦加沙"

**Q:**是否可以通过text获取到"百度一下按钮"上的文字"百度一下"呢?

**A:**元素属性值 != 文本信息,获取属性值需要使用方法 get_attribute("属性名称")

python 复制代码
#获取百度一下按钮上的文字
#message = driver.find_element(By.CSS_SELECTOR,"#chat-submit-button").text   #这里获取不到对应的"百度一下"属性值
message = driver.find_element(By.CSS_SELECTOR,"#chat-submit-button").get_attribute("value")
print(message)

总结:获取属性值:get_attribute(属性)

2.5 获取当前页面标题

title

python 复制代码
title = driver.title
2.6 获取当前页面URL

current_url

python 复制代码
url = driver.current_url

适用场景:页面元素可点击跳转的情况下,用来检测跳转的结果是否是正确的


三、窗口

我们先做一个小练习,在谷歌浏览器打开"百度一下"页面,打印此时的页面标题和URL;

再点击"图片"链接,打印当前的页面标题和URL。为什么2次打印的结果相同呢?

为什么打开一个新的页面之后获取到的title和url仍然是前一个页面的?

当我们手工测试的时候,我们可以通过眼睛来判断当前的窗口是什么,但对于程序来说,它是不知道当前最新的窗口应该是哪一个。

对于程序来说,它怎么来识别每一个窗口呢?每个浏览器窗口都有一个唯一的属性句柄(handle)来表示,我们就可以通过句柄来切换

3.1 切换窗口

(1)获取当前页面句柄

python 复制代码
driver.current_window_handle

(2)获取所有页面句柄

python 复制代码
driver.window_handles

(3)切换当前句柄为最新页面

python 复制代码
curWindow = driver.current_window_handle
allWindows = driver.window_handles

for window in allWindows:
    if window != curWindow:
        driver.switch_to.window(window)

举个例子吧~

我在"百度一下"页面点击"图片"链接,从而打开了新的标签页"百度图片"

但此时浏览器的句柄(handle)还停留在"百度一下"页面,我们必须手动更改最新窗口为"百度图片",因此我们可以通过句柄来切换

python 复制代码
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

#1、打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))
driver.get("https://www.baidu.com")

#点击百度首页的图片功能,跳转到百度图片页面
print("before: "+ driver.title)           #百度首页的标题
print("before: "+ driver.current_url)    #百度首页的URL
driver.find_element(By.CSS_SELECTOR,"#s-top-left > a:nth-child(6)").click()  #点击百度图片链接

#获取当前页面的句柄---第一个标签页
curHandle = driver.current_window_handle
#获取所有句柄
allHandle = driver.window_handles
#遍历所有的句柄,切换到新的页面
for handle in allHandle:
    if handle != curHandle:
        #切换句柄
        driver.switch_to.window(handle)

#测试跳转结果
print("after: "+driver.title)           #百度图片的标题
print("after: "+driver.current_url)     #百度图片的url

也许你会有疑问:是否存在打开了多个标签页,切换到某一个标签页的场景呢?

这种情况在测试中不常见~

1、通常情况下,一般会打开2个标签页,实现标签页的切换模式

2、更多时候,直接输入对应页面的链接在当前标签页下进行测试

注意:

① 若页面发生跳转后未打开新的标签页,则不需要进行窗口的切换

② 执行了 driver.close() 之前需要切换到未被关闭的窗口

python 复制代码
print("befor:"+driver.title)            #百度图片的标题
print("befor:"+driver.current_url)      #百度图片的URL
driver.find_element(By.CSS_SELECTOR,"#wrapper_main_box > div.wrapper_userinfo_box > div.bidu_top_user_info > div.sites > a:nth-child(2)").click()
time.sleep(3)
print("after:"+driver.title)            #hao123的标题
print("after:"+driver.current_url)      #hao123的url

片尾

今天我们学习了【软件测试】第7章 自动化测试常用函数,希望对看完文章的友友们有所帮助!!!

点赞收藏加关注!!!

谢谢大家!!!

相关推荐
编啊编程啊程13 小时前
gRPC从0到1系列【2】
rpc·dubbo·nio
万粉变现经纪人21 小时前
如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘tokenizers’ 问题
python·selenium·测试工具·scrapy·beautifulsoup·fastapi·pip
RE-19011 天前
制冷剂中表压对应温度值的获取(Selenium)
爬虫·python·selenium·jupyter·pandas·danfoss·reftools
测试老哥1 天前
Python+selenium自动化生成测试报告
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
ThreeAu.1 天前
2025年Web自动化测试与Selenium面试题收集:从基础到进阶的全方位解析
自动化测试·软件测试·selenium·测试工具·面试·web测试·测试开发工程师
测试19981 天前
Web自动化测试之测试用例流程设计
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
编啊编程啊程2 天前
Netty从0到1系列之RPC通信
java·spring boot·rpc·kafka·dubbo·nio
koping_wu2 天前
【Dubbo】Rpc与HTTP的区别、Dubbo调用过程
http·rpc·dubbo
gc_22992 天前
学习Python中Selenium模块的基本用法(15:窗口操作)
python·selenium