Selenium 项目实战(一)自动化测试模型


进行实战之前,我们先来了解一下自动化测试模型

一、线性测试

根据应用的操作步骤来编写对应的测试脚本,每个测试脚本相对独立且不产生其它的依赖于调用。

优点:每个测试脚本都是完整且独立的,可单独执行
缺点:开发和维护成本很高,存在很多重复的操作,且操作发生改变时需要修改多个地方

以登录豆瓣为例,注意豆瓣登录区域是一个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 -> 点击“百度一下”

注:在自动化实施过程中,可以根据项目需求选择合适的模型来开展自动化测试。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM