进行实战之前,我们先来了解一下自动化测试模型
一、线性测试
根据应用的操作步骤来编写对应的测试脚本,每个测试脚本相对独立且不产生其它的依赖于调用。
优点:每个测试脚本都是完整且独立的,可单独执行
缺点:开发和维护成本很高,存在很多重复的操作,且操作发生改变时需要修改多个地方
以登录豆瓣为例,注意豆瓣登录区域是一个iframe,需先切换到 iframe 再进行操作
示例代码:
import time from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait driver = webdriver.Chrome() driver.maximize_window() # 1. 打开豆瓣首页 driver.get("https://www.douban.com/") # 2. 登录(先来一条简单的,默认未登录) # 切换到登录的iframe login_frame = driver.find_element_by_css_selector("div.login iframe") WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(login_frame)) # 点击密码登录 driver.find_element_by_css_selector("li.account-tab-account").click() # 输入账号密码 driver.find_element_by_css_selector("#username").send_keys("****") driver.find_element_by_css_selector("#password").send_keys("****") # 点击登录 driver.find_element_by_css_selector(".account-form-field-submit").click() time.sleep(2) # 切换到默认页面 driver.switch_to.default_content() # 3. 判断是否登录成功 eles = driver.find_elements_by_css_selector(".nav-user-account") if len(eles) > 0: print("登录成功") driver.quit()
二、模块化驱动测试
借鉴了编程语言中的模块化思想,把重复的操作封装成一个公共的模块,当需要这一操作时直接调用公共模块即可,大大提高了开发效率,简化了维护的复杂性。
例如上面的测试脚本,可以把登录功能封装成一个方法,需要时直接调用
import time from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait driver = webdriver.Chrome() driver.maximize_window() def login(): # 切换到登录的iframe login_frame = driver.find_element_by_css_selector("div.login iframe") WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(login_frame)) # 点击密码登录 driver.find_element_by_css_selector("li.account-tab-account").click() # 输入账号密码 driver.find_element_by_css_selector("#username").send_keys("****") driver.find_element_by_css_selector("#password").send_keys("****") # 点击登录 driver.find_element_by_css_selector(".account-form-field-submit").click() time.sleep(2) # 切换到默认页面 driver.switch_to.default_content() driver.get("https://www.douban.com/") login() eles = driver.find_elements_by_css_selector(".nav-user-account") if len(eles) > 0: print("登录成功") driver.quit()
三、数据驱动
模块化驱动测试很好的解决了脚本重复的问题,但是如上面的登录用例,当需要使用不同的账号登录时还是需要重新编写用例,所以我们期望根据数据的改变来驱动测试,也就是数据的参数化,其中的数据可以是字典、数组或者是外部文件(csv、excel 等等),目的是实现数据与脚本的分离。
import time from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait driver = webdriver.Chrome() driver.maximize_window() douban_account = {"username":"****", "password":"****"} def login(account): # 切换到登录的iframe login_frame = driver.find_element_by_css_selector("div.login iframe") WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(login_frame)) # 点击密码登录 driver.find_element_by_css_selector("li.account-tab-account").click() # 输入账号密码 driver.find_element_by_css_selector("#username").send_keys(account["username"]) driver.find_element_by_css_selector("#password").send_keys(account["password"]) # 点击登录 driver.find_element_by_css_selector(".account-form-field-submit").click() time.sleep(2) # 切换到默认页面 driver.switch_to.default_content() driver.get("https://www.douban.com/") login(douban_account) eles = driver.find_elements_by_css_selector(".nav-user-account") if len(eles) > 0: print("登录成功") driver.quit()
四、关键字驱动测试
关键字驱动就是通过改变关键字来驱动测试,如目前市面上的工具 QTP、Rotbot Framework 都是典型的关键字驱动的工具,封装了底层代码,提供给用户独立的图形界面,降低了脚本编写难度。Selenium IDE 也可以看做一种关键字驱动的自动化工具。
例如上面的脚本:打开百度 -> 在搜索输入框输入 selenium -> 点击“百度一下”
注:在自动化实施过程中,可以根据项目需求选择合适的模型来开展自动化测试。