
怎样从0开始搭建一个测试框架_1
发布日期:2021-05-07 23:32:23
浏览次数:21
分类:精选文章
本文共 5742 字,大约阅读时间需要 19 分钟。
这一步我们用到了selenium的基本的知识,以及一些unittest和PyYaml库的内容,有问题的同学可以参考我之前的博客:
我们先创建一个简单的脚本吧,在test文件夹创建test_baidu.py:
import osimport timefrom selenium import webdriverfrom selenium.webdriver.common.by import ByURL = "http://www.baidu.com"base_path = os.path.dirname(os.path.abspath(__file__)) + '\..'driver_path = os.path.abspath(base_path+'\drivers\chromedriver.exe')locator_kw = (By.ID, 'kw')locator_su = (By.ID, 'su')locator_result = (By.XPATH, '//div[contains(@class, "result")]/h3/a')driver = webdriver.Chrome(executable_path=driver_path)driver.get(URL)driver.find_element(*locator_kw).send_keys('selenium 灰蓝')driver.find_element(*locator_su).click()time.sleep(2)links = driver.find_elements(*locator_result)for link in links: print(link.text)driver.quit() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
脚本打开chrome,输入“selenium 灰蓝”,然后把所有结果中的标题打印出来。
如果想要搜索“Python selenium”,是不是要再创建一个脚本?还是把原来的脚本修改一下?
或者我们可以用unittest来改一下,把两次搜索分别写一个测试方法:
import osimport timeimport unittestfrom selenium import webdriverfrom selenium.webdriver.common.by import Byclass TestBaiDu(unittest.TestCase): URL = "http://www.baidu.com" base_path = os.path.dirname(os.path.abspath(__file__)) + '\..' driver_path = os.path.abspath(base_path+'\drivers\chromedriver.exe') locator_kw = (By.ID, 'kw') locator_su = (By.ID, 'su') locator_result = (By.XPATH, '//div[contains(@class, "result")]/h3/a') def setUp(self): self.driver = webdriver.Chrome(executable_path=self.driver_path) self.driver.get(self.URL) def tearDown(self): self.driver.quit() def test_search_0(self): self.driver.find_element(*self.locator_kw).send_keys('selenium 灰蓝') self.driver.find_element(*self.locator_su).click() time.sleep(2) links = self.driver.find_elements(*self.locator_result) for link in links: print(link.text) def test_search_1(self): self.driver.find_element(*self.locator_kw).send_keys('Python selenium') self.driver.find_element(*self.locator_su).click() time.sleep(2) links = self.driver.find_elements(*self.locator_result) for link in links: print(link.text)if __name__ == '__main__': unittest.main() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
现在,我们把配置抽出来放到config.yml中:
URL: http://www.baidu.com 1
为了读取yaml文件,我们需要一个封装YamlReader类,在utils中创建file_reader.py文件:
import yamlimport osclass YamlReader: def __init__(self, yamlf): if os.path.exists(yamlf): self.yamlf = yamlf else: raise FileNotFoundError('文件不存在!') self._data = None @property def data(self): # 如果是第一次调用data,读取yaml文档,否则直接返回之前保存的数据 if not self._data: with open(self.yamlf, 'rb') as f: self._data = list(yaml.safe_load_all(f)) # load后是个generator,用list组织成列表 return self._data 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
而且我们需要一个Config类来读取配置,config.py:
"""读取配置。这里配置文件用的yaml,也可用其他如XML,INI等,需在file_reader中添加相应的Reader进行处理。"""import osfrom utils.file_reader import YamlReader# 通过当前文件的绝对路径,其父级目录一定是框架的base目录,然后确定各层的绝对路径。如果你的结构不同,可自行修改。# 之前直接拼接的路径,修改了一下,用现在下面这种方法,可以支持linux和windows等不同的平台,也建议大家多用os.path.split()和os.path.join(),不要直接+'\\xxx\\ss'这样BASE_PATH = os.path.split(os.path.dirname(os.path.abspath(__file__)))[0]CONFIG_FILE = os.path.join(BASE_PATH, 'config', 'config.yml')DATA_PATH = os.path.join(BASE_PATH, 'data')DRIVER_PATH = os.path.join(BASE_PATH, 'drivers')LOG_PATH = os.path.join(BASE_PATH, 'log')REPORT_PATH = os.path.join(BASE_PATH, 'report')class Config: def __init__(self, config=CONFIG_FILE): self.config = YamlReader(config).data def get(self, element, index=0): """ yaml是可以通过'---'分节的。用YamlReader读取返回的是一个list,第一项是默认的节,如果有多个节,可以传入index来获取。 这样我们其实可以把框架相关的配置放在默认节,其他的关于项目的配置放在其他节中。可以在框架中实现多个项目的测试。 """ return self.config[index].get(element) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
修改test_baidu.py:
import timeimport unittestfrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom utils.config import Config, DRIVER_PATHclass TestBaiDu(unittest.TestCase): URL = Config().get('URL') locator_kw = (By.ID, 'kw') locator_su = (By.ID, 'su') locator_result = (By.XPATH, '//div[contains(@class, "result")]/h3/a') def setUp(self): self.driver = webdriver.Chrome(executable_path=DRIVER_PATH + '\chromedriver.exe') self.driver.get(self.URL) def tearDown(self): self.driver.quit() def test_search_0(self): self.driver.find_element(*self.locator_kw).send_keys('selenium 灰蓝') self.driver.find_element(*self.locator_su).click() time.sleep(2) links = self.driver.find_elements(*self.locator_result) for link in links: print(link.text) def test_search_1(self): self.driver.find_element(*self.locator_kw).send_keys('Python selenium') self.driver.find_element(*self.locator_su).click() time.sleep(2) links = self.driver.find_elements(*self.locator_result) for link in links: print(link.text)if __name__ == '__main__': unittest.main() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
我们已经把配置分离出来了,虽然现在看起来似乎很麻烦,但是想想如果你有50个用例文件甚至更多,一旦项目URL变了,你还要一个个去修改吗?
所有的代码我都放到了GITHUB上,可以自己下载去学习,有什么好的建议或者问题,可以留言或者加我的讨论。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月15日 19时15分21秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
结构型设计在工作中的一些经验总结
2021-05-07
如何提升员工体验 助力企业业务增长?这个棘手的问题终于被解决了!
2021-05-07
2020 AI 产业图谱启动,勾勒中国 AI 技术与行业生态
2021-05-07
Netty4服务端入门代码示例
2021-05-07
Spring源码:prepareBeanFactory(beanFactory);方法
2021-05-07
AcWing 828. 模拟栈
2021-05-07
(20200328已解决)从docker容器内复制文件到宿主机
2021-05-07
理解Docker ulimit参数
2021-05-07
OpenAI Gym简介及初级实例
2021-05-07
int 转 CString
2021-05-07
Edit编辑框自动换行与长度
2021-05-07
Java面向对象
2021-05-07
JAVA带标签的break和continue
2021-05-07
Java获取线程基本信息的方法
2021-05-07
vue源码分析(MVVM篇)
2021-05-07
设计模式之组合模式
2021-05-07
(Python学习笔记):字典
2021-05-07
(C++11/14/17学习笔记):线程启动、结束,创建线程多法、join,detach
2021-05-07
leetcode 14 最长公共前缀
2021-05-07
做做Java
2021-05-07