用python实现ui自动化测试(二)
1.关于多元素定位
元素定位从大的分类而言,分为两种:
1、单个元素的定位
2、多个元素的定位
当元素属性的ID,name等完全一致的时候,那么这个时候,你发现无法使用单个
元素的方式来解决,那么久可以使用多个元素定位的方法来进行
解决思路:
获取元素的属性,其实是一个列表,看我们被定位的目标属性是在第几位,那么久使用索引
想定位元素的前提
from selenium import webdriver
1.当我们想要运用tag_name的多元素定位:
代码演示

1 driver=webdriver.Chrome() 2 driver.get('http://www.baidu.com') 3 lists=driver.find_elements_by_tag_name('input') 4 t.sleep(5) 5 lists[7].send_keys('美女') 6 t.sleep(5) 7 lists[8].click() 8 t.sleep(5) 9 driver.quit()
首先我们选用的百度的网站作为访问对象,我们第一步先需要将这个变量进行赋值
lists=driver.find_elements_by_tag_name('input')
这一行代码的意思就是我们将driver.find_elements_by_tag_name('input')赋值给lists
根据我们要执行的那一条按照索引进行查找输入相关操作
根据上图我们可以看到 tag_name=input
我们按照标签input从一次查找 捕捉到搜索栏input索引为7
按照这个我们接着查找
百度一下按钮索引为8
所以我们综上述代码所展现的就是
我们在输入框中输入关键字并且点击百度一下按钮
2.进入框架关键字:switch_to.frame
我们以QQ邮箱为例
我们可以看到该网页其实是由多个框架组成的 ,如果我们按照以往的元素定位进行捕捉窗口是无法进行进行操作的,这时候我们就需要进入内部框架然后进行相关操作

1 from selenium import webdriver 2 import time as t 3 driver=webdriver.Chrome() 4 driver.maximize_window() 5 driver.get('https://mail.qq.com/') 6 t.sleep(10) 7 # iframe通过ID的方式进入login_frame 8 driver.switch_to.frame('login_frame') 9 # name的方式 10 driver.switch_to.frame('login_frame') 11 t.sleep(10) 12 driver.find_element_by_partial_link_text('注册').click() 13 t.sleep(10) 14 driver.close()
在上述代码中 我们先是进入了QQ邮箱,紧接着在邮箱的网址中,我们进入了QQ登录的框架
才能进行对里面的元素进行操作
我们所对知识进行梳理,
##逻辑方面 先获取网址--进入网站所要操作的框架并且进入--用元素定位法定位框架内部的元素---执行相关操作
3.关于selenium的代码
3.1.获取元素属性的值:get_attribute()
所有的input里面输入的值,都是value的属性
我们用拉勾网进行操作

1 from selenium import webdriver 2 import time as t 3 driver=webdriver.Chrome() 4 driver.maximize_window() 5 driver.get('https://www.lagou.com/') 6 t.sleep(5) 7 #点击登录按钮 8 driver.find_element_by_partial_link_text('登录').click() 9 t.sleep(5) 10 login=driver.find_element_by_xpath('/html/body/div[3]/div[1]/div/div/div[2]/div[3]/div[1]/div/div[2]/form/div[1]/div/input') 11 print(login.get_attribute('placeholder')) 12 t.sleep(5) 13 driver.quit()
通过上图我们可以我们的期望结果为:请输入常用手机号
3.2.是否可见:is_displayed()
我们用百度的页面作为案例

1 from selenium import webdriver 2 import time as t 3 driver=webdriver.Chrome() 4 driver.maximize_window() 5 driver.get('https://www.baidu.com/') 6 aboutBaidu=driver.find_element_by_partial_link_text('关于百度') 7 #is_displayed():是否可见 8 print(aboutBaidu.is_displayed()) 9 driver.quit()
我们可以先查看官网中拥有‘关于百度’相关链接
如果存在则输出True 如果不存在则输出False

1 from selenium import webdriver 2 import time as t 3 driver=webdriver.Chrome() 4 driver.maximize_window() 5 driver.get('https://www.baidu.com/') 6 aboutBaidu=driver.find_element_by_partial_link_text('关于百度') 7 #is_displayed():是否可见 8 print(aboutBaidu.is_displayed()) 9 driver.quit()
输出结果
3.3.查看是否可编辑:is_enabled()
当我们想要查看这个元素是否可以编辑是 就可以使用is_enablend()关键字进行查看
可编辑为True 不可编辑为False

1 from selenium import webdriver 2 import time as t 3 driver=webdriver.Chrome() 4 driver.maximize_window() 5 driver.get('https://www.baidu.com/') 6 so=driver.find_element_by_id('kw') 7 print(so.is_enabled()) 8 driver.quit()
3.4.针对单按钮是否勾选:is_selected()
当我们想要查看这个按钮是否进行勾选 我们可以通过is_selected进行查找

1 from selenium import webdriver 2 import time as t 3 driver=webdriver.Chrome() 4 driver.maximize_window() 5 driver.get('https://mail.sina.com.cn/') 6 autoLogin=driver.find_element_by_id('store1') 7 t.sleep(5) 8 print('是否勾选:',autoLogin.is_selected()) 9 t.sleep(5) 10 autoLogin.click() 11 print('是否勾选:',autoLogin.is_selected()) 12 driver.quit()
因为新浪的按钮默认为自动登录
所以我们以一次获取的时候为True
我们对该按钮执行了点击操作
这时候我们在进行获取为False
3.5.清空操作元素里面的关键字:clear
当我们在进行自动化测试的时候需要重复的进行搜索 ,且想一遍进行操作的情况下
我们会使用clear(清空)操作来进行

1 from selenium import webdriver 2 import time as t 3 driver=webdriver.Chrome() 4 driver.maximize_window() 5 driver.get('http://www.baidu.com/') 6 so=driver.find_element_by_id('kw') 7 so.send_keys('贾超太丑了') 8 t.sleep(5) 9 so.clear() 10 t.sleep(5) 11 driver.quit()
3.6获取测试地址:assert断言 期望结果与实际结果进行比较
获取的是地址用到的是current_url
获取当前源代码用的是page_source
获取页面的title:tltle
当我们断言的时候 如果为True的话才会运行接下来的动作

1 from selenium import webdriver 2 import time as t 3 driver=webdriver.Chrome() 4 driver.get('https://www.baidu.com/') 5 print('获取测试地址:',driver.current_url) 6 print('获取当前源代码:',driver.page_source) 7 # 断言 8 assert driver.current_url.endswith('idu.com/')==True 9 # title 10 print(driver.title) 11 assert driver.title=='百度一下,你就知道' 12 driver.close()
3.7关于页面的前进、后退、刷新
前进:forward
后退:back
刷新:refresh

1 driver=webdriver.Chrome() 2 driver.get('https://www.baidu.com/') 3 t.sleep(3) 4 driver.get('https://www.so.com/') 5 t.sleep(3) 6 driver.back() 7 print('地址为:',driver.current_url) 8 t.sleep(3) 9 driver.forward() 10 print('地址为:',driver.current_url) 11 t.sleep(3) 12 #刷新 13 driver.find_element_by_id('input').send_keys('美女') 14 t.sleep(3) 15 driver.refresh() 16 t.sleep(3) 17 driver.close()
4.关于多窗口的实战
需求:出现两个窗口 ,切换成新的窗口将旧窗口关闭

1 from selenium import webdriver 2 import time as t 3 driver=webdriver.Chrome() 4 driver.get('https://www.baidu.com/') 5 #获取当前窗口 6 nowWindow=driver.current_window_handle 7 t.sleep(5) 8 driver.find_element_by_partial_link_text('hao').click() 9 t.sleep(5) 10 #获取所有的窗口 11 allWindow=driver.window_handles 12 t.sleep(5) 13 for item in allWindow: 14 #判断窗口不是当前窗口 15 if item!=nowWindow: 16 driver.switch_to.window(item) #获取新创建窗口 17 t.sleep(5) 18 driver.find_element_by_xpath('//*[@id="search"]/form/div[2]/input').send_keys('美女') #获取新程序xpath 19 t.sleep(5) 20 driver.close() 21 #切换到当前窗口 22 driver.switch_to.window(nowWindow) 23 t.sleep(5) 24 driver.find_element_by_id('kw').send_keys('美女') 25 t.sleep(5) 26 driver.quit()
5.关于下拉框处理方式
因为下拉框不能使用常规的ID name等方式直接获取 所以我们需要借助到Select的类 来实现处理下拉框
导入方法:form selenium.webdriver.support.select import Select
因为我们在处理下拉框的时候 需要导入Select里的类 下拉框里面的选项本质就是类的方法,所以我们需要对下拉框进行实例化

1 from selenium import webdriver 2 from selenium.webdriver.support.select import Select 3 import time as t 4 driver=webdriver.Chrome() 5 driver.maximize_window() 6 driver.get('file:///D:/jiachao/app/ui%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/%E7%BB%83%E4%B9%A0.html') 7 t.sleep(5) 8 nr=driver.find_element_by_id('nr') 9 #针对Select类的实例化 10 select=Select(webelement=nr) 11 #索引方式 12 # select.select_by_index(3) 13 #value方式 14 # select.select_by_value('Java') 15 #文本的方式 16 select.select_by_visible_text('Java语言') 17 t.sleep(5) 18 driver.quit()
利用索引的方式:select_by_index()
利用value的方式:select_by_value
利用文本的方式:select_by_visible_text
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!