总结:
from selenium import webdriver
页面及元素常用操作:
四大操作
元素操作
三大等待
三大切换 句柄/frame/alert
键盘操作 keys
鼠标操作 ActionChains
JS操作 日期控件/滚动条
下拉列表
文件上传 input/非input类型文件
一、如何开展自动化测试
1、项目需求分析,了解业务需求 web功能纳入自动化测试
web功能:
1、新功能 手工测试
2、老功能 回归 冒烟用例 纳入自动化测试
2、选择何种方式实现自动化测试
1、工具 robotframework
2、独立搭建web自动化测试框架
3、编写自动化测试用例
一边写用例,一边调试用例脚本(用例编辑/封装/测试数据/脚本调试)
结合jenkins进行持续集成
4、执行自动化测试用例
1、定时执行、一键式执行
2、执行策略
执行频率?—-回归频率、转测试、上线前、
自动化测试执行环境——集成测试环境、预发布环境、 生产环境
5、测试报告
6、维护脚本、优化框架
企业自动化测试岗位:
1、业务自动化测试 项目自动化测试框架已经构建了 工作内容: 维护框架+用例编辑
2、平台自动化测试开发 参与自动测试框架构建与设计、+维护框架+用例编辑
二、Unittest框架
Unittest框架:框架=测试模块+测试管理模块+测试统计模块,python的内置模块
import unittest
Unittest框架四大组件:
1、TestCase 测试用例
2、TestFixture
3、TestSuite 借助用例加载器 TestLoad
4、TestRunner
三、TestCase 测试用例
unittest中TestCase部分的规则:
1、用例类必须继承Unittest.TestCase,并且以test开头
2、每条用例,都必须以test开头
3、用例执行的顺序按照ASCII
0-9 a-z A-Z 顺序来执行用例
unittest也可以通过命令运行
命令执行TestShopnc类下的所有用例: python -m unittest 用例文件名.用例类
执行某一条用例: python -m unittest 用例文件名.用例类.用例名称
class TestShopnc(unittest.TestCase):
def test01_login(self):
# 用例操作步骤
# self.driver = webdriver.Chrome()
# self.driver.get("https://www.baidu.com")
# el1=self.driver.find_element(By.ID,"kw")
# el1.send_keys("码尚教育")
print("用例01")
#用例断言?
def test02_selectgoods(self):
print("用例02")
def test03_intocart(self):
print("用例03")
def test04_paygoods(self):
print("用例04")
四、TestFixture 测试夹具
执行测试用例前的前置操作及后置操作
web自动化测试:
前置操作:
后置操作:
# 前置操作
def setUp(self):
#
webdriver.Chrome.close()
webdriver.Chrome.quit()
# 加载项目
print("setUp执行每条用例前都会执行函数代码,有n条用例,则会执行n次")
@classmethod
def setUpClass(cls):
# 前置操作:连接数据,打开浏览器
print("setUpClass执行用例前会执行 ,总共只执行一次")
# 后置操作
def tearDown(self) ‐> None:
# 后置操作:浏览器的关闭
print("tearDown执行完每条用例前都会执行代码,有n条用例,则会执行n次")
@classmethod
def tearDownClass(cls) ‐> None:
# 退出浏览器,关闭数据库连接,清理数据
print("tearDownClass执行完所有用例之后会执行代码 ,总共只执行一次")
五、TestSuite 测试套件
用例集(把需要执行的用例汇总到一起)
1、用例加载器
if __name__ == '__main__':
print("main方法")
suite=unittest.TestSuite()
# 添加一个用例
suite.addTest(TestShopnc('test01_login'))
suite.addTest(TestShopnc('test02_ashopping'))
# # 添加多个用例
caselist=[TestShopnc('test03_intocart'),TestShopnc('test04_paygood')]
suite.addTests(caselist)
unittest.main(defaultTest="suite")
# 用例加载器
# 用例 TestLoader() suite
# loadTestsFromTestCase 加载某个用例类(继承TestCase)下的所有用例
suite2=unittest.TestSuite()
testcases=unittest.TestLoader().loadTestsFromTestCase(TestShopnc)
suite2.addTests(testcases)
unittest.main(defaultTest="suite2")
# 利用默认加载器实现加载用例
# 匹配test*.py用例文件名称
testcases=unittest.defaultTestLoader.discover('test*.py')
unittest.main(defaultTest="testcases")
# python3.5之后不支持loadTestsFromModule
# unittest.TestLoader().loadTestsFromModule()
六、TestRunner 测试运行器
执行用例,把执行的结果输出给到用户
用例执行结果状态:
. 用例执行成功
E 用例有异常
F 用例执行失败(断言失败)
作业:
基于unittest框架完成1登录、2商品检索、3加入购物车
项目地址:码尚学院电商系统-Powered by ShopNC
账号密码: admin admin123
import time
import unittest
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# webdriver.Chrome.close()
# webdriver.Chrome.quit()
class TestShop(unittest.TestCase):
# 前置操作
def setUp(self) -> None:
# 加载项目
# print("setUp执行每条用例前都会执行函数代码,有n条用例,则会执行n次")
# self.driver = webdriver.Chrome()
pass
@classmethod
def setUpClass(cls) -> None:
# 前置操作:连接数据,打开浏览器
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
cls.driver = webdriver.Chrome(options=options)
cls.driver.get("https://www.taobao.com")
print("setUpClass执行用例前会执行,总共只执行一次")
# 后置操作
def tearDown(self) -> None:
# 后置操作:浏览器的关闭
# print("tearDown执行完每条用例后都会执行函数代码,有n条用例,则会执行n次")
pass
@classmethod
def tearDownClass(cls) -> None:
# 退出浏览器,关闭数据库连接,清理数据
print("tearDownClass执行完用例后会执行,总共只执行一次")
cls.driver.quit()
def test01_login(self):
el_login = self.driver.find_element(By.XPATH,"//div/div/a[text()='亲,请登录']")
el_login.click()
loc = (By.ID,"fm-login-id")
# loc = (By.XPATH,"//form[@id='login-form']/div/div/input[@id='fm-login-id']")
WebDriverWait(self.driver,15,0.5).until(EC.presence_of_element_located(loc))
el_account = self.driver.find_element(*loc)
el_account.send_keys("xxx")
el_password = self.driver.find_element(By.ID,"fm-login-password")
el_password.send_keys("xxx")
el_submit = self.driver.find_element(By.XPATH,"//form/div/button[@type='submit']")
el_submit.click()
def test02_search(self):
# 用例操作步骤
el1_loc = (By.XPATH,"//form/div/input[@id='q']")
WebDriverWait(self.driver, 15, 0.5).until(EC.presence_of_element_located(el1_loc))
el1 = self.driver.find_element(*el1_loc)
el1.send_keys("笔记本电脑")
el2 = self.driver.find_element(By.XPATH,"//form/div/button[text()='搜索']")
el2.click()
# 用例断言?
def test03_addToCar(self):
el3_loc = (By.XPATH,"//div[@data-index='3']/div/div/a[@data-nid='638201878428']")
WebDriverWait(self.driver,15,0.5).until(EC.presence_of_element_located(el3_loc))
el3 = self.driver.find_element(*el3_loc)
el3.click()
wins = self.driver.window_handles
self.driver.switch_to.window(wins[-1])
el4_loc = (By.XPATH,"//dd/ul[@data-property='颜色分类']/li/a/span[contains(text(),'锐炬显卡')]")
WebDriverWait(self.driver,15,0.5).until(EC.presence_of_element_located(el4_loc))
el4 = self.driver.find_element(*el4_loc)
el4.click()
# actions = ActionChains(self.driver)
# actions.move_to_element(el4)
# actions.click()
# actions.perform()
time.sleep(2)
el5 = self.driver.find_element(By.XPATH,"//div/div/a[@id='J_LinkBasket']")
el5.click()
time.sleep(2)
if __name__ == '__main__':
# 1
# suite = unittest.TestSuite()
# testcases = unittest.TestLoader().loadTestsFromTestCase(TestShop)
# suite.addTests(testcases)
# unittest.main(defaultTest='suite')
# 2
# suite2 = unittest.TestSuite()
# testcases = unittest.TestLoader().loadTestsFromTestCase(TestShop)
# suite2.addTests(testcases)
# unittest.main(defaultTest="suite2")
# 3
testcases = unittest.defaultTestLoader.discover('../','test*.py')
unittest.main(defaultTest='testcases')