面试被问selenium自动化模型,你了解多少?

面试被问selenium自动化模型,你了解多少?

概念

自动化测试模型可以看作自动化框架与工具设计得思想。自动化不仅仅式单纯的写写脚本运行就可以了,还需要考虑如何使脚本运行效率提高,代码复用、参数化等问题。自动化模型主要分为四大类:线性模型,模块化驱动,驱动数据,关键字驱动。

线性模型

线性脚本中每个脚本相互独立,且不会产生其他依赖与调用,其实就是简单的模拟用户某个操作流程的脚本。贴代码:

# -*- coding: utf-8 -*-
# @Time    : 2019/1/10 11:27 PM
# @Author  : 余少琪
# @FileName: test.py
# @email   : 1603453211@qq.com

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")

#使用class_name定位元素
driver.find_element_by_class_name("s_ipt").send_keys("selenium")

sleep(3)

driver.find_element_by_id("su").click()
sleep(2)
driver.quit()

模块化驱动测试

线性模型虽然每个用例都可以拿来单独运行,但是用例之间重复代码很多,开发、维护成功高。其实把重复操作代码封装为独立公共模块,
当用例执行时需要用到这部分,直接调用即可,这就是模块驱动的方式。比如登录系统,退出登录,截图函数等。

# -*- coding: utf-8 -*-
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://localhost:8080/login')
time.sleep(3)

class UserLogin:
    def __init__(self,mobile,password):
        self.mobile = mobile
        self.password = password

    """输入登录账号"""
    def user_mobile(self):
        user_mobile_01 = driver.find_element_by_xpath('//*[@id="name"]')
        user_mobile_01.send_keys(self.mobile)

    """登录密码"""
    def user_password(self):
        user_psaaword_01 = driver.find_element_by_xpath('//*[@id="pwd"]')
        user_psaaword_01.send_keys(self.password)


    """点击登录"""
    def login_botton(self):
        driver.find_element_by_xpath('//*[@id="login"]').click()


Login = UserLogin
Login.user_mobile()
Login.user_name = 1770****92
Login.password()
Login.login_word = 123456
print(Login)
Login.login_botton()

time.sleep(10)
driver.close()

数据驱动
模块驱动的模型虽然解决了脚本重复问题,但是需要测试不同数据的用例时,模块驱动的方式就不合适了。数据驱动就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。装载数据的方式可以是列表,字典或者外部文件(txt、csv、xml、excel),目的就是实现数据和脚本的分离。

这里,我们会使用@ddt装饰器和结合excel读取数据,来实现数据驱动。

安装依赖:

pip insatll xlrd
pip install ddt
  1. @ddt
    数据驱动原理
    1、测试数据为多个字典的list类型
    2、测试类前面加@ddt.ddt修饰
    3、case前加@ddt.data()修饰
    4、用例会单独运行多次(取决于测试数据的个数)
# -*- coding:utf-8 -*-
import unittest
import ddt
from po.login_page import LoginPage
from selenium import webdriver

'''测试数据'''
test_data = [{
   "username": "zhangsan", "password": "zhangsan"},
             {
   "username": "lisi", "password": "lisi"},
             {
   "username": "wangwu", "password": "wangwu"},
             ]
@ddt.ddt
class Case01(unittest.TestCase):
    ''''登录乐学'''
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.url = "http://www.5itest.cn/login"
        # self.username = "183****9237"
        # self.password = "123456"


    #用例执行体
    @ddt.data(*test_data) 
    # 这边@ddt会将test_data进行解包
    def test_login_lexue(self, data):
        #声明登录页面类对象
        login_page = LoginPage(self.driver,self.url,u"乐学")
        #调用打开页面组件
        login_page.open()
        #调用用户名输入组件
        login_page.input_username(data["username"])
        #调用输入密码组件
        login_page.input_password(data["password"])
        #调用点击登录按钮组件
        login_page.click_submit()

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':

    unittest.main()

  1. 从excel中读取数据,首先,我们要先知道从excel中读取数据的方法
import xlrd


class ReadExcel:
    def __init__(self, excel_path, sheet_name):
        #打开excel表格
        self.data = xlrd.open_workbook(excel_path)
        #通过列表名字获取
        self.table = self.data.sheet_by_name(sheet_name)
        #获取第一行key值
        self.keys = self.table.row_values(0)
        #获取总行数
        self.rownum = self.table.nrows
        #获取总列数
        self.colnum = self.table.ncols

    def dict_data(self):
        #判断总行数不小于1
        if self.rownum <= 1:
            print("总行数小于1")
        else:
            #定义一个空列表来存放表格中的数据
            r = []
            #初始化j,从第二行开始取数据
            j = 1
            #利用循环读取表格中的数据
            for i in range(self.rownum - 1):
                s = {
   }
                #从第二行取对应的values值
                values = self.table.row_values(j)
                for x in range(self.colnum):
                    s[self.keys[x]] = values[x]
                r.append(s)
                j += 1
            return r

if __name__ == '__main__':
    filepath = "test.xls"
    sheetname = "Sheet1"
    data = ReadExcel(filepath, sheetname)
    print(data.dict_data())

将读取excel数据与测试用例结合

# Author:Xueyun
# -*- coding:utf-8 -*-
import unittest
import ddt
from exceldata import read_excel
from po.login_page import LoginPage
from selenium import webdriver

'''测试数据'''
filepath = "E:\\Pycharm_projects\\1\\exceldata\\test.xls"
sheetname = "Sheet1"
exce_data = read_excel.ReadExcel(filepath, sheetname)
test_data = exce_data.dict_data()


@ddt.ddt
class Case01(unittest.TestCase):
    ''''登录乐学'''
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.url = "http://www.5itest.cn/login"
        # self.username = "183****9237"
        # self.password = "123456"


    #用例执行体
    @ddt.data(*test_data)
    def test_login_lexue(self, data):
        #声明登录页面类对象
        login_page = LoginPage(self.driver,self.url,u"乐学")
        #调用打开页面组件
        login_page.open()
        #调用用户名输入组件
        login_page.input_username(data["username"])
        #调用输入密码组件
        login_page.input_password(data["password"])
        #调用点击登录按钮组件
        login_page.click_submit()

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':

    unittest.main()

excel数据:
在这里插入图片描述
关键字驱动
关键字简单来说就是,把我们的执行操作每一个关键步骤当成一个关键字来对待,用来驱动程序的设计开发。例如:进行web自动化我们的首要是打开浏览器,是的 “打开浏览器” 我们就可以作为一个关键字来对待它,关键字就是来驱动我们程序设计的关键步骤。通过关键字的改变从而驱动自动化测试的执行,最终引起测试结果的改变。

对于测试一个注册页面,我们来梳理下看有哪些关键词,更深层次了解下关键词模型:

(1) 打开浏览器 —> 打开浏览器

(2) 输入注册页面的url —> 输入测试地址

(3) 页面加载等待 —> 页面加载等待

(4) 输入(注册邮箱、用户名、密码、验证码)—> 输入元素

(5) 点击注册按钮 —> 点击元素

(6) 退出浏览器

#!/usr/bin/env python

# -*- encoding: utf-8 -*-

class RegisterKeyword(object):

def __init__(self, driver):

self.fe = FindElement(driver)

# 打开浏览器

def open_browser(self, browser):

if browser == 'chrome':

self.driver = webdriver.Chrome('../tools/chromedriver.exe')

elif browser == 'firefox':

self.driver = webdriver.Firefox()

else:

self.driver = webdriver.Edge()

# 输入测试地址

def get_url(self, url):

self.driver.get(url)

# 定位元素

def get_element(self, key):

return self.fe.get_element(key)

# 输入元素

def send_element_key(self, key, value):

get_element = self.get_element(key)

get_element.send_keys(value)

# 点击元素

def click_element(self, key):

self.fe.get_element(key).click()

# 页面等待

@staticmethod

def wait_loading():

sleep(3)

# 关闭浏览器

def close_browser(self):

self.driver.close()

if __name__ == "__main__":

register_url = 'http://www.5itest.cn/register'

driver = webdriver.Chrome('../tools/chromedriver.exe')

driver.get(register_url)

rk = RegisterKeyword(driver)

print(rk.get_element('register_email'))

driver.close()


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100702.html原文链接:https://javaforall.net

(0)
上一篇 2021年5月24日 上午9:00
下一篇 2021年5月24日 上午10:00


相关推荐

  • 阿里云polardb_阿里云用的什么数据库

    阿里云polardb_阿里云用的什么数据库前言一年一度的数据库领域顶级会议VLDB2019于美国当地时间8月26日-8月30日在洛杉矶召开。在本届大会上,阿里云数据库产品团队多篇论文入选ResearchTrack和IndustrialTrack。本文将对入围IndustrialTrack的论文《AnalyticDB:RealtimeOLAPDatabaseSystematAlibabaCloud》进行深度…

    2025年12月9日
    4
  • S3C2440C语言点灯「建议收藏」

    S3C2440C语言点灯「建议收藏」第一代程序员使用机器码第二代程序员使用汇编第三代程序员使用C语言C语言相较于汇编和机器码是一个更高级的语言,我们使用的技术也应该与时俱进之前控制寄存器是配置GPFCON和GPFDAT寄存器,通过地址访问,所以可以用C语言来进行对地址的访问。GPFCON——0x5600,0050GPFDAT——0x5600,0054目录S3C2440芯片手册导读用指针表示S3C2440芯片手册导读对于GPFCON,只用到了16位对于GPFDAT,只用到了8位我们仍然可以以32位,就是4字节的

    2022年6月13日
    28
  • Javascript保留两位小数

    Javascript保留两位小数javascript 语言 因为是弱类型语言 没有 java 那么多类型 所以在处理浮点数保留两位小数上 没有那么多办法 su 但是字符串和整数 浮点数还是有区别的

    2026年3月20日
    19
  • 如何mock数据

    如何mock数据如何 mock 数据在之前前后端不分离的情况下 很多时候都要等到后端写好接口 前端很多功能才能开发 而前后端分离 前端无需等待 可以与后端并行开发 前端需要的数据可以 mock 出来 利用 nodejs 再生成接口 可以直接调用 等后端开发出接口再来更换 在 build 的 webpack dev conf js 里修改 1 导入 expressconst require express

    2026年3月20日
    3
  • tomcat安装配置详解_tomcat下载安装及配置教程

    tomcat安装配置详解_tomcat下载安装及配置教程tomcat保姆级安装教程Tomcat安装教程(以tomcat-9.0.62为例:)1.下载安装包可以从官网下载安装包:(1)从官网下载输入网址进入官网sshttp://tomcat.apache.org/

    2026年1月25日
    4
  • share topology_search索引器

    share topology_search索引器如果你知道如何在Rapidshare上搜索的话它就是一个金矿。这里有两个基本方法可以进行搜索,一是使用Google搜索参数对Rapidshare进行搜索,一些网站提供一个基本搜索界面但不如你自己添加参数进行搜索要好。还有一种网站提供自己的搜索数据库进行搜索。第二种网站的搜索更广泛,因为他们使用不同的来源去发现Rapidshare上的新文件包括用户上传的。我不喜欢第一种网站来搜索Rapidshar…

    2025年9月29日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号