2023年11月25日发(作者:)
1.⾃动化测试+selenium+⼋⼤定位元素
1.⾃动化测试简介
1.1 什么是⾃动化测试
⾃动化测试就是把以⼈为驱动转化为 机器执⾏的过程。⽬的是将过于繁杂的固定的⼿⼯测试⾏为转化为⾃动化执⾏,从⽽有更多的时间来
⾛⼿⼯测试。
⾃动化功能测试:测开。⽬前主流技术:Selenium
⾃动化性能测试:性能测试
⾃动化测试可以实现:
#webdriver
导⼊
from selenium import webdriver
#from ver import WebDriver
#
创建⼀个浏览器对象
driver=webdriver.Chrome()
#wb=WebDriver(executable_path="chromedriver")
#URL
浏览器访问指定
driver.get('')
元素的定位,输⼊⽂本,并点击
元素定位就是通过元素的信息或元素层级结构来定位元素的
定位元素依赖于1,标签名2,属性3,层级4,路径
#webdriver
导⼊
from selenium import webdriver
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.by import By
#
创建⼀个浏览器对象
wb=WebDriver(executable_path="chromedriver")
#URL
浏览器访问指定
wb.execute('get',{'url':''})
#webElement,
元素的定位,先获取然后在考虑元素如何操作?
el=wb.execute('findElement',{
'using':By.XPATH,
'value':'//input[@id="kw"]'
})['value']
el._execute('sendKeysToElement',{'text':'刘阳',
'value':''})
el1=wb.execute('findElement',{
'using':By.XPATH,
'value':'//input[@id="su"]'
})['value']
el1._execute('clickElement')
''
⾃动化中的hello world
'''
#WebDriver
导⼊模块
from selenium import webdriver
#
导⼊强制等待
from time import sleep
#chrome
创建浏览器对象
driver=webdriver.Chrome()
#url
访问指定
driver.get('')
#
查找需要操作的元素
we_input=driver.find_element_by_id("kw")
#
对元素进⾏输⼊操作
we_input.send_keys('刘阳')
#
点击百度⼀下按钮,执⾏本次搜索操作
we_button=driver.find_element_by_id('su')
we_button.click()
#WebDriver
是⼀个服务端代理,当⾃动化结束时,需要记得释放资源
sleep(5)
driver.quit()
如何访问指定的URL?
Webdriver是浏览器驱动的服务端。Webdriver封装了execute()⽅法,execute()发送请求
实例:实战商城实现登录操作
完成上述按钮的步骤:
1. 导包 from selenium import webdriver from time import sleep
2. 获取浏览器对象 driver=()
3. 打开url:()
4. 获取⽂本框 _element_by_id()
5. 输⼊⽂本内容:_key()
6. 获取按钮属性位置
7. 点击按钮
8. 暂停⼏秒 sleep()
9. 关闭驱动 ()
close与quit的区别:close:关闭当前浏览页;quit:关闭浏览器,释放进程
报错:element not interactable 定位的元素⽆法进⾏交互
#we_()
为实现该功能,报错
from selenium import webdriver
#
导⼊强制等待
from time import sleep
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.by import By
#chrome
创建浏览器对象
driver=webdriver.Chrome()
#url
访问指定
driver.get('39.98.138.157/shopxo/')
#('39.98.138.157/shopxo/?s=/index/user/')
# #
查找需要操作的元素
# we_input=_element_by_id("search-input")
#
#
we_button1=driver.find_element_by_xpath('39.98.138.157/shopxo/?s=/index/user/')
we_button1.click()
#
输⼊⽤户名、密码
we_input=driver.find_element_by_name('accounts')
we_input.send_keys('666666')
we_input=driver.find_element_by_name('pwd')
we_input.send_keys('111111')
#
点击登录按钮
we_button=driver.find_element_by_class_name('am-btn am-btn-primary am-radius am-btn-sm btn-loading-example')
we_button.click()
修改为正确代码:
from selenium import webdriver
#
导⼊强制等待
from time import sleep
#chrome
创建浏览器对象
driver=webdriver.Chrome()
#url
访问指定、
#""python(url)rr
注意:反斜杠是中的转义字符本地地址时,可能会遇到,解决⽅法:前⾯加(是⼀个修饰的字符串,如果字符串有转义字符,不进⾏转义使⽤
)或者即可
""
#file:///
使⽤本地浏览模式,前缀必须加
#file:///D:/study//jsp/jsp//
⼤⼆第⼀学期课后练习题刘阳
driver.get('39.98.138.157/shopxo/')
#
查找需要操作的元素,该模块需要完成⽤户登录的模拟,休要点击登录输⼊⽤户名、密码,再次点击登录实现登陆成功
driver.find_element_by_link_text('登录').click()
sleep(5)
#
输⼊⽤户名、密码
we_input=driver.find_element_by_name('accounts')
we_input.send_keys('666666')
we_input=driver.find_element_by_name('pwd')
we_input.send_keys('111111')
sleep(5)
#
点击登录按钮
web_button=driver.find_element_by_link_text('登录').click()
#WebDriver
是⼀个服务端代理,当⾃动化结束时,需要记得释放资源
sleep(10)
driver.quit()
3.⼋⼤元素定位
所有的UI层的⾃动化都是基于元素定位来实现的,所有的被操作原⾊,都是webElement对象
元素=html便签
超链接:img/a/input/button/
通⽤:div/li/span/…
实际的系统中,元素的标签不是由表象来决定的,是通过css样式表来决定的
⾃动化时,就是基于标签的属性来定位标签
如何精准定位到需要操作的元素:
⼋⼤元素定位
查找单个元素:
{
(id,name,class_name【使⽤元素的class属性的定位】:属性定
(tag_name:【标签名称<标签名 xxx/>】标签定位) (link_text,partial_link_text[模糊查询]:定位a标签)
(xpath【基于元素路径定位】,css【基于元素选择器定位】:功能强⼤)
}
#基于id定位 (driver.)
查找单个元素⽅法执⾏记录
**find_element_by_name√基于name定位 基于元素属性中的name值来进⾏定位 name类似于⾝份证上的名字,有可能重名
**find_element_by_id√基于元素属性中的id值来进⾏定位 id类似于⾝份证号,不出意外,不会重复
find_element_by_link_text√基于link text定位 主要⽤于超链接进⾏定位 _element_by_link_text(‘注册’).click()
查找单个元素⽅法执⾏记录
**find_element_by_xpath径:从html根路径下⼀层⼀层往下数,找到对应的层级,从⽽找到元素(绝境) 相对路径:基于匹配制度查看元素。
⽬前应⽤最多的⼀种⾏为,基于页⾯结构来进⾏的定位 -嵌套关系,直接在源⽂件中copy xpath内容即可 绝对路
依据xpath结构来⾛
find_element_by_partial_link_text基于partial link text:link text的模糊查询版本,类似于数据库中的link %
find_element_by_tag_name通常使⽤elements <标签名 /> 不⽅便定位 。如果存在多个相同标签,则返回符合条件的第⼀个标签
find_element_by_class_name基于classname定位 不建议使⽤,有空格的情况下,会出现查询不到的情况
find_element_by_css_selector应⽤相对较多的⼀种⾏为,最初IE浏览器不⽀持xpath.万群基于class属性来实现的定位
⼀:为什么要使⽤xpath,css定位呢?
1. id,name,class_name:依赖于元素三个对应的属性,如果元素么有以上三个属性,则定位失败
2. link_text,partial_link_text:只能定位超链接
3. tag_name:只能查找页⾯唯⼀元素,或页⾯中多个相同元素的第⼀个元素
⼆:确认xpath路径是否正确?
1. 在开发者⼯具elements页⾯使⽤ctrl+f查找,进⾏判断
2. 在console中输⼊$x()进⾏校验
如果要基于text来定位元素,在[]中添加text()=‘⽂本内容’来进⾏查找。例如://a[text()=‘登录’]
三:xpath定位策略(⽅式)
1. 路径-定位:绝对: 以单斜杠开头,逐级开始编写(不可跳级。如/html/boby/div/p[1]/input)相对:以//开头,//后跟元素名称,不知
元素名称可以使⽤
代替 如//input,//
2. 利⽤元素属性-定位:在xpath中,所有的属性必须使⽤@符号修饰。如://*[@id=‘id值’]
3. 属性与逻辑结合-定位://*[@id=‘id值’ and @属性=‘属性值’]
4. 层级与属性结合-定位://*[@id=‘⽗级id属性值’]/⼦集元素(input)
提⽰:
⼀般使⽤指定标签名称,不建议使⽤*代替,⽐较慢
find_elements_by_xpath–
查找多个元素⽅法执⾏记录
find_elements_by_link_text多个”百度“元素,通过下标来进⾏定位 list列表,0,1,2,3…
标签名进⾏定位,重复度最⾼,只有在需要定位后进⾏⼆次筛选dr=_elements_by_tag_name(‘a’)for
d in dr: if ==‘登录’:()-
–find_elements_by_class_name
–find_elements_by_css_selector
find_elements_by_tag_name
两个私有⽅法
两个私有⽅法执⾏记录
find_element
find_elements
css定位常⽤策略:
1. id选择器:根据元素id属性来选择:#id
2. class选择器:根据元素class属性来选择:.class
3. 元素选择器;根据元素的标签名选择: a
4. 属性选择器: [action="/s"]
5. 层级选择器:p>a
from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()
driver.get("")
driver.find_element_by_id("kw").send_keys("菜鸟教程")#id
唯⼀
driver.find_element_by_name("wd").send_keys("菜鸟教程")#name
可重名
driver.find_element_by_class_name("s_ipt").send_keys("菜鸟教程")#class_name
driver.find_element_by_tag_name("input").send_keys("菜鸟教程")#tag_name:
只返回第⼀个元素
#link_text:a
只能定位标签,定位的内容必须为全部匹配
driver.find_element_by_link_text("新闻").click()# link_text:
点击新闻超链接
#partial_link_text:a
只能定位标签,定位的内容可以是模糊匹配,但需代表唯⼀性
driver.find_element_by_partial_link_text("新闻").click()
driver.find_element_by_xpath("//input[@class='s_ipt']").send_keys("hello")#xpath
driver.find_element_by_css_selector("#kw").send_keys("hello")#css id
driver.find_element_by_css_selector('.s_ipt')#css class
driver.find_element_by_css_selector('form')#css
元素
driver.find_element_by_css_selector('[action="/s"]')#css
属性
driver.find_element_by_css_selector('p->a')#css
层级
sleep(3)
发布评论