玩命加载中 . . .

web自动化1


自动化测试简介

定义

通过运行程序来代替人验证软件质量的过程

优点

  • 提高效率
  • 节约成本
  • 很方便地进行兼容性测试
  • 进行回归测试
  • 精度高

条件

1、项目周期长
2、项目需求变化周期长或变化频率不高
3、手工测试之后,系统相对稳定了之后比较适合做自动化

流程

决定是否做自动化->选择工具->测试计划->选择手工测试的测试用例->测试脚本的开发(测试的框架和测试用例的编->执行测试脚本->管理测试脚本->测试报告

web自动化环境搭建

1、pip install selenium
2、下载浏览器的驱动,驱动的版本号与浏览器的版本号一致

脚本的编写

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By

e = Service(executable_path=r'C:\web_selenium\driver\msedgedriver.exe')
driver = webdriver.Edge(service=e)

找元素

find_element(元素属性,值)

from selenium.webdriver.common.by import By

By类下有很多种寻找元素的方法:

By.ID # id
By.NAME # name
CLASS_NAME # class
LINK_TEXT # 超链接的内容
PARTIAL_LINK_TEXT # 包含超链接的内容
TAG_NAME # 标签名
XPATH # 路径
CSS_SELECTOR # css格式

登录禅道

# 登录禅道
driver.maximize_window()
driver.get('http://127.0.0.1/zentao/user-login.html') # 网页链接
driver.find_element(By.ID,'account').send_keys('admin') # 用户名
driver.find_element(By.NAME, 'password').send_keys('111Tianyangjun') # 密码
driver.find_element(By.ID,'submit').click() # 点击提交
sleep(1)

添加用户

# 添加用户
driver.find_element(By.LINK_TEXT, '组织').click()
driver.find_element(By.LINK_TEXT, "添加用户").click()
driver.find_element(By.NAME, 'account').send_keys('tester215_005')
driver.find_element(By.ID, 'password1').send_keys('Password1') # 输入密码
driver.find_element(By.ID, 'password2').send_keys('Password1') # 二次确认密码
driver.find_element(By.ID, 'realname').send_keys('tester215_005')
driver.find_element(By.ID, 'submit').click() # 提交新用户

添加滚动条

## 添加滚动条
js = 'var q=document.documentElement.scrollTop=200'
driver.execute_script(js)

切换层,切换到不同的iframe

## 删除用户
driver.find_element(By.LINK_TEXT, '组织').click()
driver.find_element(By.LINK_TEXT, '用户').click()
driver.find_element(By.ID, 'bysearchTab').click() # 点击搜索
sleep(1)
driver.find_element(By.ID, 'value1').send_keys('tester215_005')
driver.find_element(By.ID, 'submit').click()
sleep(1)
driver.find_element(By.CLASS_NAME, 'icon-trash').click()
sleep(1)
## 切换层,切换到不同的iframe
driver.switch_to.frame('iframe-triggerModal') # id/name/index

driver.find_element(By.ID, 'verifyPassword').send_keys('111Tianyangjun')
driver.find_element(By.ID, 'submit').click() # 点击删除

登出禅道

# 切换回原来的iframe
driver.switch_to.default_content()
sleep(1)
# 登出禅道
driver.find_element(By.CLASS_NAME, "user-name").click()
driver.find_element(By.LINK_TEXT, '退出').click()

鼠标事件,即鼠标移动到相应位置会自动有下拉条内容选择显示

# 鼠标事件
from selenium.webdriver.common.action_chains import ActionChains
driver.maximize_window()
driver.get('https://www.baidu.com')
target_elem=driver.find_element(By.ID, 's-usersetting-top')
ActionChains(driver).move_to_element(target_elem).perform()

键盘事件,模拟键盘输入

# 键盘事件
from selenium.webdriver.common.keys import Keys

driver.maximize_window()
driver.get('http://127.0.0.1/zentao/user-login.html')
driver.find_element(By.ID,'account').send_keys('admin')
driver.find_element(By.ID,'account').send_keys(Keys.BACK_SPACE) # 退格一位

上传文件

## 上传文件
driver.find_element(By.LINK_TEXT, '测试').click()
driver.find_element(By.XPATH, '//nav[@id="subNavbar"]/ul[1]/li[1]/a').click()
driver.find_element(By.LINK_TEXT, '提Bug').click()
sleep(1)
js = 'var q=document.documentElement.scrollTop=200'
driver.execute_script(js)
driver.find_element(By.XPATH, '//div[@class="file-input-empty"]/button').click()
sleep(1)

# 文件上传选择框
## 利用工具spy7.10.3077
import win32gui
import win32con
win1 = win32gui.FindWindow('#32770', '打开')
win2 = win32gui.FindWindowEx(win1, 0, 'ComboBoxEx32', None)
win3 = win32gui.FindWindowEx(win2, 0, 'ComboBox', None)
edit = win32gui.FindWindowEx(win3, 0, 'Edit', None)
button = win32gui.FindWindowEx(win1, 0, 'Button', '打开(&O)')
win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, r'C:\Users\86187\Desktop\test.txt')
sleep(1)
win32gui.SendMessage(win1, win32con.WM_COMMAND, 1, button)

弹出框,例如登录报错弹出框

# 弹出框
#方法一:
alert_dialog = driver.switch_to.alert # 切换到弹出框
content = alert_dialog.text           # 获取弹出框内容
alert_dialog.accept()                 # 点击弹出框的同意按钮
# alert_dialog.dismiss()                # 点击弹出框的取消按钮
print(content)

#方法二:
from selenium.webdriver.common.alert import Alert
content = Alert(driver).text
Alert(driver).accept()
print(content)

窗体的切换

# 窗体的切换
# current_handle = driver.current_window_handle
js = 'window.open("https://www.baidu.com");'
driver.execute_script(js)
# driver.switch_to.window(current_handle)
handles = driver.window_handles
sleep(1)
driver.switch_to.window(handles[0])

等待:

  • 强制等待
  • 显式等待
  • 隐式等待
# 等待
# 强制等待:time模块的sleep(),让进程停止运行
sleep(1)
# 显式等待:直到指定元素出现为止,等待结束,如果在指定时间内没有出现就报异常
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 直到By.CLASS_NAME, 'user-name'该元素出现了,等待结束
if WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'user-name'))):
    print('Yes')
    # 登出禅道
    driver.find_element(By.CLASS_NAME, "user-name").click()
    driver.find_element(By.LINK_TEXT, '退出').click()
else:
    print('页面加载太慢')
    
# 隐式等待:浏览器在设定的时间内不断刷新页面来寻找元素(可提高自动化测试脚本运行的速度)
driver.implicitly_wait(10)
driver.find_element(By.ID,'account').send_keys('admin')
driver.find_element(By.NAME, 'password').send_keys('111Tianyangjun')
driver.find_element(By.ID,'submit').click()

xpath获取元素方式

# # xpath: By.XPATH,插件:chropath
# 绝对路径:从根节点开始到目标位置
# 相对路径:从指定位置开始到目标位置

driver.implicitly_wait(10)
driver.find_element(By.CSS_SELECTOR, '#account').send_keys('admin')
driver.find_element(By.CSS_SELECTOR, '[name="password"]').send_keys('111Tianyangjun')

### XPATH方式:
driver.find_element(By.XPATH, '//td[@class="form-actions"]/button').click()

CSS方式获取元素

# # css_selector: By.CSS_SELECTOR
"""
    By.CSS_SELECTOR, 'div p': 获取标签div内部所有的p标签元素
    By.CSS_SELECTOR, 'div>p': 获取所有的父亲标签为
    By.CSS_SELECTOR, 'div+p': 获取所有div标签之后的所有p标签
    By.CSS_SELECTOR, '#d2': 获取属性id的值为d2的元素
    By.CSS_SELECTOR, '.tb': 获取属性class的值为tb的元素
    By.CSS_SELECTOR, '[text-align="center"]': 获取属性text-align="center"的元素
    By.CSS_SELECTOR, '[type]': 获取属性为type的所有元素
    By.CSS_SELECTOR, '[type~="text"]': 获取属性为type的内容包含text的所有元素
    By.CSS_SELECTOR, 'a[href^="https"]': 获取href属性值以https开头的所有a标签元素
    By.CSS_SELECTOR, 'a[src$=".jpg"]': 获取src属性值以.jpg结尾的所有a标签元素
    By.CSS_SELECTOR, 'a[src*="abc"]': 获取src属性值包含abc的所有a标签元素
    By.CSS_SELECTOR, '.tb2 td:nth-child(2)': 获取父亲元素.tb2的第二个子元素的所有td标签元素
    
"""

driver.implicitly_wait(10)
driver.find_element(By.CSS_SELECTOR, '#account').send_keys('admin')
driver.find_element(By.CSS_SELECTOR, '[name="password"]').send_keys('111Tianyangjun')
### CSS方式
driver.find_element(By.CSS_SELECTOR, '#submit').click()

文章作者: Jack Tim
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Tim !
评论
  目录