总结:
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次")@classmethoddef setUpClass(cls):# 前置操作:连接数据,打开浏览器print("setUpClass执行用例前会执行 ,总共只执行一次")# 后置操作def tearDown(self) ‐> None:# 后置操作:浏览器的关闭print("tearDown执行完每条用例前都会执行代码,有n条用例,则会执行n次")@classmethoddef 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 timeimport unittestfrom selenium import webdriverfrom selenium.webdriver import ActionChainsfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom 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@classmethoddef 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@classmethoddef 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_handlesself.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")# 3testcases = unittest.defaultTestLoader.discover('../','test*.py')unittest.main(defaultTest='testcases')
