自动化脚本开发方案

主要是Python+Selenium自动化测试必备

浏览器驱动WebDriver提供胃we自动化各种语言(Python) 调用接口库

2. 通过各种浏览器的驱动(WebDriver)来驱动浏览器

在此,我们介绍谷歌浏览器驱动的下载方式

(1)查看谷歌浏览器版本,复制版本号,最后一位小数点后面的不要

2. 技术方案

选择Python + Selenium+unittest+PageObject(简称PO设计模式) 的技术方案。有以下原因:

(1)首先是Python 的选择,python语言简洁易学,用其进行自动化测试,对于人员的学习成本来讲比较实用,学习时间短,有优势;其次Python的工具免费的PyCharm社区版即可;除此之外Python自带的unittest单元测试框架可以很方便的实现自动化用例的设计和执行以及自动化用例套件的管理等任务。

(2)其次Selenium的WebDriver是开源工具,且Selenium是用于测试 Web 应用程序用户界面 (UI) 的成熟框架,同时,它也支持多语言、多浏览器。

(3)选择PO设计模式,可以有效地将页面对象与用例分离,使代码结构清晰,可读性更强;此外,采用PO设计模式,如果页面元素发生变化时,不需要去修改测试代码,只需要在页面类中修改即可,利于脚本维护。

硬件要求。硬件的要求不高,主要需要独立的测试环境。另外测试人员用的电脑最好是Windows桌面操作系统,使用Chrome浏览器进行Web元素的定位即可。

PO设计模式如下图所示:

根据PO设计模式图,实现思路如下:

第一步:基础层BasePage。在PO模式中抽象封装成一个BasePage类,在初始化方法__init__()中定义驱动(driver),并封装一些常用的页面操作方法到该类中。

第二步:每一个page都继承BasePage,通过driver来管理本page中的元素,将page中的操作封装成一个个的方法。

第三步:TestCase继承unittest.Testcase类,并且依赖page类,从而实现相应的测试步骤。

3. 设计与实现

3.1框架设计

采用PO设计模式及unittest测试框架,设计项目结构如下:

common包:存放公共类,包括生成日志文件、浏览器引擎等等。

config包:存放脚本执行环境的配置文件。

data包:存放测试所需的各种数据,包括图片、excel等等。

logs包:存放日志、截图及测试报告。

pages包:存放页面元素的定位、操作以及测试用例。

tool包:存放工具类。

结合PO设计模式图,在实际自动化测试实战过程中,一般对脚本的实现分为三层:

1)对象层: 用于存放页面元素定位和控件操作;

2)逻辑层: 则是一些封装好的功能用例模块;

3)业务层: 则是我们真正的测试用例的操作部分。

3.2实现步骤

以登录功能为例,具体实现步骤如下:

第一步:根据PO模式的设计,首先抽象封装并创建一个BasePage类,在初始化方法__init__()中定义驱动(driver);

class BasePage(object):
def __init__(self, driver):
self.driver = driver

第二步:创建LoginPage类并继承自BasePage类,这也是PO设计模式中最重要的对象层。LoginPage类中主要对登录页面上元素进行封装,使其成为具体的操作方法。如对用户名、密码框和登录按钮都封装成方法;

class LoginPage(BasePage):
login = (By.XPATH,'//*[@id="app"]/div/div/div[1]/main/section[3]/div[1]/span')
account_login_btn = (By.XPATH,'//*[@id="app"]/div/div[1]/form[2]/div[3]/div/span')
user_name = (By.XPATH,'//*[@id="app"]/div/div[1]/form[1]/div[1]/div/div/input')
password = (By.XPATH,'//*[@id="app"]/div/div[1]/form[1]/div[2]/div/div[1]/input')
captcha = (By.XPATH,'//*[@id="app"]/div/div[1]/form[1]/div[3]/div/div[1]/div/input')
user_login_btn = (By.XPATH,'//*[@id="app"]/div/div[1]/form[1]/div[5]/div/button/span')
def login_click(self):
self.driver.find_element(*self.login).click()
def account_Login_click(self):
self.driver.find_element(*self.account_login_btn).click()
def search_username(self,username):
self.driver.find_element(*self.user_name).send_keys(username)
def search_password(self,password):
self.driver.find_element(*self.password).send_keys(password)
def search_captcha(self,captcha):
self.driver.find_element(*self.captcha).send_keys(captcha)
def user_login_click(self):
self.driver.find_element(*self.user_login_btn).click()

第三步:usernamelogin()函数将单个元素操作组成一个完整的动作,包含输入用户名、密码、验证码并点击登录按钮等,使用时将username、password、captcha作为函数的入口,这是PO设计模式中的逻辑层;

# 传参方式登录,公共的登录方法
def usernamelogin(self, username, psw, captcha):
# print('账号密码方式登录')
loginpage = LoginPage(self.driver)
# 点击登录按钮
loginpage.login_click()
# 点击账号登录
loginpage.account_Login_click()
time.sleep(2)
loginpage.search_username(username)
loginpage.search_password(psw)
loginpage.search_captcha(captcha)
time.sleep(2)
loginpage.user_login_click()
time.sleep(2)

第四步:登录功能测试用例的编写,将test_accountlogin()方法写在test_bosslogin.py文件下,注意:unittest框架要求测试用例必须以’test’开头。这是PO设计模式中的业务层;

def test_accountlogin(self):
print('账号密码方式登录')
publiclogin = PublicLogin
publiclogin.usernamelogin(self,'auto50','oyhm123','oyhm')
BasePage.get_windows_img(self, 'testboss2账号密码方式登录成功')

第五步:使用unittest框架的discover()方法,加载并执行test_bosslogin.py文件下的所有测试用例。

if __name__ == '__main__':
# 构造测试集
runner =
HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"主流程自动化测试报告", tester=u"ZT")
suite11 =
unittest.defaultTestLoader.discover('./pages/testsuit/', pattern='test_bosslogin.py')
runner.run(suite11)

4. 脚本编写

编写自动化测试脚本时,应遵循以下原则:

(1)一个用例为一个完整的场景,从用户登录系统到最终退出并关闭浏览器。

(2)一个用例验证一个功能点,不要试图在用户登录系统后把所有功能都验证一遍。

(3)尽可能少地编写逆向逻辑用例。首先因为逆向逻辑的用例很多(例如,手机号输错有几十种情况),其次自动化脚本本身比较脆弱,复杂的逆向逻辑用例实现起来比较麻烦且容易出错。

(4)用例与用例之间尽量避免产生依赖。

(5)从稳定的功能点和手工测试通过后按照用例的优先级高低两方面入手编写测试用例。

(6)将具有高回报率和稳定的功能作为自动化脚本编写的重点,围绕关键业务的用例进行自动化测试。

x