总结:
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 用例文件名.用例类.用例名称

  1. class TestShopnc(unittest.TestCase):
  2. def test01_login(self):
  3. # 用例操作步骤
  4. # self.driver = webdriver.Chrome()
  5. # self.driver.get("https://www.baidu.com")
  6. # el1=self.driver.find_element(By.ID,"kw")
  7. # el1.send_keys("码尚教育")
  8. print("用例01")
  9. #用例断言?
  10. def test02_selectgoods(self):
  11. print("用例02")
  12. def test03_intocart(self):
  13. print("用例03")
  14. def test04_paygoods(self):
  15. print("用例04")

四、TestFixture 测试夹具

执行测试用例前的前置操作及后置操作
web自动化测试:
前置操作:
后置操作:

  1. # 前置操作
  2. def setUp(self):
  3. #
  4. webdriver.Chrome.close()
  5. webdriver.Chrome.quit()
  6. # 加载项目
  7. print("setUp执行每条用例前都会执行函数代码,有n条用例,则会执行n次")
  8. @classmethod
  9. def setUpClass(cls):
  10. # 前置操作:连接数据,打开浏览器
  11. print("setUpClass执行用例前会执行 ,总共只执行一次")
  12. # 后置操作
  13. def tearDown(self) ‐> None:
  14. # 后置操作:浏览器的关闭
  15. print("tearDown执行完每条用例前都会执行代码,有n条用例,则会执行n次")
  16. @classmethod
  17. def tearDownClass(cls) ‐> None:
  18. # 退出浏览器,关闭数据库连接,清理数据
  19. print("tearDownClass执行完所有用例之后会执行代码 ,总共只执行一次")

五、TestSuite 测试套件

用例集(把需要执行的用例汇总到一起)
1、用例加载器

  1. if __name__ == '__main__':
  2. print("main方法")
  3. suite=unittest.TestSuite()
  4. # 添加一个用例
  5. suite.addTest(TestShopnc('test01_login'))
  6. suite.addTest(TestShopnc('test02_ashopping'))
  7. # # 添加多个用例
  8. caselist=[TestShopnc('test03_intocart'),TestShopnc('test04_paygood')]
  9. suite.addTests(caselist)
  10. unittest.main(defaultTest="suite")
  11. # 用例加载器
  12. # 用例 TestLoader() suite
  13. # loadTestsFromTestCase 加载某个用例类(继承TestCase)下的所有用例
  14. suite2=unittest.TestSuite()
  15. testcases=unittest.TestLoader().loadTestsFromTestCase(TestShopnc)
  16. suite2.addTests(testcases)
  17. unittest.main(defaultTest="suite2")
  18. # 利用默认加载器实现加载用例
  19. # 匹配test*.py用例文件名称
  20. testcases=unittest.defaultTestLoader.discover('test*.py')
  21. unittest.main(defaultTest="testcases")
  22. # python3.5之后不支持loadTestsFromModule
  23. # unittest.TestLoader().loadTestsFromModule()

六、TestRunner 测试运行器

执行用例,把执行的结果输出给到用户
用例执行结果状态:
. 用例执行成功
E 用例有异常
F 用例执行失败(断言失败)

作业:

基于unittest框架完成1登录、2商品检索、3加入购物车
项目地址:码尚学院电商系统-Powered by ShopNC
账号密码: admin admin123

  1. import time
  2. import unittest
  3. from selenium import webdriver
  4. from selenium.webdriver import ActionChains
  5. from selenium.webdriver.common.by import By
  6. from selenium.webdriver.support.wait import WebDriverWait
  7. from selenium.webdriver.support import expected_conditions as EC
  8. # webdriver.Chrome.close()
  9. # webdriver.Chrome.quit()
  10. class TestShop(unittest.TestCase):
  11. # 前置操作
  12. def setUp(self) -> None:
  13. # 加载项目
  14. # print("setUp执行每条用例前都会执行函数代码,有n条用例,则会执行n次")
  15. # self.driver = webdriver.Chrome()
  16. pass
  17. @classmethod
  18. def setUpClass(cls) -> None:
  19. # 前置操作:连接数据,打开浏览器
  20. options = webdriver.ChromeOptions()
  21. options.add_argument("--disable-blink-features=AutomationControlled")
  22. cls.driver = webdriver.Chrome(options=options)
  23. cls.driver.get("https://www.taobao.com")
  24. print("setUpClass执行用例前会执行,总共只执行一次")
  25. # 后置操作
  26. def tearDown(self) -> None:
  27. # 后置操作:浏览器的关闭
  28. # print("tearDown执行完每条用例后都会执行函数代码,有n条用例,则会执行n次")
  29. pass
  30. @classmethod
  31. def tearDownClass(cls) -> None:
  32. # 退出浏览器,关闭数据库连接,清理数据
  33. print("tearDownClass执行完用例后会执行,总共只执行一次")
  34. cls.driver.quit()
  35. def test01_login(self):
  36. el_login = self.driver.find_element(By.XPATH,"//div/div/a[text()='亲,请登录']")
  37. el_login.click()
  38. loc = (By.ID,"fm-login-id")
  39. # loc = (By.XPATH,"//form[@id='login-form']/div/div/input[@id='fm-login-id']")
  40. WebDriverWait(self.driver,15,0.5).until(EC.presence_of_element_located(loc))
  41. el_account = self.driver.find_element(*loc)
  42. el_account.send_keys("xxx")
  43. el_password = self.driver.find_element(By.ID,"fm-login-password")
  44. el_password.send_keys("xxx")
  45. el_submit = self.driver.find_element(By.XPATH,"//form/div/button[@type='submit']")
  46. el_submit.click()
  47. def test02_search(self):
  48. # 用例操作步骤
  49. el1_loc = (By.XPATH,"//form/div/input[@id='q']")
  50. WebDriverWait(self.driver, 15, 0.5).until(EC.presence_of_element_located(el1_loc))
  51. el1 = self.driver.find_element(*el1_loc)
  52. el1.send_keys("笔记本电脑")
  53. el2 = self.driver.find_element(By.XPATH,"//form/div/button[text()='搜索']")
  54. el2.click()
  55. # 用例断言?
  56. def test03_addToCar(self):
  57. el3_loc = (By.XPATH,"//div[@data-index='3']/div/div/a[@data-nid='638201878428']")
  58. WebDriverWait(self.driver,15,0.5).until(EC.presence_of_element_located(el3_loc))
  59. el3 = self.driver.find_element(*el3_loc)
  60. el3.click()
  61. wins = self.driver.window_handles
  62. self.driver.switch_to.window(wins[-1])
  63. el4_loc = (By.XPATH,"//dd/ul[@data-property='颜色分类']/li/a/span[contains(text(),'锐炬显卡')]")
  64. WebDriverWait(self.driver,15,0.5).until(EC.presence_of_element_located(el4_loc))
  65. el4 = self.driver.find_element(*el4_loc)
  66. el4.click()
  67. # actions = ActionChains(self.driver)
  68. # actions.move_to_element(el4)
  69. # actions.click()
  70. # actions.perform()
  71. time.sleep(2)
  72. el5 = self.driver.find_element(By.XPATH,"//div/div/a[@id='J_LinkBasket']")
  73. el5.click()
  74. time.sleep(2)
  75. if __name__ == '__main__':
  76. # 1
  77. # suite = unittest.TestSuite()
  78. # testcases = unittest.TestLoader().loadTestsFromTestCase(TestShop)
  79. # suite.addTests(testcases)
  80. # unittest.main(defaultTest='suite')
  81. # 2
  82. # suite2 = unittest.TestSuite()
  83. # testcases = unittest.TestLoader().loadTestsFromTestCase(TestShop)
  84. # suite2.addTests(testcases)
  85. # unittest.main(defaultTest="suite2")
  86. # 3
  87. testcases = unittest.defaultTestLoader.discover('../','test*.py')
  88. unittest.main(defaultTest='testcases')