一个selenium+python的自动化测试demo

这篇博客介绍了一个使用Selenium和Python进行自动化测试的基础Demo,包含详细注释和初步整理,虽然目前不完整,但作者承诺会持续更新。项目代码已上传至GitHub,供读者下载学习,并鼓励提问交流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要是基础函数的使用,带个人注释,进行了归纳,直接运行会报错的那种Demo。

目前并不齐全,后期继续更新。

文件下载地址:https://github.com/YANGdanxuan/Selenium_Demo_withPython

有什么问题欢迎提出来交流~

# coding:UTF-8
from selenium import webdriver
import unittest
import sys
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
#通过关键字as把excepted_conditiont预期条件判断类重命名为EC,则可以在之后使用EC代替excepted_condition
from selenium.webdriver.support import excepted_condition as EC
from time import sleep, ctime
import os

if sys.getdefaultencoding()!='utf-8':
	reload(sys)
	sys.setdefaultencoding('utf-8')

#选择元素
class DemoAboutSelect(unittest.testcase):
	def setUp(self):
		self.driver = webdriver.Firefox()
		self.base_url = 'http://baidu.com'

	def test(self):
		driver = self.driver
		driver.get(self.base_url)
		
		#可以通过元素的id来定位,id是HTML页面中元素的唯一的属性,适合用来定位
		driver.find_element_by_id('')
		
		#可以通过元素的name来定位,name在HTML中不唯一
		driver.find_element_by_name('')
		
		#可以通过元素的class来定位,class在HTML中不唯一
		driver.find_element_by_class_name('')
		
		#可以通过元素的标签名来定位,tag_name在HTML中不唯一
		driver.find_element_by_tag_name('')
		
		#可以通过元素标签对之间的文本信息来定位,文本信息在HTML中有可能是唯一的
		driver.find_element_by_link_text('')

		#可以通过元素标签对之间的一部分文本信息来定位,在HTML中有可能并不唯一
		driver.find_element_by_partial_link_text('')
		
		#可以通过XPATH方式来定位(可以通过FF、Chrome、Edge调试工具快速生成xpath)
		#可以传入在HTML中的绝对定位、元素属性、运算符driver.find_element_by_xpath('')
		
		#XPATH可以通过绝对路径方式来定位
		driver.find_element_by_xpath('/html/body/div/div[3]/div/imput')
		
		#xpath可以利用元素属性方式来定位
		#元素属性方式:'//' + '标签名或*通配符' + '[@' + '要使用的元素属性' + '=' + '要定位元素属性的值'
		driver.find_element_by_xpath("//input[@id='su']")
		
		#xpath可以同时使用元素属性方式+绝对路径方式来定位,通过属性较多的父级找到子级
		driver.find_element_by_xpath("//input[@id='su']/input")
		
		#xpath可以使用逻辑运算符+元素属性+路径方式来定位,适合一个属性不能唯一定位元素的情况下 
		driver.find_element_by_xpath("//input[@name='su' and @class='btclass']/div/input")
		
		#可以通过CSS方式来定位元素[.class, #id, *, tag_name, 层级, [属性='值']] 等组合定位
		driver.find_element_by_css_selector('')
		
		#可以通过By方式来定位元素,find_element(By.定位方式, 定位相关参数)
		#使用前要导入By类:from selenium.webdriver.common.by import By
		#定位方式:ID,NAME,CLASS_NAME,TAG_NAME,LINK_TEXT,PARTIAL_LINK_TEXT,XPATH,CSS_SELECTOR
		driver.find_element(By.ID,'kw')
		
		
		#定位一组元素,通常用于以下场景:1.批量操作元素;2.先获取一组元素,再从这组对象中过滤出需要操作的元素
		#在这里其实是有点问题的,比如id,这个东西在一个HTML里面是唯一的不能有id重复的元素,定位出来永远只有一个,用find_elements_by_id()其实有点违背了HTML的规则了,除非有些特殊情况下是想以一个数组形式来获取一个元素,但这是很浪费资源的一件事,目前想不出来什么情况下可以用到
		driver.find_elements_by_id('kw')
		driver.find_elements_by_name('su')
		driver.find_elements_by_class_name('su')
		driver.find_elements_by_tag_name('kw')
		driver.find_elements_by_link_text('kw')
		driver.find_elements_by_partial_link_text('su')
		driver.find_elements_by_xpath('su')
		driver.find_elements_by_css_selector('su')
		#可从里面使用pop()指定某一个元素来操作
		driver.find_elements_by_class_name('class').pop(-1).click()


	def teatDown(self):
		self.driver.quit()

#操作类
class DemoAboutOperate(unittest.testcase):
	def setUp(self):
		self.driver = webdriver.Firefox()
		self.base_url = 'http://baidu.com'
	
	
	#操作窗口、浏览器(改变窗口大小,浏览器前进、后退、刷新)
	def testOperateWithWindow(self):
		driver = self.driver
		driver.get(self.base_url)
		
	#控制浏览器window
		#控制浏览器大小set_window_size(width, height),用于自适应移动端时可以设置
		driver.set_window_size(480, 720)
		
		#用于PC端一般希望全屏显示可以使用maximize_window(),不需要参数
		driver.maximize_window()
		
		#控制浏览器后退,back()
		driver.back()
		
		#控制浏览器前进
		driver.forward()
		
		#控制浏览器刷新
		driver.refresh()
		
		#获取当前所有打开的窗口的句柄,返回数组形式,window_handle 
		handle2 = driver.window_handles
		
		#获取当前/焦点窗口的句柄,current_window_handle
		handle1 = driver.current_window_handle

		#切换到指定窗口句柄的窗口,switch_to.window(handle)
		driver.switch_to.window(handle1)
	
	
	#操作元素
	def testOperateWithElement(self):
		driver = self.driver
		driver.get(self.base_url)
		
		
	#简单元素操作(清除内容、发送写入内容、点击、提交)
		#清空内容,用于避免文本输入框中输入造成与默认提示语拼接
		driver.find_element(By.ID, 'kw').clear()
		
		#模拟按键输入,模拟键盘向输入框输入内容,发送键盘按键,模拟文件上传
		driver.find_element(By.ID, 'kw').send_keys('value')
		
		#模拟单击,用于可以被单击的对象,可以包括按钮,文字/图片链接,复选框,单选框,下拉框等
		driver.find_element(By.ID, 'su').click()
		
		#模拟提交操作,可以用于搜索框模拟搜索按钮效果,提交一个按钮,有时可以和click方法交互使用
		driver.find_element(By.ID, 'kw').submit()
		
		
	#WebElement接口其他常用方法(获得元素尺寸、元素文本内容、属性的值、返回是否可见)
		#可返回元素的尺寸{'width':value1, 'height':value2} size没有()
		driver.find_element(By.ID, 'kw').size
		
		#可返回元素的文本内容,text没有()
		driver.find_element(By.ID, 'kw').text
		
		#可返回元素的属性
		driver.find_element(By.ID, 'kw').get_attribute('type')
		
		#可返回该元素是否用户可见 true/false
		driver.find_element(By.ID, 'kw').is_displayed()
		
		
	#鼠标事件(模拟单击、悬停、双击、拖放、提交)
		#使用前要导入 ActionChains 类:from selenium.webdriver.common.action_chains import ActionChains
		#调用 ActionChains 需要把浏览器驱动作为参数传入 
		#格式:ActionChains (浏览器驱动).操作(元素)
		
		#变量化元素(个人添加步骤,避免以下例子代码过长,才变量化,非必要)
		element1 = driver.find_element(By.ID, 'kw')
		element2 = driver.find_element(By.ID, 'su')
		
		#模拟鼠标右键操作,context_click()需要传入点击的元素
		ActionChains(driver).context_click(element1)
		
		#模拟鼠标悬停,move_to_element()
		ActionChains(driver).move_to_element(element1)
		
		#模拟鼠标双击操作
		ActionChains(driver).double_click(element1)
		
		#模拟鼠标拖放操作 drag_and_drop(source, target) 拖动的源元素,释放到目标元素上
		ActionChains(driver).drag_and_drop(element1, element2)
		
		#perform() 执行 ActionChains 中存储的行为,可以理解为对整个操作的提交动作
		ActionChains(driver).context_click(element1).perform()
		
		
	#键盘事件(键盘按下操作,可单键可组合键)
		#使用键盘上按键前要导入 Keys 类:from selenium.webdriver.common.keys import Keys
		#send_keys(Keys.yourself_keyboard [,'组合键'])
		#BACK_SPACE删除\SPACE空格\TAB制表\ESCAPE回退键\ENTER回车键\CONTROL控制键\F1\F2...\组合键
		#输入删除键
		element1.send_keys(Keys.BACK_SPACE)
		#输入空格键
		element1.send_keys(Keys.SPACE)
		#输入Tab键(制表)
		element1.send_keys(Keys.TAB)
		#输入回退键
		element1.send_keys(Keys.ESCAPE)
		#输入回车键
		element1.send_keys(Keys.ENTER)
		#输入组合键Ctrl+a
		element1.send_keys(Keys.CONTROL, 'a')
		#输入F1键
		element1.send_keys(Keys.F1)
		
		
	#获得验证信息
		#来验证是否符合预期结果,可以从title、URL、text来验证执行结果的对错
		#获取当前页面的标题,title
		title1 = driver.title
		#获取当前页面的URL,current_url
		now_url1 = driver.current_url
		#获取元素的文本,text
		now_text = driver.text
		
		
	#设置元素等待
		#显示等待: WebDriverWait().until() 某个条件成立时继续,否则在达到最大时长时抛出超时异常TimeoutException
		#使用前需要导入WebDriverWait:from selenium.webdriver.support.ui import WebDriverWait
		#WebDriverWait(driver, timeout, check_per_secondtime, ignored_exceptions=None)
		#ignored_exceptions超时后抛出的异常,默认抛出NoSuchElementException异常
		#WebDriverWait通常会搭配until(method, value) /until_not(method, value)使用
		element3 = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, 'kw')))
		# EC excepted_condition类提供的预期条件判断方法
		#{title_is:判断当前页面的标题是否等于预期, title_contains:判断当前页面的标题是否包含预期字符串, presence_of_element_located:判断元素是否被加在DOM树里,包含不可见元素, visibility_of_element_located:判断元素的定位是否非隐藏且宽高不为0(参数是定位), visibility_of:判断元素是否非隐藏且宽高不为0(参数是定位好的元素), presence_of_all_element_located:判断至少有一个元素存在于DOM树中, text_to_be_present_in_element:判断元素中的text是否包含预期字符串, text_to_be_present_in_element_value:判断元素的value属性是否包含预期字符串, frame_to_be_available_and_switch_to_it:判断该表单是否可以切换进去,可以则切换并返回True, invisibility_of_element_located:判断元素是否不存在于DOM树或不可见, element_to_be_clickable:判断元素是否可见且可点击, staleness_of:等到一个元素从DOM树中移除, element_to_be_selected:判断元素是否被选中(下拉列表), element_selection_state_to_be:判断元素的选中状态是否符合预期, element_located_selection_state_to_be:判断元素的定位的选中状态是否符合预期, alert_is_present:判断页面上是否存在alert} is_displayed()元素是否可见
		
		#隐式等待:implicitly_wait()设置全局固定等待时长s,找不到时才等待,超出时长报异常
		driver.implicitly_wait(10)
		
		#sleep休眠方法:设置某一次等待的固定时长,然后继续,单位为秒
		#使用前需要导入sleep: from time import sleep
		sleep(8)
		
		
	#表单操作(切换表单、跳出表单、切回主文档)
		#frame/iframe表单嵌套页面时使用,需要切换iframe和frame两个页面
		#switch_to.frame() 可以传入id\name,也可以传入定位对象,或者传入frame的下标index从0开始
		#传入id\name此处有问题,和HTML有关,同一个HTML文档中id和name可以相同,这样传参会出现问题,建议还是传入定位对象
		#传入定位对象
		element4 = driver.fine_element_by_xpath('/html/body/div/li/frame')
		driver.switch_to.frame(element4)
		#传入id/name
		driver.switch_to.frame('if')
		#传入下标index
		driver.switch_to.frame(2)
		
		#switch_to.parent_content() 跳出当前一级的表单,默认是匹配最近的 switch_to.frame()方法,该方法有可能不可用
		driver.switch_to.parent_content()
		
		#切到父frame,有多层frame时有用,但一般这种嵌套多层的frame是有影响到性能的问题的,可以让开发改进
		driver.switch_to.parent_frame()
		
		#切换到主文档,或者理解为最外层的页面
		driver.switch_to.default_content()
		
		
	#switch_to家族的其他(切到当前焦点元素、切到当前alert、confirm、prompt框、切到某个浏览器窗口)
		#driver.switch_to.active_element.send_keys('selenium') 返回当前取得焦点的webdriver对象,然后操作
		#driver.switch_to.alert.send_keys()  返回浏览器的alert对象,可对浏览器alert、confirm、prompt框操作
		#driver.switch_to.window(window_name)  切到某个浏览器窗口
		
		
	#警告框的处理 先使用switch_to.alert()定位到警告框 包括 alert\confirm\prompt
		#accept() 接受现有警告框
		driver.switch_to.alert().accept()
		
		#dismiss() 解散现有警告框
		driver.switch_to.alert().dismiss()
		#也可以定位到警告框之后,返回警告框的文本信息 text , 或者发送文本信息 send_keys(message)
	
	
	#如果要使用本地的HTML文档进行测试,get的时候传入文件地址
	def testWithLocalhostHTMLFile(self):
		driver = self.driver
		
		#使用本地文件进行测试
		#在当前py同个路径时使用'file:///' + os.path.abspath('xxx.html')
		#使用非当前路径的文件时'file:///' + 文件的绝对路径如'F:\doc\find.html'
		#os.path.abspath('file.html')用于获取当前路径下的文件,需要提前导入os类
		#import os
		file_path = 'file:///' + os.path.abspath('result.html')
		driver.get(file_path)
	
	
	#上传文件
	def testWithUploadFile(self):
		driver = self.driver
		driver.get(self.base_url)
		
		#send_keys方法完成,传入文件的绝对路径,适用input标签,可以避免操作windows控件
		driver.find_element_by_id('su').send_keys('E:\\disk\file.txt')
		#Autolt方法实现
		#执行autoit的脚本来实现
	
	
	def tearDown(self):
		self.driver.quit()

class 


if __name__ == '__main__':
	testunit = unittest.TestSuite()
	testunit.addTest(DemoAboutSelect('test'))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值