selenium
selenium是一个第三方库,python有很多库;
1、什么是ui自动化?
通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。
2、ui自动化的优点?
(1)解决重复性的功能测试和验证
(2)减少测试人员在回归测试时用例漏测和验证点的漏测
(3)减少冒烟测试,回归测试的人力成本,节省时间,提高测试效率
3、ui自动化缺点?
(1)需求不稳定,比如,敏捷开发速度快,ui频繁变更,定位不稳定,提高了用例维护的成本
(2)用例的覆盖率少,占用例总数的15%-30%
(3)场景覆盖占当前功能场景70%-80%
4、ui自动化和功能测试哪个更重要?
都重要
原因:(1)功能测试是基础,在熟悉功能的前提下才能做好ui自动化
5.selenium是一个第三方库:下载这个库
(1)在dos中下载
pip install selenium==3.141.0
(2)在pycharm中的setting下载
第三方库存放地址
出现版本urllib高,需要降低版本
6.安装浏览器:建议谷歌
(1)安装版本,查看自己的版本
(2)对应的驱动和谷歌
对应版本镜像链接1:http://chromedriver.storage.googleapis.com/index.html
对应版本镜像链接2:https://registry.npmmirror.com/binary.html?path=chromedriver/
谷歌下载低版本:https://downzen.com/en/windows/google-chrome/versions/ 不同版本的
https://googlechromelabs.github.io/chrome-for-testing/#stable 最新版本Google驱动歌
(3)将驱动放在python文件下
7.编写运行代码:
from selenium import webdriver #导入selenium模块中的webdriver dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("http://49.233.201.254:8080/cms/manage/login.do") #通过get打开页面 dx.maximize_window() #窗口最大化 dx.find_element_by_id("userAccount").send_keys("admin") #找到id属性,输入账号
查看元素
调用浏览器
# from selenium import webdriver #导入一个selenium 库中导入webdriver模块
'''
在Python中做UI自动化:selenium'''
# 创建一个drvier对象用来调用打开浏览器,对浏览器实现操作
# driver =webdriver.Chrome() #主讲谷歌浏览器
#driver =webdriver.Ie()
#driver =webdriver.firefox()
'''通过调用webdrvier.来引用对应的浏览器,生成一个浏览器对象
注意事项:webdrvier. 点后面的浏览器名称不要自己输入用联想
还有自己添加一个英文的小括号() 小括号的作用是:把它声明成为
一个匿名对象 那么当前的drvier就是一个浏览器驱动对象,可以用它来
对对应的浏览器实现操作的动作'''
# UI自动化所有的调用都必须在最前面加上一个drvier对象
# 通过对象来打开谷歌浏览器且输入网址
# driver.get('http://www.baidu.com')
# 通过对象调用get方法来打开一个网站URL
一.打开窗口
1.dx,.get 打开网站
from selenium import webdriver #导入selenium模块中的webdriver
dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象
dx.get("http://49.233.201.254:8080/cms/manage/login.do") #通过get打开页面
(2)重开窗口打开页面
from selenium import webdriver #导入selenium模块中的webdriver
import time
dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象
dx.get("http://49.233.201.254:8080/cms/manage/login.do") #通过get打开页面
time.sleep(2)
w="window.open('https://www.baidu.com')"
dx.execute_script(w)
二、时间等待
1.强制等待 sleep(xx)
2.隐性等待 implicitly_wait(xx)
3.显性等待 WebDriverWait
案例:
from selenium import webdriver #导入selenium模块中的webdriver
import time
dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象
dx.get("http://49.233.201.254:8080/cms/manage/login.do") #通过get打开页面
# time.sleep(5) #强制等待
dx.implicitly_wait(10) #隐式等待
#WebDriverWait#显示等待
w="window.open('https://www.baidu.com')"
dx.execute_script(w)
三.页面刷新
dx.refresh() #刷新
代码:
from selenium import webdriver #导入selenium模块中的webdriver
import time
dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象
dx.get("http://49.233.201.254:8080/cms/manage/login.do") #通过get打开页面
time.sleep(2)
dx.refresh() #刷新
四.返回上一页,切换到下一页
dx.back() 返回上一也
dx.forward() #切换到下一页
代码:
from selenium import webdriver #导入selenium模块中的webdriver
import time
dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象
dx.get("http://49.233.201.254:8080/cms/manage/login.do") #通过get打开页面
time.sleep(2)
dx.get("https://www.baidu.com")
time.sleep(2)
dx.back() #切换到上一页
time.sleep(2)
dx.forward() #切换到下一页
五.设置窗口
(1)窗口最大化
语句:
dx.maximize_window()
from selenium import webdriver #导入selenium模块中的webdriver
import time
dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象
dx.get("http://49.233.201.254:8080/cms/manage/login.do") #通过get打开页面
time.sleep(2)
dx.maximize_window()
(2)设置窗口大小
dx.set_window_size(500,500)
代码:
from selenium import webdriver #导入selenium模块中的webdriver
import time
dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象
dx.get("http://49.233.201.254:8080/cms/manage/login.do") #通过get打开页面
time.sleep(2)
dx.maximize_window()
time.sleep(2)
dx.set_window_size(500,500)
六.截图
from selenium import webdriver #导入selenium模块中的webdriver
import time
dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象
dx.get("http://49.233.201.254:8080/cms/manage/login.do") #通过get打开页面
dx.get_screenshot_as_file(r"E:\az\f\aa.png")
七.quit 退出所有窗口 ,close关闭当前窗口
(1)quit
from selenium import webdriver #导入selenium模块中的webdriver
import time
dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象
dx.get("http://49.233.201.254:8080/cms/manage/login.do") #通过get打开页面
time.sleep(2)
w="window.open('https://www.baidu.com')"
dx.execute_script(w)
dx.quit()
(2)close 关闭当前拆窗口
from selenium import webdriver #导入selenium模块中的webdriver
import time
dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象
dx.get("http://49.233.201.254:8080/cms/manage/login.do") #通过get打开页面
time.sleep(2)
w="window.open('https://www.baidu.com')"
dx.execute_script(w)
time.sleep(2)
# dx.quit()
dx.close()
selenium的定位
一.selenium中的定位9种方法
二.详解定位方法
案例:
https://www.baidu.com
(1)通过f12 或者开发者工具点开页面元素
(2)查看属性值
1.id定位方法
id=kw
from selenium import webdriver #导入selenium模块中的webdriver import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.baidu.com") #通过get打开页面 time.sleep(2) dx.maximize_window() dx.find_element_by_id("kw").send_keys("id定位")
2.name定位方法
from selenium import webdriver #导入selenium模块中的webdriver import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.baidu.com") #通过get打开页面 time.sleep(2) dx.maximize_window() dx.find_element_by_name("wd").send_keys("name定位")
3.class定位方法
class=s_ipt
from selenium import webdriver #导入selenium模块中的webdriver import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.baidu.com") #通过get打开页面 time.sleep(2) dx.maximize_window() dx.find_element_by_class_name("s_ipt").send_keys("class定位")
4、link定位方法
from selenium import webdriver #导入selenium模块中的webdriver import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.baidu.com") #通过get打开页面 time.sleep(2) dx.maximize_window() dx.find_element_by_link_text("hao123").click()
5.partial_link_text() 模糊文本值
from selenium import webdriver #导入selenium模块中的webdriver import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.baidu.com") #通过get打开页面 time.sleep(2) dx.maximize_window() dx.find_element_by_partial_link_text("hao").click()
6.xpath定位:
路径定位://*[@id="kw"]
from selenium import webdriver #导入selenium模块中的webdriver import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.baidu.com") #通过get打开页面 time.sleep(2) dx.maximize_window() dx.find_element_by_xpath('//*[@id="kw"]').send_keys("xpath定位")
7.css定位
css 辅助#kw
from selenium import webdriver #导入selenium模块中的webdriver import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.baidu.com") #通过get打开页面 time.sleep(2) dx.maximize_window() dx.find_element_by_css_selector("#kw").send_keys("css定位方法")
8. tag_name 方法:就是元素属性
通过input来定位
from selenium import webdriver #导入selenium模块中的webdriver import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.baidu.com") #通过get打开页面 time.sleep(2) dx.maximize_window() inputs=dx.find_elements_by_tag_name("input") #找到标签input for i in inputs: if i.get_attribute("name")=="wd": i.send_keys("tag_name定位方法")
9:js定位
from selenium import webdriver #导入selenium模块中的webdriver import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.baidu.com") #通过get打开页面 time.sleep(2) dx.maximize_window() js='document.getElementById("kw").value="js定位"' dx.execute_script(js)
10.定位方法运用:
在这9种常用的定位方法中,优先顺序 1)有id优先使用id定位 2)没有id,考虑使用name或者class定位。 3)如果没有id,name,class再考虑用xpath,css定位。 4)如果是链接可以考虑使用link_text,partial_link_text 定位。 5)tag_name和JavaScript还是用的比较少的。 我们根据实际情况,具体问题具体分析
Xpath定位
一.xpath 定位
格式:dx.find_element_by_xpath(xpath表达式)
两个定位:
1、绝对定位:
特点:1.以单斜杠/开头;
2.从页面根元素(HTML标签)开始,严格按照元素在HTML页面中的位置和顺序向下查找
右键copy full path复制
如:/html/body/div[2]/div[1]/div[5]/div/div/form/span[1]/input
2、相对定位:(我们一般都是用相对定位来定位的)
特点:1.以双斜杠//开头;
2.不考虑元素在页面当中的绝对路径和位置;
3.只考虑是否存在符合表达式的元素即可。
2.1使用标签名+节点属性定位
//*[@id="kw"]
语法://标签名[@属性名=属性值]
案例:
from selenium import webdriver #导入selenium模块中的webdriver import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.baidu.com") #通过get打开页面 time.sleep(2) dx.find_element_by_xpath('//*[@id="form"]/span[1]/input[1]').send_keys("path中层级定位") # dx.find_element_by_xpath('//input[@id="kw"]').send_keys("xpath中的标签定位") # dx.find_element_by_xpath('//*[@autocomplete="off" and @name="wd" ]').send_keys("xpath中组合属性and定位") # dx.find_element_by_xpath('//*[@autocomplete="off"]').send_keys("xpath中的其他属性定位") # dx.find_element_by_xpath('//*[@class="s_ipt"]').send_keys("xpath中的class定位") # dx.find_element_by_xpath('//*[@name="wd"]').send_keys("xpath中的name定位") # dx.find_element_by_xpath('//*[@id="kw"]').send_keys("xpath中的id定位")
二.css 定位
from selenium import webdriver #导入selenium模块中的webdriver import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.baidu.com") #通过get打开页面 time.sleep(2) dx.find_element_by_css_selector("#form>span>input").send_keys("css中层级爷爷级方法") # dx.find_element_by_css_selector("#form > span.bg.s_ipt_wr.new-pmd.quickdelete-wrap>input").send_keys("css中层级父级方法") # dx.find_element_by_css_selector("[autocomplete='off'][class='s_ipt']").send_keys("css中组合属性方法") # dx.find_element_by_css_selector("[autocomplete='off']").send_keys("css中其他属性方法") # dx.find_element_by_css_selector(".s_ipt").send_keys("css中class简写方法") # dx.find_element_by_css_selector("[class='s_ipt']").send_keys("css中class全称方法") # dx.find_element_by_css_selector("[name='wd']").send_keys("css中name全称方法") # dx.find_element_by_css_selector("[id='kw']").send_keys("css中id全称方法") # dx.find_element_by_css_selector("#kw").send_keys("css中id简写方法") time.sleep(20) dx.close()
定位
1、定位文本框,密码框,按钮
案例:
网站:
http://49.233.201.254:8080/cms/manage/login.do
from selenium import webdriver #导入selenium模块中的webdriver from time import * dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("http://49.233.201.254:8080/cms/manage/login.do") #通过get打开页面 sleep(2) dx.find_element_by_id("userAccount").send_keys("admin") sleep(2) dx.find_element_by_id("loginPwd").send_keys("123456") sleep(2) dx.find_element_by_id("loginBtn").click()
2.链接,隐藏框
(1)链接 link_text
from selenium import webdriver #导入selenium模块中的webdriver import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.baidu.com") #通过get打开页面 time.sleep(2) dx.find_element_by_link_text("网盘").click()
(2)隐藏框
案例1
from selenium import webdriver #导入selenium模块中的webdriver from selenium.webdriver.common.action_chains import ActionChains import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.baidu.com") #通过get打开页面 time.sleep(2) wz=dx.find_element_by_link_text("更多") ActionChains(dx).move_to_element(wz).perform() time.sleep(2) dx.find_element_by_link_text("健康").click()
案例2:
ActionChains()括号中接当前浏览器对象
move_to_element()括号中接当前你要模拟悬停的具体元素位置
.perform()对当前的位置进行点击悬停(类似于鼠标放在上面的动作)''
from selenium import webdriver #导入selenium模块中的webdriver from selenium.webdriver.common.action_chains import ActionChains import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.baidu.com") #通过get打开页面 time.sleep(2) dx.maximize_window() time.sleep(2) wz=dx.find_element_by_id("s-usersetting-top") ActionChains(dx).move_to_element(wz).perform() time.sleep(2) dx.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[3]/span').click()
通过点击:
from selenium import webdriver #导入selenium模块中的webdriver from selenium.webdriver.common.action_chains import ActionChains import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.baidu.com") #通过get打开页面 time.sleep(2) dx.maximize_window() time.sleep(2) dx.find_element_by_id("s-usersetting-top").click() time.sleep(2) dx.find_element_by_link_text("高级搜索").click()拓展:
ActionChains类(鼠标操作)
常用于模拟鼠标的行为,比如单击、双击、拖拽等行为
click(on_element=None) --- 鼠标单击
double_click(on_element=None) --- 双击
context_click(on_element=None) --- 右击
click_and_hold(on_element=None) --- 鼠标单击并且按住不放
drag_and_drop(source,target) --- 拖拽
drag_and_drop_by_offset(source,xoffset,yoffset) --- 将目标拖动到指定的位置
key_down(value,element=None) --- 按下某个键盘上的键
key_up(value,element=None) --- 松开某个键
move_by_offset(xoffset,yoffset) --- 鼠标从当前位置移动到某个坐标
move_to_element(to_element) --- 鼠标移动到某个元素
move_to_element_with_offset(to_element,xoffset,yoffset)
--- 移动到距某个元素(左上角坐标)多少距离的位置
perform() --- 执行链中的所有动作
release(on_element=None) --- 在某个元素位置松开鼠标左