前言
上篇文章我们已经了解到了数据驱动自动化测试框架是如何构建和驱动测试的!那么这篇文章我们将了解关键字驱动测试又是如何驱动自动化测试完成整个测试过程的。关键字驱动框架是一种功能自动化测试框架,它也被称为表格驱动测试或者基于动作字的测试。关键字驱动的框架的基本工作是将测试用例分成四个不同的部分。首先是测试步骤(Test Step),二是测试步骤中的对象(Test Object),三是测试对象执行的动作(Action),四是测试对象需要的数据(Test Data)。
其实我们做关键字的驱动的思想,就是把编码从测试用例和测试步骤中分离出来,这样对于不会编码的人员更容易理解自动化,从而让手工测试人员也可以编写自动脚本。(这并不意味着不需要自动化测试人员,对于自动化框架的构建,自动化代码的更新,结构调整等都需要一个技术性的人员)对于测试小的项目的团队,可以有两个手工测试人员和一个自动化测试人员。
一、项目功能
我们今天将要实现的功能是测试126邮箱的登录及登录后发送一封带附件的邮件
测试地址
https://mail.126.com/
二、项目目录
接下来我们来看看我们的项目目录是如何设计的,每个目录的功能是用来做什么的?
三、框架搭建
接下来我们一步一步来考虑如何搭建整个项目及每个py代码文件如何编写?
3.1框架主要功能模块
1.新建util文件夹,并在此文件夹下新建ObjectMap.py文件,主要实现页面元素查找功能的封装
1 from selenium.webdriver.support.wait import WebDriverWait
2
3
4 def getElement(driver, by, locator):
5 '''
6 查找单一元素
7 :param driver:
8 :param by:
9 :param locator:
10 :return: 元素对象
11 '''
12 try:
13 element = WebDriverWait(driver, 30).until(lambda x : x.find_element(by, locator))
14 except Exception as e:
15 raise e
16 else:
17 return element
18
19 def getElements(driver, by, locator):
20 '''
21 获取一组元素
22 :param driver:
23 :param by:
24 :param locator:
25 :return: 一组元素对象
26 '''
27 try:
28 elements = WebDriverWait(driver, 30).until(lambda x : x.find_element(by, locator))
29 except Exception as e:
30 raise e
31 else:
32 return elements
33
34
35 if __name__=="__main__":
36 from selenium import webdriver
37 import time
38
39 driver = webdriver.Firefox()
40 driver.get('https://mail.126.com')
41 time.sleep(5)
42 driver.switch_to.frame(getElement(driver, 'xpath', "//div[@id='loginDiv']/iframe"))
43 username = getElement(driver, 'xpath', "//input[@name='email']")
44 username.send_keys('linuxxiaochao')
45 driver.switch_to.default_content()
46 driver.quit()
2.util文件夹下新建WaitUntil.py文件,主要实现显示等待元素功能的封装
1 from selenium.webdriver.common.by import By
2 from selenium.webdriver.support.wait import WebDriverWait
3 from selenium.webdriver.support import expected_conditions as EC
4
5 class WaitUnit(object):
6 def __init__(self, driver):
7 self.byDic = {
8 'id': By.ID,
9 'name': By.NAME,
10 'class_name': By.CLASS_NAME,
11 'xpath': By.XPATH,
12 'link_text': By.LINK_TEXT
13 }
14 self.driver = driver
15 self.wait = WebDriverWait(self.driver, 50)
16
17 def presenceOfElementLocated(self, by, locator):
18 '''
19 显示等待某个元素出现在dom中,不一定可见,存在返回元素对象
20 :param by:
21 :param locator:
22 :return:
23 '''
24 try:
25 if by.lower() in self.byDic:
26 self.wait.until(EC.presence_of_element_located((self.byDic[by.lower()], locator)))
27 else:
28 raise TypeError('未找到定位方式,请确保定位方式正确')
29 except Exception as e:
30 raise e
31
32 def frameToBeAvailableAndSwtichToIt(self, by, locator):
33 '''
34 检查frame是否存在,存在就切换到frame中
35 :param by:
36 :param locator:
37 :return:
38 '''
39 try:
40 if by.lower() in self.byDic:
41 self.wait.until(EC.frame_to_be_available_and_switch_to_it((self.byDic[by.lower()], locator)))
42 else:
43 raise TypeError('未找到定位方式,请确保定位方式正确')
44 except Exception as e:
45 raise e
46 def visibiltyOfElementLocated(self, by, locator):
47 '''
48 显示等待页面元素出现在dom中, 并且可见, 存在则返回该元素对象
49 :param by:
50 :param locator:
51 :return:
52 '''
53 try:
54 if by.lower() in self.byDic:
55 self.wait.until(EC.visibility_of_element_located((self.byDic[by.lower()], locator)))
56 else:
57 raise TypeError('未找到定位方式,请确保定位方式正确')
58 except Exception as e:
59 raise e
60
61 if __name__=='__main__':
62 from selenium import webdriver
63 from util.ObjectMap import *
64 driver = webdriver.Firefox()
65 driver.get('https://mail.126.com')
66
67 wait = WaitUnit(driver)
68 wait.frameToBeAvailableAndSwtichToIt('xpath', "//div[@id='loginDiv']/iframe")
69 wait.visibiltyOfElementLocated('xpath', "//input[@name='email']")
70 uname = getElement(driver, 'xpath', "//input[@name='email']")
71 uname.send_keys('python')
72 driver.quit()
3.新建ClipboardUtil.py文件,用来实现剪切版的操作(我们发送邮件时,需要添加附件,通过这个功能来实现上传附件)
1 import win32clipboard as w
2 import win32con
3
4 class Clipboard(object):
5
6 @staticmethod
7 def getText():
8 '''
9 获取剪切板的内容
10 :return:
11 '''
12
13 try:
14 # 打开剪切板
15 w.OpenClipboard()
16 # 读取数据
17 value &