目录
一:什么web自动化测试
对网页的测试 UI测试: web测试+app测试 web自动化测试:通过代码对网页进行测试 UI测试=web自动化测试+APP自动化测试
二:selenium的三大组件
1、selenium IDE 浏览器插件:实现脚本录制
2、WebDriver 实现对浏览器的各种操作(API包)
3、Grid 分布式执行,用例同时在多个浏览器同时执行,提搞测试效率
三:web自动化测试环境搭建 环境搭建步骤
1、安装selenium(第三方库) cmd命令:pip install selenium
2、安装浏览器(谷歌浏览器) 常见浏览器:chrome浏览器、IE浏览器、Firefox浏览器
3、安装浏览器驱动
谷歌浏览器驱动:chromedriver.exe
IE浏览器驱动:ieserverdriver.exe
Firefox浏览器驱动:geckodirver.exe
特别注意事项:下载驱动版本必须与浏览器的版本一致 下载地址:http://npm.taobao.org/mirrors/chromedriver/ chromedriver.exe文件放置到python安装路径(python.exe所在的路径)
四:web自动化测试第一个脚本 打开浏览器,加载项目地址
五:浏览器的常用操作
"""
xpath定位
find_element_by_xpath基于这个方法来实现
"""
# 通过绝对路径定位
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(2)
# 窗口最小化
driver.minimize_window()
#
# 窗口最大化
driver.maximize_window()
# 指定窗口的额大小
driver.set_window_size(2000,800)
# 返回
driver.back()
# 前景
driver.forward()
# 页面标题
driver.title
# 页面url
driver.current_url
# 页面源码
driver.page_source
# 截图保存为baidu.png
driver.get_screenshot_as_file(r"E:\PythonProject\web\baidu.png")
# 退出,关闭
driver.quit()
driver.close()
六、常用元素定位
定位常出现的问题
1、定位语句不对
2、是否加等待
3、元素嵌套在iframe/frame元素标签中(切换frame) 多层嵌套frame/iframe
4、要定位的元素非当前窗口(切换句柄)
1、web自动化测试就是通过代码对网页进行测试,在对网页进行测试之前,必须掌握如何 定位元素
2、元素定位的八大方法
1、基于id/name/class/tag_name定位
2、基于a标签元素的链接文本定位
# 元素的定位:
# id定位
driver.find_element(By.ID,'kw').send_keys("你好")
# # name 定位
# driver.find_element(By.NAME,'wd').send_keys("你好")
# # link_text定位
# driver.find_element(By.LINK_TEXT,'新闻').click()
# # partail_link_text定位
# driver.find_element(By.PARTIAL_LINK_TEXT,"新").click()
# xpath定位
# 绝对路径 /
# 相对路径 //
# 相对路径+索引定位
# driver.find_element(By.XPATH,"//form/span[1]/input").send_keys("黄小明")
# # 相对路径+属性定位
# driver.find_element(By.XPATH,"//input[@autocomplete='off']").send_keys("黄小明")
# # 相对路径+通配符定位
# driver.find_element(By.XPATH,"//*[@autocomplete='off']").send_keys("黄小明")
# # 相对路径+部分属性定位 #截取这个属性的值,定位已ff结尾的属性值
# driver.find_element(By.XPATH,"//*[starts-with(@autocomplete,'of')]").send_keys("黄小明") #已什么开头
# driver.find_element(By.XPATH,"//*[substring(@autocomplete,2)='ff']").send_keys("黄小明") #已什么结尾
driver.find_element(By.XPATH,"//*[contains(@autocomplete,'of')]").send_keys("黄小明") #包含什么
driver.find_element(By.ID,'su').click()
# 相对路径 + 文本定位
# ualue=driver.find_element(By.XPATH,"//span[text()='按图片搜索']").get_attribute('class')
# print(ualue)
# css定位
# 绝对路径:一般不用
# 相对路径
# 相对路径通过id和class定位
# 通过属性定位
# 通过部分属性定位
# 查询字元素定位
# 查询兄弟节点定位
4、css定位
"""
css定位
基于find_element_by_css_selector()实现
"""
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 通过绝对路径进行定位 一般不用
el1 = driver.find_element_by_css_selector("html body div div div div div formspaninput")
el2 = driver.find_element_by_css_selector("html>body> div> div> div> div >div > form > span > input")
# 2通过id定位 #id属性值
# 3通过class属性定位 .class属性值 s_ipt
el3 = driver.find_element_by_css_selector("#kw")
el4 = driver.find_element_by_css_selector('.s_ipt')
# 4通过其他属性定位,并且多个属性定位
el5 = driver.find_element_by_css_selector("[autocomplete='off']")
el6 = driver.find_element_by_css_selector("[autocomplete='off'][class='s_ipt']")
# 5通过标签定位 标签名+属性/id/class进行定位 组合定位
el7 = driver.find_element_by_css_selector("input#kw")
el8 = driver.find_element_by_css_selector("input.s_ipt")
el9 = driver.find_element_by_css_selector("input[autocomplete='off']")
# 6通过层级定位 层级之间通过>或者空格隔开 相对路径
el10 = driver.find_element_by_css_selector("form#form>span>input#kw")
# 通过兄弟节点定位
# 场景:同一个元素下面多一个相同的元素 多胞兄弟
# 第一个元素 标签:first‐child
# 第二个元素 标签:nth‐child(n)
# 最后元素 标签:last‐of‐type
el11 = driver.find_element_by_css_selector("div#s‐top‐left>a:first‐child")
el12 = driver.find_element_by_css_selector("div#s‐top‐left>a:nth‐child(3)")
el13 = driver.find_element_by_css_selector("div#s‐top‐left>a:last‐of‐type")
# el13.click()
# el10.send_keys("chromedriver")
# time.sleep(2)
# driver.close()
"""
定位多个元素
"""
ellist = driver.find_elements_by_css_selector("#kw")
print(ellist)
# 返回WebElement
el14 = ellist[0]
"""
元素定位是否通过一个方法,支持所有的定位方式定位到元素
find_element()
find_elements() 基于多个定位方式找到一组元素
"""
el15 = driver.find_element(By.CSS_SELECTOR, "#kw")
el16 = driver.find_element(By.ID, "kw")
el14.send_keys("chromedriver")
time.sleep(2)
driver.close()
七、元素的常用操作
1、四大操作:
1、输入
2、点击
3、获取文本
4、获取属性
"""
元素四大操作
"""
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(2)
el1=driver.find_element(By.ID,"kw")
# 输入
# el1.send_keys()
# 点击
# el1.click()
# 获取元素文本内容
el2=driver.find_element(By.LINK_TEXT,"新闻")
print("打印该元素的文本内容:",el2.text)
# 获取元素的属性
print("获取autocomplete属性值:",el1.get_attribute("autocomplete"))
2、三大切换
1、切换窗口:当定位的元素不在当前窗口,则需要切换窗口
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
"""
元素等待:
1、强制等待 time.sleep(秒数) 停留
2、智能等待(隐士等待) driver.implicitly_wait(秒数) 给页面上所有的元素设置全
局等待时间
只要在设置的时间范围内找到了元素,就会执行下一个代码,最多等待设置的时间
3、显示等待 显示等待:等待当前需要操作的元素 基于多种条件+等待元素
多种条件:等待元素可见?等待url跳转为xxx?等待新窗口出现?很多场景条件
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
自动化测试框架脚本:
以显示等待为主
以强制等待为辅
"""
driver=webdriver.Chrome()
# 智能等待
# driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
# 输入搜索内容
el1=driver.find_element(By.ID,"kw")
el1.send_keys("chromedriver")
#点击百度一下
el2=driver.find_element(By.ID,'su')
el2.click()
# 显示等待
loc=(By.LINK_TEXT,"ChromeDriver Mirror")
# 等待元素存在
WebDriverWait(driver,15,0.5).until(EC.presence_of_element_located(loc))
# 点击搜索的内容
el3=driver.find_element(*loc)
el3.click()
# 新打开的窗口里面定位元素 需要切换窗口
# 获取浏览器窗口列表 最早打开的窗口放到list的最前面
wins=driver.window_handles
print(wins)
# 切换最后打开的窗口
driver.switch_to.window(wins[‐1])
el4=driver.find_element(By.LINK_TEXT,"2.0/")
el4.click()
# 为了看到效果
time.sleep(3)
driver.close()
2、切换iframe:当定位的元素在frame/iframe,则需要切换
"""
定位的元素包含在iframe/frame标签里面
切换到iframe/frame
"""
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
driver=webdriver.Chrome()
driver.get("https://ke.qq.com/?tuin=80805fad")
driver.find_element(By.ID,"js_login").click()
time.sleep(2)
# 切换iframe 方式一:id
# driver.switch_to.frame("id")
# 切换iframe 方式二:索引 索引值从0开始
driver.switch_to.frame(1)
# 切换iframe 方式三:找到iframe元素
# driver.switch_to.frame(driver.find_elements(By.XPATH,"//iframe")[2])
# 再定位元素
driver.find_element(By.LINK_TEXT,"帐号密码登录").click()
time.sleep(2)
driver.close()
3、切换弹出窗口
3、元素三大等待
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
"""
元素等待:
1、强制等待 time.sleep(秒数) 停留
2、智能等待(隐士等待) driver.implicitly_wait(秒数) 给页面上所有的元素设置全
待时间
只要在设置的时间范围内找到了元素,就会执行下一个代码,最多等待设置的时间
3、显示等待 显示等待:等待当前需要操作的元素 基于多种条件+等待元素
多种条件:等待元素可见?等待url跳转为xxx?等待新窗口出现?很多场景条件
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
自动化测试框架脚本:
以显示等待为主
以强制等待为辅
"""
driver=webdriver.Chrome()
# 智能等待
# driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
# 输入搜索内容
el1=driver.find_element(By.ID,"kw")
el1.send_keys("chromedriver")
#点击百度一下
el2=driver.find_element(By.ID,'su')
el2.click()
# 显示等待
loc=(By.LINK_TEXT,"ChromeDriver Mirror")
# 等待元素存在
WebDriverWait(driver,15,0.5).until(EC.presence_of_element_located(loc))
# 点击搜索的内容
el3=driver.find_element(*loc)
el3.click()
# 新打开的窗口里面定位元素 需要切换窗口
# 获取浏览器窗口列表 最早打开的窗口放到list的最前面
wins=driver.window_handles
print(wins)
# 切换最后打开的窗口
driver.switch_to.window(wins[‐1])
el4=driver.find_element(By.LINK_TEXT,"2.0/")
el4.click()
# 为了看到效果
time.sleep(3)
driver.close()
八、弹框的处理
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
driver=webdriver.Chrome()
driver.get(r"C:\Users\xingyao\Desktop\test.html")
el=driver.find_element(By.ID,"1")
time.sleep(2)
el.click()
# 弹窗进行处理
alert=driver.switch_to.alert
print(alert.text)
# 点击确认
# alert.accept()
time.sleep(2)
driver.close()
九、下拉框的操作
"""
实现下拉框的操作
from selenium.webdriver.support.select import Select
"""
from selenium.webdriver.support.select import Select
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
driver=webdriver.Chrome()
driver.get(r"C:\Users\xingyao\Desktop\test.html")
# 定位下拉框
el1=driver.find_element(By.ID,"banji")
select=Select(el1)
# 展示下拉框所有选项内容显示
print("展示下拉框所有选项内容",select.options)
time.sleep(2)
# 实现选择下拉框选项选择 有三种方式 索引 value 选项内容
select.select_by_index(1)
time.sleep(2)
select.select_by_value("22")
time.sleep(2)
select.select_by_visible_text("全栈VIP23期")
time.sleep(2)
driver.close()
十、键盘操作
"""
键盘操作
"""
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver=webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element(By.ID,"kw").send_keys("码尚教育")
time.sleep(2)
# ctrl+a
driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,'a')
# ctrl+c
driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,'c')
# ctrl+x
driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,'x')
driver.find_element(By.ID,"kw").clear()
time.sleep(2)
# ctrl+v
driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,'v')
time.sleep(2)
driver.close()
十一、鼠标操作
"""
鼠标操作
ActionChains 动作链
可以把多个鼠标操作按照顺序连贯的统一执行
"""
from selenium.webdriver import ActionChains
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()
time.sleep(2)
el_set=driver.find_element(By.ID,"s‐usersetting‐top")
# 第一种写法,合起来写
# ActionChains(driver).move_to_element(el_set).perform()
# 第二种写法
actions=ActionChains(driver)
actions.move_to_element(el_set)
actions.perform()
time.sleep(1)
el_gjselect=driver.find_element(By.LINK_TEXT,"高级搜索")
el_gjselect.click()
time.sleep(2)
driver.close()
"""
ActionChains 常用的鼠标操作方法
鼠标常用操作:
滑块操作
click_and_hold 点击鼠标左键不松开
context_click 鼠标右击
double_click 双击
drag_and_drop 从一个元素拖到鼠标到另外一个元素
drag_and_drop_by_offset 拖到某个坐标松开
move_by_offset 鼠标从当前位置移动到某个坐标
move_to_element 鼠标移动到某个元素
move_to_element_with_offset 移动到距某个元素(左上角坐标)多少距离的位置
pause 停留
release 释放鼠标
"""
十二、日期控件
只读控件的日期控件,如何实现输入? javascript 实现 调用execute_script
"""
js操作
execute_script
"""
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("https://www.12306.cn/index/")
time.sleep(2)
# 只读日期控件元素
el_data = driver.find_element(By.ID, "train_date")
# 去掉readonly属性‐‐‐》通过js操作元素driver.execute_script()
# arguments 把execute_script后面的第二个或者第三个或者到第n个参数到放在arguments
js = "var el=arguments[0];el.removeAttribute('readonly');"
# 执行js脚本,去掉readonly属性
driver.execute_script(js, el_data)
# 清除日期控件默认值
el_data.clear()
time.sleep(2)
# # 日期控件输入设置的日期
el_data.send_keys('2021‐10‐01')
print("时间控件设置的日期:", el_data.get_attribute("value"))
十三、滚动条操作
什么情况下,需要把元素放到可见区域我才可以操作呢? 懒加载/慢加载 必须把元素移动可见区域,才会实现加载 ----》滚动条操作
"""
滚动条操作
"""
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element(By.ID, "kw").send_keys("selenium webdriver")
driver.find_element(By.ID, "su").click()
loc = (By.XPATH, "//div[@id='7']/h3/a")
# 显示等待 presence_of_element_located不一定元素可见,只要存在即可
WebDriverWait(driver, 15).until(EC.presence_of_element_located(loc))
el2 = driver.find_element(*loc)
time.sleep(2)
# el2.click()
# 实现滚动条从顶部到底部
driver.execute_script("scrollTo(0,document.body.scrollHeight)")
time.sleep(2)
# 实现滚动条从浏览器底部到顶部
driver.execute_script("scrollTo(document.body.scrollHeight,0)")
time.sleep(2)
# 操作哪个元素,滚动条移动到元素附近(元素与页面的顶部对齐,元素与页面的底部对
js2 = "arguments[0].scrollIntoView(false);"
driver.execute_script(js2, el2)
time.sleep(2)
十四、文件上传
"""
文件上传操作
类型一:支持直接输入
类型二:不可以直接输入,只能选择
"""
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
# 类型一:支持直接输入
driver=webdriver.Chrome()
driver.get(r"E:\VIP\M211\web\WebCode\class06\test.html")
time.sleep(4)
el_file=driver.find_element(By.ID,"f1")
el_file.send_keys(r"E:\VIP\M211\web\WebCode\class06\test.html")
time.sleep(2)
driver.close()
# 类型二:不可以直接输入,只能选择
# 如何定位windows窗口及窗口的元素?
# 环境准备
# 1、定位工具(失败window窗口及元素)‐‐‐winSpy
# 2、第三方库 pywin3
# 安装: pip install pywin3
# 切换源 pip install ‐i https://pypi.douban.com/simple pywin3
# 如何定位windows窗口及窗口的元素?
#文件上传输入框: #32770‐ComboBoxEx32 ‐ComboBox ‐Edit
# 打开按钮:#32770‐Button
import win32gui
import win32con
driver=webdriver.Chrome()
driver.get(r"E:\VIP\M211\web\WebCode\class06\test.html")
time.sleep(4)
el_file=driver.find_element(By.ID,"f1")
ActionChains(driver).move_to_element(el_file).click().perform()
def upload(filePath,browser_type="Chrome"):
if browser_type == "Chrome":
title = "打开"
else:
title = "文件上传"
# 32770‐ComboBoxEx32 ‐ComboBox ‐Edit
dialog = win32gui.FindWindow("#32770", title) # 一级窗口 ‘打开窗口’
ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, "ComboBoxEx32", None) # 二级
ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, "ComboBox", None) # 三级
edit = win32gui.FindWindowEx(ComboBox, 0, "Edit", None) # 四级
# 32770‐Button
button = win32gui.FindWindowEx(dialog, 0, "Button", None) # 四级
# 往文件名编辑框中输入文件路径
# 上传操作
win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, filePath)
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # 点击打开按钮
filepath = r"E:\VIP\M211\web\WebCode\class06\test.html"
time.sleep(5)
upload(filePath=filepath)
print("文件上传成功")
time.sleep(10)
同时打开多个页签
from selenium import webdriver
js="window.open('{}','_blank');"
#第一个网站
driver=webdriver.Chrome()
driver.get('http://web1.com')
driver.find_element_by_id('username').send_keys('user1')
driver.find_element_by_id('password').send_keys('pass1')
driver.find_element_by_tag_name('form').submit() #表单提交
#第二个网站
driver.execute_script(js.format('http://web2.com'))
driver.switch_to.window(driver.window_handles[-1]) #切换到最新页面
driver.find_element_by_id('userid').send_keys('user2')
driver.find_element_by_id('pwd').send_keys('pass2')
driver.find_element_by_id('Submit').click() #点击按钮
#第三个网站
driver.execute_script(js.format('http://wweb3.com')
driver.switch_to.window(driver.window_handles[-1]) #切换到最新页面
if 'login' in driver.current_url: #默认打开页面后会自动跳转到登录页
driver.find_element_by_id('_umname').send_keys('user3')
driver.find_element_by_id('pwd').send_keys('pass3')
driver.find_element_by_id('submit').click()