云计算百科
云计算领域专业知识百科平台

测试之自动化测试常用函数

元素的定位

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

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

常用的主要由cssSelector和xpath

find_elements(方式,“元素”)

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
#驱动程序管理的⾃动化
#创建驱动对象
#1.打开浏览器
driver =webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
#2.输⼊百度⽹址:https://www.baidu.com
driver.get("https://www.baidu.com")
#3、找到输⼊框并输⼊“迪丽热巴”
ret=driver.find_elements(By.CSS_SELECTOR,"#s-hotsearch-wrapper")
for i in ret:
print(i.text)
#5、关闭浏览器
driver.quit()

cssSelector

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

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

xpath

XML路径语言,不仅可以在XML文件中查找信息,还可以在HTML中选取节点。

xpath使用路径表达式来选择xml文档中的节点。

获取HTML页面所有的节点://*

选中当前页面

获取HTML页面指定的节点://[指定节点]

  • //ul:获取HTML页面所有的ul节点
  • //input:获取HTML页面所有的input节点

获取⼀个节点中的直接子节点:/

  • //span/input

获取⼀个节点的父节点:..

//input/..获取input节点的父节点

实现节点属性的匹配:[@…]

//*[@id='kw']匹配HTML页面中id属性为kw的节点

使用指定索引的方式获取对应的节点内容:

注意:xpath的索引是从1开始的。百度首页通过://div/ul/li[3]定位到第三个百度热搜标签;

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

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

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

操作测试对象

获取到了页面的元素之后,接下来就是要对元素进行操作了。常见的操作有点击、提交、输入、清 除、获取文本。(在python中单引号和双引号不区分)

点击/提交对象

click()

#找到百度⼀下按钮并点击
driver.find_element(By.CSS_SELECTOR, "#chat-submit-button").click()
ele=driver.find_element(By.CSS_SELECTOR, "#chat-submit-button")
ele.click()

模拟按键输入

send_keys("")      模拟键盘输入,键盘输入的都能模拟

driver.find_element(By.CSS_SELECTOR, "#chat-textarea").send_keys("迪丽热巴")

ele.driver.find_element(By.CSS_SELECTOR, "#chat-textarea")
ele..send_keys("迪丽热巴")

清除文本内容

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

连续的send_keys()会将多次输入的内容拼接到一起

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("古⼒娜扎")

获取文本信息

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

获取文本信息: text           text的返回信息是字符串

text=driver.find_element(By.CSS_SELECTOR,"#hotsearch-content-wrapper > li:nth-child(2) > a > span.title-content-title").text
print(text)

也可以用assert进行断言检查是否符合预期

问题:是否可以通过 text 获取到“百度⼀下按钮”上的文字“百度⼀下”呢?尝试⼀下

之前是不能,现在能了,之前是value="百度一下"value是属性,value="百度一下"是属性值所以不能。

注意:文本和属性值不要混淆了。获取属性值需要使用方法 get_attribute("属性名称") ;

text=driver.find_element(By.CSS_SELECTOR,"#chat-submit-button").get_attribute('value')
print(text)

获取当前页面标题

title

title = driver.title

获取当前页面URL

current_url

url = driver.current_url

窗口

打开⼀个新的页面之后获取到的title和URL仍然还是前⼀个页面的?

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

切换窗口

  • 获取当前页面句柄:driver.current_window_handle
  • 获取所有页面句柄: driver.window_handles
  • 切换当前句柄为最新页面:

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

若页面跳转后没有打开新的标签页,则不需要发生窗口的切换;

窗口设置大小

窗口的大小设置:

#窗⼝最⼤化
driver.maximize_window()
#窗⼝最⼩化
driver.minimize_window()
#窗⼝全屏
driver.fullscreen_window()
#⼿动设置窗⼝⼤⼩
driver.set_window_size(1024,768)

屏幕截图

我们的自动化脚本⼀般部署在机器上自动的去运行,如果出现了报错,我们是不知道的,可以通过抓拍来记录当时的错误场景

driver.save_screenshot('../images/image.png')

运行前后

也可以创建文件夹,在创建的文件夹下存放

重名文件将被覆盖,那么将每次生成的图片文件名称不一样即可(以时间加名称)

filename = "autotest-"+datetime.datetime.now().strftime('%Y-%m-%d-%H%M%S')+'.png'
#./images/autotest-2026-02-06-164656.png //文件名以字符串形式
driver.save_screenshot('./images/'+filename)

关闭窗口

driver.close()

注意:窗口关闭后driver要重新定义;

driver.quit()      表示推出浏览器,可能有多个窗口,执行后所有的标签页都被关闭

driver.close()   表示推出一个窗口

弹窗

弹窗是在页面是找不到任何元素的,这种情况怎么处理?使用selenium提供的Alert接口

警告弹窗+确认弹窗

弹窗定位不到元素

alert = driver.switchTo.alert
//确认
alert.accept()
//取消
alert.dismiss()

页面出现弹窗后,必须先处理弹窗后才能定位到页面其他元素;

警告弹窗时选取accept和dismiss都一样,因为只有一个选项只是名字不同;

提示弹窗

alert = driver.switchTo.alert
alert.send_keys("hello")
alert.accept()
alert.dismiss()

等待

通常代码执行的速度比页面渲染的速度要快,如果避免因为渲染过慢出现的自动化误报的问题呢?可以使用selenium中提供的三种等待方法:

强制等待

time.sleep()

脚本执行速度快,而页面渲染速度慢,当页面执行到代码时页面还没渲染成功导致找不到元素,可以用sleep等待渲染。  

优点:使用简单,调试的时候比较有效

缺点:影响运行效率,浪费大量的时间

隐式等待

隐式等待是⼀种智能等待,他可以规定在查找元素时,在指定时间内不断查找元素。如果找到则代码继续执行,直到超时没找到元素才会报错。

implicitly_wait() 参数:秒

隐式等待作用域是整个脚本的所有元素。即只要driver对象没有被释放掉( driver.quit() ),隐 式等待就⼀直生效。一般放在代码开头。

优点:智能等待,作用于全局

显示等待

显示等待也是⼀种智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续代码。(可以只作用在一行代码上)

WebDriverWait(driver,sec).until(functions)
#sec 秒

functions :涉及到selenium.support.ui.ExpectedConditions包下的 ExpectedConditions 类

ExpectedConditions 预定义方法的⼀些示例:

  • 方法:title_is(title)                                                                 
  • 说明:检查页面标题的期望值
  • 方法:title_contains(title)                                                       
  • 说明:检查标题是否包含区分大小写的子字符串的期望值
  • 方法:visibility_of_element_located(locator, str])
  • 说明:检查元素是否存在于页面的DOM上并且可见的期望值。
  • 方法:presence_of_element_located(locator, str])
  • 说明:用于检查元素是否存在于页面的DOM上的期望值
  • 方法:visibility_of(element)
  • 说明:检查已知存在于页面DOM上的元素是否可见的期望
  • 方法:visibility_of(element)
  • 说明:检查是否出现弹窗

隐式等待无法等待弹窗,因为弹窗不是页面元素,无法通过页面元素来定位。显示等待可以处理。

优点:显示等待是智能等待,可以自定义显示等待的条件,操作灵活

缺点:写法复杂

不建议显示等待和隐式等待一起出现。当找一个不存在的元素时候可能会导致不可预测的等待时间

浏览器导航

常见操作:

  • 打开网站:driver.get("https://tool.lu/")      任意网站都行
  • 浏览器的前进、后退、刷新:driver.back() driver.forward() driver.refresh()
  • 案例:百度首页测试https://tool.lu/标签入口

    文件上传

    点击文件上传的场景下会弹窗系统窗口,进行文件的选择。

    当通过页面元素调起上传的窗口后,文件窗口不能作为页面元素选中。

    selenium无法识别非web的控件,上传文件窗口为系统自带,无法识别窗口元素,但是可以使用sendkeys来上传指定路径的文件,达到的效果是一样的。通过send_keys()将本地的文件(路径加文件名)上传

    ele = driver.find_element(By.CSS_SELECTOR,"body > div > div >
    input[type=file]")
    ele.send_keys("D:\\\\file\\\\test.txt")

    浏览器参数设置

    设置无头模式:

    无头模式:程序在后端运行,界面看不到页面的表现。看不到执行的过程

    options = webdriver.ChromeOptions()
    options.add_argument("-headless") //设置参数 -headless:无头模式 不设参数默认有头模式
    driver =webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=options)

    看不到浏览器打开的过程;

    页面加载策略:

    options.page_load_strategy = '加载⽅式'

    driver.get()会默认等到资源加载完成才会继续往下执行,但实际上主页面加载完成之后就可以继续执行自动化,若一直等待的话会导致页面超时,元素找不到问题等

    页面加载方式主要有三种类型:

    • 策略:normal
    • 说明:默认值,等待所有资源下载
    • 策略:eager
    • 说明:DOM访问已准备就绪,但诸如图像的其他资源可能仍在加载
    • 策略:none
    • 说明:完全不会阻塞WebDriver

    options = webdriver.ChromeOptions()
    options.page_load_strategy = 'eager'
    driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()),options=options)

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 测试之自动化测试常用函数
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!