网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
driver.get() #加载一个网页
元素定位的:
driver.find_element_by_id()
driver.find_element(By.xxx,’’)
frame跳转的:
driver.switch_to.frame()
driver.switch_to.parents_frame()
driver.switch_to.default_content()
窗口跳转:
driver.switch_to.window()
对话框的处理:
Driver_switch_to.alert
.accepto
.dismiss
.text
.send_keys()
执行js脚本的:
driver.execute_script(js)
Element类:
element.click()
element.submit()
element.send_keys()
element.clear()
element.text
element.get_attribute()
element.is_displayed()
element.find_element_by_xpath()
11.13 定位元素的8个方法是什么?
1、通过id定位
find_element_by_id()
2、通过name定位
find_element_by_name()
3、通过 class name定位
find_element_by_class_name()
4、通过css定位
find_element_by_css_selector()
5、通过link定位
find_element_by_link_text(‘文本’)没有空格一般a链接
6、通过 partial_link定位
find_element_by_partial_link_text(部分文本)–般有空格a链接
7、通过 xpath定位
find_element_by_xpath()
8、通过 tag_name定位
find_element_by_tag_name()
11.14 js定位的5个方法
js用到css定位
-
driver.execute_script(“document.getElenmentByld().value=‘’;”)
-
driver.execute_script(“document.getElenmentByName().value=‘’;”)
-
driver.execute_script(“document.getElenmentsByClassName()[0].value=‘’;”)
-
driver.execute_script(“document.getElenmentsByTagName()[0].value=‘’;”)
11.15 jQuery定位的方法
-
driver.execute_script(“$(#id定位值)vaC”)")-输入值a()处也可以用cick()表示点击
-
driver.execute_script(“$(name=name定位值va(”)输入值
-
driver.execute_script(“$(cas定位值)va()”)输入值
-
driver.execute_script(“$((class=]”).val().)
-
driver. execute script (“SCIvalue= ]”).val()")
11.16 css定位的方法?
#通过样式 #id样式, .cass样式为多
-
find_element_by_css_selector(“#id”)
-
find_element_by_css_selector(“.classname定位值”)
#通过元素属性
- find_element_by_css_selector(“[name=name定位值]”)
Find_element_by_css_selector(“[class=定位值]”)
#样式,属性结合
find _element_by_css_selector(div#fanwe_msg_box>table>tbody>tr>td:nth-child(2)>div(@class=‘dialog-content’))
5.父子元素定位
Find_element_by_css_selector(div#fanwe msg box> table>tbody>tr> td:nth-child(2)
div:nth-child(2))
11.17 xpath定位的方法? xpath怎么写?
Xpath写法://*div[@id=’u1’]/a[7] #相对路径
Xpath写法:/html/boy/div[1l/div/div/divl3/a[7 #绝对路径
#先找父元素,结合属性
Find_element_by_xpath(//div(@id=u1"/a[@name=tj_login])
11.18 如何去定位下拉框
1、首先要导入一个包: from selenium.webdriver.support.select import Select
2、先给下拉框元素定位定义一个变量:a= diver.find_element_by_css_selector()
3、再通过根据下拉框的 value\visible_text\index去选择值
Select(a).select_by_value(‘’)–根据下拉框的vaue值去选取值
Select(a).select_by_visible_text(‘’)–根据下拉框的内容去选值
Select(a).select_by_index(‘’)–根据下拉框的下标去选。从0开始
11.19 如何去定位内嵌界面
1、定位元素的时候看到fame的需要进入内嵌
2、如果有内嵌有id或name值时直接进入内嵌 driver.switch_to.frame(id值或name值)
3、如果内嵌没有id或name值,先定义一个内嵌再进入:
a=driver.find_element_by_class_name(‘’)
driver.switch_to.frame(a)
4、如果有多层内嵌,要一层一层进入
5、记得退出内嵌: driver.switch_to_default_content()
6、driver.switch_to.parent_frame()—进入父级内嵌,调至上一级内嵌
11.20 如何在不同的网页之间切换
1.首先要获取多个界面的句柄
先通过定位元素几个界面:driver.find_element_by_id().click或者其他,获取一个界面打印一个:print (diver.window_handles)
然后获取几个界面的句柄,定义成一个变量:window_list= diver.window_handles()—以列表形式存在
2.通过界面句柄的下标进入不同的界面: driver.switch_to_window(window_list[O])
通过界面句柄的下标进入不同的界面,0表示第一个,下标-1代表最新的界面
注意:如果进入一个界面里面是内嵌,记得退出内嵌再进入另一个界面
11.21 如何去定位滚动条?滚动条怎么处理?
一般当我们西面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接操作的,会报元素不可见异常的。这时候需要借助滚动条来拖动屏幕,使被操作的元素显示在当前的屏幕上,selenium提供了一个操作js的方法: execute.script(),可以直接执行js的脚本,
滚动到底部:
Js=‘var q=document.getElementByld(‘id’)scrollTop=10000’
Driver.execute_script(js)
滚动到顶部:
js=‘var q=document.documentElementscrollTop=0’
driver.execute_script(js)
#把滚动条拉到指定位置
虽然用上面的方法可以解决拖动滚动条的位置问题,但是有时候无法确定我需要操作的元素在什么位置,有可能每次打开的页面不一样,元素所在的位置也不一样,这个时候我们可以先让页面直接跳到元素出现的位置,然后就可以操作了。
Target_element = driver.find_element_by_xpath(‘//*[@id=“4”]/h3/a’)
Driver.execute_script(“arguments[O].scrollIntoView();”,target_element)
11.22如何去模拟键盘与鼠标的操作?
模拟键盘:
1、要导入一个包 rom selenium. wedriver common keys import Keys
2、快捷键输入,通过 send_keys()方法可以来模拟键盘输入操作。
Send_keys(Keys.CONTROL,'a’) 全选(Ctrl+A)
Send_keys(Keys.CONTROL,‘C’) 复制(Ctrl+C)
Send_keys(Keys.CONTROL,’X’) 剪切(Ct+X)
Sen_ keys(Keys.CONTROL,’V’) 粘贴(Ctr+V)
Send_keys(Keys.ENTER) 回车键
Send_keys(Keys.BACK_SPACE) 删除键
Send_keys(Keys.SPACE) 空格键
Send_keys(Keys.TAB) 制表键
Send_keys(Keys.ESCAPE) 回退键
模拟鼠标:
语法:ActionChains(diver).鼠标操作动作操作的元素. Perform()
鼠标操作动作有:click()单击、context_click()右击、double_click()双击、
Move_to_element()鼠标悬停
1.先导入一个鼠标的包:from selenium.webdriver.common.action_chains import Action Chains
2.然后定位元素: driver.find_element_by_xpath()可以定义为一个变量aa
3.然后通过语法执行:Action Chains(driver).move_to_element(aa).perform()
11.23、如何去处理上传 Windows文件?
1.可直接赋值 send_keys输入图片的地址
其实上传文件的按钮就是一个input元素,只是它的type类型是file类型,
我们在处理这种上传文件的按钮的时候,可以直接通过普通定位方式去定位它,
再利用send_keys方法去输入图片的地址就可以了。
Load_file_element=driver.find_element_by_xpath(‘/html/body/div(8l/div(1)/div(2/div/div[3]/form/div/div/div/inpu’)
2.需要用到一个工具,Autolt工具
帮助我们识Windows控件信息利用Autolt生成一个操作Windows对话框的exe执行文件
然后在python代码中去调用这个可执行文件
这里需要用到os模块,利用 os.system去执行 windows的exe文件,
把exe文件的路径传入,并传入需要上传的图片的路径即可
Drver.fnd_ement_by_xpath(‘html/body/divoiv1/dw2]/div/div3form/dvd/di)cick()#点击浏览
time.sleep(1)
ossystem(C:\Users\Administrator\ Desktop\AA.exe D:\QQ.png)
11.24 如何去定位时间控件
1、首先js去定位元素,去除元素中的属性:js="$(‘’).removeAttr(要删除的属性)
2、然后执行js脚本: driver.execute.script(js)
3、然后输入时间日期
driver.find_element_by_xpath(//[@id=start time]").send keys("2018-12-29 10:55:55)#输入日期
11.25 弹出框的操作?
弹出框一般有三种:警告消息框,确认对话框,提示消息框
在selenium中提供了一个方法 switch_to.alert,跳转到对话框上面去对alert对话框进行操作的函数/法
Accept() #点击确定按钮
Dismiss() #点击取消按钮
Text #获取对话框上的文本信息
Send_keys() #输入内容
11.26 等待时间有哪三种,区别是什么?
1、sleep强制等待,要导入from time import sleep,必须等待那么多秒定位才执行
2、driver.implicitly_wait隐式等待多秒内只要找到元素就开始执行,超多设定时间就超时
3、Web DriverWaite(driver,20.1).until(lambdax.x.find_element_by_name()).send_keys()-首先需要导入一个包:fom selenium.webdriver.support.wait import WebDriverWait, driver 1s钟找一次元素,最多找20秒,一直发送请求,直到找到元素位置以后,进行下一步操作。
11.27 有没有修改过页面元素的属性,具体怎么修改?
有的,有时候我们会碰到一些元素不可见,这个时候selenium就无法对这些元素进行操作了。例如,下面的情况:页面主要通过“display.none”来控制整个下拉框不可见。这个时候如果直接操作这个下拉框,就会提示:我们需要通过 javaScript修改 display的值
具体修改方式如下:
js='document.queryselectorAll(‘select’)[1].style.display=“block”;’
driver.execute_script(js)
11.28 定位不到元素,你碰到过哪些?怎么解决的?
1、像页面加载延迟的问题,这个需要通过等待延迟的方式来处理。
2、不过有时候,页面加载完成,但是元素暂时还不可见,导致定位不成功
这个可以选择使用显示等待来处理,这里需要用到WebDriverWait类来实现
3、还有就是像内嵌网页的问题,需要使用 driver.switch_to.frame(name/index)这个函数来跳转到处理。
4、还有要注意多窗口问题,动态id问题等的问题,对于多窗口处理,可以使用
driver.switch_to.window()的方式来进行处理,而对于动态id的问题,需要注意的是有些id跟数字有关,可能会动态变化,可以使用xpath也可以使用css_select属性定位或者样
式定位,或者可以通过父元素来找元素,或者通过兄弟节点来找对应的元素。等等
5、还有要特别注意滚动条的问题,这里通过调用js代码来实现的,driver.execute_script(js)
6、再这就是有时候会碰到某些元素的是不可见的,比如display属性为none这就需要通过 java Script修改 display的值。
js ='document. querySelectorAll(“select”)[1]. style. display=“block”;
driver.execute_script(js)
11.29 元素定位,有时候定位得到,有时候定位不到,可能是什么原因,你会怎么处理?
1、可能是网络问题,导致页面加载延迟,这个可以做延迟等待,一般选择隐式等待,在脚本前面加上driver.implicitly_wait(20)。
2、也有可能是页面结构发生变化导致的,这个时候最好选择通过 xpath或css结合属性进行或者样式定位可能会好点,或者采用JQuery定位的方式来进行定位元素
11.30 对于不可见/隐藏的元素,你如何定位,如何处理?
我们可以通过javaScript 修改 display的值,来实现
#修改元素的属性
#我们需要通过 javaScript修改 display的值。
js='document.querySelectorAll(‘select’)[1].style.display=“block”;’
driver.execute_script(js)
11.31 如果元素经常变动你怎么做?
1,少用绝对路径,多用css或者jQuery定位
2,单个元素属性进行封装
11.32 自动化如何破解验证码
1,开发去掉验证码
2,开发设定一个万能验证码
3,python导入 pillow和OCR模块 pytesseract
11.33 数据驱动有没有了解过,具体怎么做的?
1、其实就是把数据与脚本分离,好处就是方便维护管理,后期数据有变动,只要改 excel
表的数据就可以,脚本不用动
2、封装一个读取 excel表格的函数方法,调用这个函数来读取数据。
3、然后利用ddt模型,使用dt内部装饰器来实现数据引用
我们当时就是这么做的。
11.34 参数化的类型有哪些?自动化脚本如何实现数据的参数化?
把测试数据,通过变量或者文件进行保存,通过修改文件或者变量,达到数据参数化目的
测试过程,减低数据维护成本
1、像测试用例数据这块,我们都是放在 excel表格中的
2、常用的变化比较小的配置数据,比如数据库连接的配置,报告的路径,用例的路径等等
这些放在config配置文件中,利用全局变量来管理的。对于全局变量的数据,直接导入config某块,调用就可以。目的是以便于测试数据改变时,直接修改变量就行了
11.35 随机数如何操作?
1.首先都要 import random
随机整数:random randint(10002000),有时需要转化成字符串类型:
str(random randint(1000, 2000))
随机字符串:"join( random.sample(‘abcdefghijk’6)),有时前面固定字母了:
‘ldh’+".join(random sample(‘abcdefghijk’,6))
11.36 自动化中如何去操作excel表格?
需要用到xlrd库,调用这个库中的API函数来实现的。
1.第一步:导包 import xlrd
2.第二步:book= xrd.open_workbook(文件路径)
3.第三步:table= book.sheet_by_name表名)
4.第四步:读某行数据一般都技行来读取
Table.row_values(x)
如果要读全部的数据,多行数据,利用循环读取就可以
List=[]
for i in range(1,table.nrows):
List.append(table.row_values(i))
return list
11.37 如何去读取表格中一行,一列数据,具体数据
1、读取一行数据:YS.row_values(0)0表示第一行
2、读取一列数据:YS.col_values(0)0表示第一行
读取具体某个数据:YS.row_values(O)[0]–表示获取第一行第一列
11.38 如何读取表格中总的列数跟行数
获取总列数:YS.ncols
获取总行数:YS.nrows
11.39 自动化中如何去操作数据库
需要自己封装一个函数
1、安装 pymysql: pip install pymysql或者在 pycharm里面安装 pymysql
2、导入 mysql: import pymysql
3、连接数据库: db_connect= pymysql.connect(host=‘ip地址’,
user=’root’,password=’’,database=’’,port=’’,charset=‘utf8’)
4、建立游标: cursor= db_connect.cursor()
5、执行游标: cursor.execute(sql)
6、获取数据
获取游标中所有数据:all= cursor.fetchall()
获取游标中多条数据:many= cursor.Fetchmany()
获取游标中第一条所有数据:one= cursor.fenchone()
7、关闭游标: cursor.close()
8、关闭数据库连接 db_connect.close()
11.40 如何获取数据库返回的所有,一行,前5行
获取游标中多条数据:many= cursor.fetchmany(5)
获取游标中第一条所有数据:one= cursor.fenchone()
首先已经建立好了数据库连接的函数,并且return了
11.41 数据库返回的数据格式是什么类型的格式
二维元组的格式
如果要获取具体某个值要用:cursor.fetchall[0][0]—这个表示提取游标中所有值里面的第一个元祖里面的第一个值
11.42 ui自动化你是怎么做断言的?
断言主要检查几个点:
1.页面跳转是否正确(title,url)
2.页面数据是否正确(核心数据,页面上的关键信息,或者页面上的某个元素是否出现)
3.如果要检查数据库,需要连接数据库,查询数据,与预期结果进行对比
基本都调用unittest框架中提供的断言函数来实现的,用得比较多的就是
AssertEqual
Assertln
#扩展
1.提取元素text断言
User_text= driver.find_element_by_css_selector(“# j_account>a”).text#获取实际的值(展示账户名内容)
assert’ admin’ in user_text #断言 admin在实际值里
2.提取元素属性去断言:
login_button_value=driver.find_element_by_id(“lajax-login-submit”).get_attribute(“vaue”) #获取登录按钮的属性vaue值是登录
assert’登录’== login_button_value #断言登录是这个按钮的属性
3.提取界面title值去断言
assert"p2p信贷一最大、最安全的网络借贷平台"in driver.title,"失败"或者in改为 not in
4.提取元素是否可用来进行断言
Assert driver.find_element_by_css_selector(“div.user_money > a:nth-child(1)”).is enabled0==True,“元素不存在。不可用”
5.数据库断言,去数据库查询结果,是否跟预期一致
11.43 断言有哪几种(三种),常见 assert断言
selenium提供了三种模式的断言: assert、verify、waitfor
Assert失败时,该测试将终止。
Verify失败时,该测试将继续执行,并将错误记入日显示屏。也就是说允许此单个验证通过。确保应用程序在正确的页面上。
Waitfor用于等待某些条件变为真。可用于AJAX应用程序的测试
常见的assert断言:
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
取界面title值去断言
assert"p2p信贷一最大、最安全的网络借贷平台"in driver.title,"失败"或者in改为 not in
4.提取元素是否可用来进行断言
Assert driver.find_element_by_css_selector(“div.user_money > a:nth-child(1)”).is enabled0==True,“元素不存在。不可用”
5.数据库断言,去数据库查询结果,是否跟预期一致
11.43 断言有哪几种(三种),常见 assert断言
selenium提供了三种模式的断言: assert、verify、waitfor
Assert失败时,该测试将终止。
Verify失败时,该测试将继续执行,并将错误记入日显示屏。也就是说允许此单个验证通过。确保应用程序在正确的页面上。
Waitfor用于等待某些条件变为真。可用于AJAX应用程序的测试
常见的assert断言:
[外链图片转存中…(img-mA7iTJu1-1715631234388)]
[外链图片转存中…(img-DM1MZp2W-1715631234389)]
[外链图片转存中…(img-ArjgDV0w-1715631234389)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新