• 【selenium】Python自动化面试题


    题记:

      整理一下网络上的热门自动化面试题,跟大家一起分享一下(可能和第一章部分内容重复)

    1.selenium的原理?

    python的第三库,当前是3.0版本,是操作浏览器的一个框架,包含了3个模块:IDE(录制和回放UI自动化)、grid(结合docker实现分布式自动化)、webdriver(操作浏览器的api)就像出租车司机等待我们给它发布指令去操作浏览器。

    2.selenium熟悉的类


    webdriver
    driver = webdriver.Chrome()
    driver.get()
    driver.maximize_windows()
    driver.switch_to.windows()
    driver.switch_to.frame()
    driver.find_elenment_by_id().click()
    driver.find_elenment_by_link_text().clear()
    driver.find_elenment_by_xpath().sendkey()
    driver.find_elenment_by_css().get_attribute()
    driver.find_elenment_by_css().is_select()
    driver.find_elenment_by_css().is_enabled()
    driver.find_elenment_by_css().is_displayed()
    driver.quit()

    3.元素定位常用方式?

    先顺便总结下常用定位的优先级:
    (1)有id点id
    (2)有文本值用文本值
    xpath=“//a[text()=‘新闻’]” > 文本值是新闻的元素
    xpath=”//a[contains(text(),‘新闻’)]” > 文本值包含新闻的元素
    (3)link_text()
    (4)CSS定位
    (5)定位半天不出来??? >>> 右键xpath试下
    (6)还不出来??? >>> js定位试下
      (7)   chrome推荐一款插件 Chropath    

    4.说下CSS定位

    单一属性定位("#id")(".s_class")(’[name=“wd”]’)
    组合属性定位,模糊匹配很少用^=,~=,$=,
    ("[name1=‘wd’][name2=‘xd’]")、
    (“input#kw”)(“input.s_class”)

    5.如何处理弹框?

    (1)div伪弹框,直接find_elenment就可以了
    (2)win弹框(上传地图),标签是input类型,直接send_keys(),非input类型的挺麻烦
    (3)alert、confirm、prompt弹框。driver.switch_to.alert(),driver.accept() driver.dismiss()

    6.鼠标操作:


    (1) def move_offset_click(self, canvas, *element):
          return ActionChains(self.driver).move_to_element(canvas).move_by_offset(*element).release().click().perform()

    7.class有空格,怎么定位?


    不管是否空格,直接前面加点号就行:(“input.s_class.x_class”)

    8.你是怎么做接口自动化的?

    首先基于公司的基本业务筛选主要部分的用例,然后按照主流程梳理编写测试用例,然后结合正常场景/异常场景进行用例覆盖

    基本上是自己搭建测试框架采用的是python+request+pytest+allure报告能够直观的看到用例执行的情况

    9.你是怎么做UI自动化的?

    先从基本用例中抽取正向用例,然后进行元素的提取,脚本的编写

    然后采用Python+selenium+pytest+allure的关键字框架进行脚本编写

    最后输出测试报告进行查看

    10.你认为有必要开展UI自动化吗,原因是什么?

    1.首先根据公司的项目来判断,如果是一个迭代版本周期太过频繁的项目不太适合,类似敏捷开发,一个星期迭代两次,界面大改或者更新

    这种项目没有必要开展ui自动化,一个是维护脚本的成本太高,一个是浪费时间,有写脚本的时间,功能测试都测完了

    2.如果项目迭代周期比较久,或者已经持续稳定,这个时候可以开展ui自动化测试,一个是页面基本固定元素都不太会变动,可以开展ui自动化

    解放更多的测试生产力去执行其他的测试任务.也能覆盖到更多的场景(例:一个人测试一个模块可能会有固有思想,也可能会漏测,所以设计时就覆盖好用例的所有场景

    方便日后的回归)

    3.自动化的根本目的是解放更多的测试资源来完成其他的事情,有必要引入

    11.你UI自动化执行下来BUG多吗?

    首先,这个问题是个坑啊,千万不能说bug多.

    因为ui自动化基本上是项目稳定下来才开始做的,基本上bug不多,要不就是可能元素变动了.导致元素找不到的报错

    12.说一说token跟session的区别

    Cookie 和 Session 的区别

    安全性: Session 比 Cookie 安全,Session 是存储在服务器端的,Cookie 是存储在客户端的。

    存取值的类型不同:Cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,Session 可以存任意数据类型。

    有效期不同: Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效。

    存储大小不同: 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。

    具体可以查看此博客  https://segmentfault.com/a/1190000021810849

    13.你说你做自动化用的都是些什么框架?

    根据自己的实际情况来

    笔者是unittest跟pytest都使用,基本上是结合python+selenium/request+pytest+allure进行测试框架的搭建

    14.常用的接口工具有?

    postman/jmeter/自己搭建的接口自动化框架

    15.什么是接口?


    前台来看是功能点的实现,数据传输的通道

    后台来看:是一个实现了http协议和映射机制的函数。接口参数就是:前台传入的数据,接口的响应:函数的返回值

    16.get与post的区别?


    (1)get的参数是以?开头放在url里面的,项目中界面获取token的接口用到了get请求
    (2)post请求占大多数,入参放在了body中,数据量比较大。
    (3)从python的request库中看,get请求的源码也是基于post请求去实现的,当然他们都是基于request的类

    17.你在写自动化框架的时候,测试用例保存到哪里?用什么去读取?

    笔者基于自己写的关键字框架,测试用例保存在excel中使用xlrd3去读取excel之后,将数据在转换成字典格式,

    再将字典格式的内容转换成一个列表包含他们,组成一条测试用例

    也可以使用yaml文件去读取数据

    还可以使用mysql读取数据库中的文件进行测试

    18.什么是lambda函数?它有什么好处?

    lambda只是一个表达式,函数体比def简单很多。

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
     
    # 可写函数说明
    sum = lambda arg1, arg2: arg1 + arg2
     
    # 调用sum函数
    print "相加后的值为 : ", sum( 10, 20 )
    print "相加后的值为 : ", sum( 20, 20 )

    19.*args, **kwargs是什么东西? 我们为什么会用它?

    我们用 *args 当我们不知道要有多少个参数传给函数,或者我们想把一个列表或者tuple存起来以后传给函数。

    我们用**kwargs当我们不知道有多少个关键字参数要传给函数,或者我们想把字典存起来以后传给函数。

    20.python里面的深拷贝,浅拷贝

    在Python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。
    浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复制
    深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。也就是,把对象复制一遍,并且该对象中引用的其他对象我也复制。
    1.深浅拷贝都是对源对象的复制,占用不同的内存空间。
    2.不可变类型的对象,对于深浅拷贝毫无影响,最终的地址值和值都是相等的。
    3.可变类型:
    =浅拷贝: 值相等,地址相等
    copy浅拷贝:值相等,地址不相等
    deepcopy深拷贝:值相等,地址不相等

    21.实现一个字典数据结果的深拷贝

    copy浅拷贝
    deepcopy深拷贝
    from copy import deepcopy
    深拷贝和浅拷贝的例子:

      data = {'user':'admin','num':[1,2,3]}
      data2 = data.copy()
      data3 = deepcopy(data)

    查看结果:

      data['user']='root'
      data['num'].remove(1)
      print(data)
      print(data2)
      print(data3)

    输出结果:

      {'user': 'root', 'num': [2, 3]}
      {'user': 'admin', 'num': [2, 3]}
      {'user': 'admin', 'num': [1, 2, 3]}

    总结:

    如果源拷贝对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
    如果源拷贝对象不止一级目录的话,源对一级目录的子目录做任何改动,都会影响浅拷贝,但不影响深拷贝

    22.class类中(self)指的是什么

    self指的是类本身

    23.rang函数的作用

    函数语法:
    range(start, stop[,step])


    参数说明:
    start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
    stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
    step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

    24.一个程序有n个变量采用边界值分析可以产生几个测试用例

    4n+1

     

    25.给你一个支付流程你是如何测试的?

    功能测试。

    用等价类和边界值,判断支付的金额;

    如果没有登陆能否支付,支付成功后是否可以正常跳转;

    支付方式是否支持扫码支付,第三方平台支付(支付包,云网等),语音支付,指纹支付;

    支付时是否需要身份验证,支付后有无手机短信提示,是否可以找他人代付;

    用边界值法有无支付额度限制,余额不足时有无提示,支付时是否是动态加密支付;

    待支付状态:订单是否可以正常支付;是否可以取消;

    有相同订单是否可以支付两次;

    是否可以扫码支付,输入错误的密码会怎样显示,有无错误次数限制;

    若支持扫码支付,二维码是否支持支付包和微信扫码,若两人同时扫描怎么处理;

    有无最小支付金额限制,无意义的支付金额0,重复支付如何处理;

    如果支付包含优惠金额,该怎么处理优惠额度;

    性能测试 弱网,无网时是否可以支付;

    退款到账时间,耗电量的多少;

    带负载情况下的响应时间和吞吐率,在某个时间段内同时访问系统的用户数量 ;

    压力测试 多人同时付款

    界面测试; 支付界面有无错别字,排版是否合理,颜色搭配是否合理; 兼容性测试 是否可以跨平台,不同电脑机型下显示有无区别;

    安全性测试; 若支付不成功是否原路退款,若支付成功,有无支付信息提示;用fiddler抓包尝试修改价格,对订单金额有无效验; 直接输入需要权限的页面地址可用访问;

    接口测试 第三方平台支付 

     26.分布式架构分为(B/S C/S)?

    B/S架构(浏览器、web版)     

    C/S架构:客户端(先进行安装)

     27.公司没有接口文档的情况下你能够开展接口测试吗?

    可以开展,可以使用fiddler或者是charles进行抓包,或者用jmeter进行脚本自动录制.

    28.测试的策略有哪些?

    黑盒/白盒,静态/动态,手工/自动,冒烟测试,回归测试,公测(Beta测试的策略)

    29.单元测试的策略有哪些

    一般的单元执行策略有三种:孤立的单元测试策略(Isolation Unit Testing),自顶向下的单元测试策略(Top Down Unit Testing)和自底向上的单元测试策略(Bottom Up Unit Testing)。需要注意的是:在集成测试中也有自顶向下和自底向上的测试策略,但是测试对象不同。

    1、孤立的单元测试策略(Isolation Unit Testing)

    方法:不考虑每个模块与其它模块之间的关系,为每个模块设计桩模块和驱动模块,每个模块进行独立的单元测试。

    优点:这个方法比较简单,最容易操作,可以达到很高的结构覆盖率,可以并行开展,该方法是纯粹的单元测试。

    缺点:桩函数和驱动函数工作量很大,效率低。

    2、自顶向下的单元测试策略(Top Down Unit Testing)

    方法:先对最顶层的单元进行测试,把顶层所调用的单元做成桩模块,其次对第二层进行测试,使用上面已经测试过的单元做驱动模块,以此类推,直到测试完所有模块。

    优点:可以节省驱动函数的开发工作,效率高。

    缺点:随着被测单元一个一个被加入,测试过程将变得越来越复杂,并且开发和维护的成本将增加。

    3、自底向上的单元测试策略(Bottom Up Unit Testing)

    方法:先对最底层的模块进行单元测试,将模拟调用该模块的模块设置为驱动模块,然后再对上面一层做单元测试,用下面已经测试好的模块做桩模块,以此类推,直到测试完所有模块。

    优点:可以节省桩函数的开发工作量,测试效率较高。

    缺点:不是纯粹的单元测试,底层函数的测试质量对上层函数的测试将产生很大影响。

    30.什么是事务,知道事务提交、回滚

    事务是并发控制单位,用户定义的一个操作序列。这些操作要么都做,要么都不做,是不可分割的的工作单位。通过事务,sql server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性,主要用于一些对操作过程的完整性比较高的程序。(事务的特性:原子性、一致性、隔离性、持久性)。

    事务提交是提交事务的所有操作:具体来说就是将所有对数据库的更新写回到磁盘上的物理数据库中,事务正常结束。

    事务回滚是数据库返回到事务开始的状态;事务在运行过程中发生某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的更新操作全部撤销,使数据回滚到事务开始时的状态。

    部分内容引入文章如下,不分先后:

     原文链接: https://blog.csdn.net/weixin_45451320/article/details/117794309

     原文链接: https://blog.csdn.net/u013354486/article/details/80602229

     原文链接: https://blog.csdn.net/hard_days/article/details/110388559

     原文链接: https://blog.csdn.net/qq_36595013/article/details/88231747

     原文链接: https://blog.csdn.net/weixin_39621185/article/details/109618701

  • 相关阅读:
    海康SDK/大华SDK协议视频智能分析平台EasyCVR播放器界面滚动条属性优化分享
    TSINGSEE青犀视频EasyCVR视频融合共享平台兼容性再扩展,大华SDK轻松接入
    海康SDK/大华SDK安防视频智能分析平台EasyCVR如何将通道视频流推送至CDN分发?
    迭代器和生成器
    内置函数
    递归函数
    函数进阶------闭包函数
    装饰器
    函数
    经典100厘
  • 原文地址:https://www.cnblogs.com/yushengaqingzhijiao/p/15744852.html
Copyright © 2020-2023  润新知