51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 5284|回复: 6
打印 上一主题 下一主题

【转】Selenium 自动化测试面试题及答案

[复制链接]
  • TA的每日心情
    擦汗
    昨天 09:02
  • 签到天数: 1042 天

    连续签到: 4 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2016-8-18 13:34:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    文章来源:博客园  作者:水叶丽芳
    写在开始:
    这些问题和答案,都是自己在网上找的,整理的,有任何问题,概不负责。
    1、selenium中如何判断元素是否存在?
    - isElementPresent

    2、selenium中hidden或者是display = none的元素是否可以定位到?
    - 不能

    3、selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以点击的?
    - 添加元素智能等待时间 driver.implicitly_wait(30)
    - try 方式进行 id,name,clas,x path, css selector 不同方式进行定位,如果第一种失败可以自动尝试第二种
    -Selenium保证元素成功率是通过元素的定位,当然它的定位方法很多,一定能有合适的。但是在自动化工程的实施过程中,高质量的自动化测试不是只有测试人员保证的。需要开发人员规范开发习惯,如给页面元素加上唯一的name,id等,这样就能大大地提高元素定位的准确性。当然如果开发人员开发不规范,我们在定位元素的时候尽量使用相对地址定位,这样能减少元素定位受页面变化的影响。只要我们元素定位准确,就能保证我的每一个操作符合我的预期

    4、如何提高selenium脚本的执行速度?
    - Selenium脚本的执行速度受多方面因素的影响,如网速,操作步骤的繁琐程度,页面加载的速度,以及我们在脚本中设置的等待时间,运行脚本的线程数等。所以不能单方面追求运行速度的,要确保稳定性,能稳定地实现回归测试才是关键。
    我们可以从以下几个方面来提高速度:
    一,减少操作步骤,如经过三四步才能打开我们要测试的页面的话,我们就可以直接通过网址来打开,减少不必要的操作。
    二,中断页面加载,如果页面加载的内容过多,我们可以查看一下加载慢的原因,如果加载的内容不影响我们测试,就设置超时时间,中断页面加载。
    三,在设置等待时间的时候,可以sleep固定的时间,也可以检测某个元素出现后中断等待也可以提高速度。
    四,配置testNG实现多线程。在编写测试用例的时候,一定要实现松耦合,然后在服务器允许的情况下,尽量设置多线程运行,提高执行速度。


    5、用例在运行过程中经常会出现不稳定的情况,也就是说这次可以通过,下次就没办法通过了,如何去提升用例的稳定性?
    - time.sleep( )
    - driver.implicitly_wait(30)
    - 多用 try 捕捉,处理异常
    -此时我们要分析出不稳定的原因,然后有针对性的去解决问题。主要有以下几个方面 :
    一,网速问题:有的时候网页加载的比较慢,在程序执行的时候要操作的元素没有显示出来。这种情况比较常见,运行一次网速好的时候通过了,再运行一次,页面没有打开,就不通过了。为了提高稳定性,我们只能牺牲运行时间了,在经常检测失败的元素前加上等待时间,等要操作的元素出现之后再执行下面的操作。
    二,Selelnium的原因:Selenium1.0和2.0还是有区别的,有些儿函数在2.0下运行确实有时而有效,时面无效。如果mouseover()函数,就是这种情况, 我们需要避免使用这类的函数。
    三,多线程的时候,测试用例间相互影响。虽然多线程的时候运行速度比较快,但是如果用例之间的耦合性没有设计好,也会影响的,如果用例A先于用例B执行的时候,就会影响到用例B;反之则没有问题。这种情况,如果你的自动化测试工程打算多线程的时候,提前就要把测试用例测试的耦合度比较松,尽量没有任何关系,因为多线程的执行顺序是不受控制的。


    6、你的自动化用例的执行策略是什么?
    - 自动化测试用例的执行策略是要看自动化测试的目的,通常有如下几种策略:
    一,自动化测试用例是用来监控的,在此目的下,我们就把自动化测试用例设置成定时执行的,如果每五分钟或是一个小时执行一次,在jenkins上创建一个定时任务即可。
    二,必须回归的用例。有些儿测试用例,如BVT测试用例,我们在公司产品任何变动上线之前都需要回归执行。那我们就把测试用例设置成触发式执行,在jenkins上将我们的自动化测试任务绑定到开发的build任务上。当开发人员在仿真环境上部代码的时候,我们的自动化测试用例就会被触发执行。
    三,不需要经常执行的测试用例。像全量测试用例,我们没有必要一直回归执行,必竟还是有时间消耗的,有些非主要业务线也不需要时时回归。这类测试用例我们就采用人工执行,在jenkins创建一个任务,需要执行的时候人工去构建即可。


    7、什么是持续集成?
    - 持续集成源于极限编程(XP),是一种软件实践,软件开发过程中集成步骤是一个漫长并且无法预测的过程。集成过程中可能会爆发大量的问题,因此集成过程需要尽可能小而多,实际上持续集成讲的是不断的去做软件的集成工作。持续集成,最简单的形式是包括一个监控版本控制(SVN等等)变化的工具。当变化被发觉时,这个工具可以自动的编译并测试你的应用。

    8、自动化测试的时候是不是需要连接数据库做数据校验?
    - UI自动化不需要
    - 接口测试会需要

    9、id,name,class,xpath, css selector这些属性,你最偏爱哪一种,为什么?
    - css 、xpath 几乎所有的元素都可以定位到

    10、如何去定位页面上动态加载的元素?
    - 触发动态加载元素的事件,直至动态元素出现,进行定位

    11、如何去定位属性动态变化的元素?
    - xpath或者css通过同级、父级、子级进行定位

    12、点击链接以后,selenium是否会自动等待该页面加载完毕?
    - 会的

    13、webdriver client的原理是什么?
    - [Webdriver实现原理]
    测试积点发放通知
    恭喜您通过了个人用户认证,我们已经将100测试积点发送到您的账户中,请注意查收。


    通过研究selenium-webdriver的源码,笔者发现其实webdriver的实现原理并不高深莫测无法揣度。在这里以webdriver ruby binding的firefox-webdriver实现为例,简单介绍一下webdriver的工作原理。


    当测试脚本启动firefox的时候,selenium-webdriver 会首先在新线程中启动firefox浏览器。如果测试脚本指定了firefox的profile,那么就以该profile启动,否则的话就新启1个profile,并启动firefox;


    firefox一般是以-no-remote的方法启动,启动后selenium-webdriver会将firefox绑定到特定的端口,绑定完成后该firefox实例便作为webdriver的remote server存在;


    客户端(也就是测试脚本)创建1个session,在该session中通过http请求向remote server发送restful的请求,remote server解析请求,完成相应操作并返回response;


    客户端接受response,并分析其返回值以决定是转到第3步还是结束脚本;


    这就是webdriver的工作流程,看起来很复杂实际上当了解了webdriver的实现原理后,理解上述问题应该比较简单。


    webdriver是按照server – client的经典设计模式设计的。


    server端就是remote server,可以是任意的浏览器。当我们的脚本启动浏览器后,该浏览器就是remote server,它的职责就是等待client发送请求并做出相应;


    client端简单说来就是我们的测试代码,我们测试代码中的一些行为,比如打开浏览器,转跳到特定的url等操作是以http请求的方式发送给被 测试浏览器,也就是remote server;remote server接受请求,并执行相应操作,并在response中返回执行状态、返回值等信息;


    举个实际的例子,下面代码的作用是”命令”firefox转跳到google主页:


    driver = Selenium::WebDriver.for :firefox


    driver.navigate.to "http://google.com"


    在执行driver.navigate.to “http://google.com” 这句代码时,client,也就是我们的测试代码向remote server发送了如下的请求:


    POST session/285b12e4-2b8a-4fe6-90e1-c35cba245956/url


    post_data {"url":"http://google.com"}


    通过post的方式请求localhost:port/hub/session/session_id/url地址,请求浏览器完成跳转url的操作。


    如果上述请求是可接受的,或者说remote server是实现了这个接口,那么remote server会跳转到该post data包含的url,并返回如下的response


    {"name":"get","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":""}


    该response中包含如下信息


    name:remote server端的实现的方法的名称,这里是get,表示跳转到指定url;


    sessionId:当前session的id;


    status:请求执行的状态码,非0表示未正确执行,这里是0,表示一切ok不许担心;


    value:请求的返回值,这里返回值为空,如果client调用title接口,则该值应该是当前页面的title;


    如果client发送的请求是定位某个特定的页面元素,则response的返回值可能是这样的:


    {"name":"findElement","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":{"ELEMENT":"{2192893e-f260-44c4-bdf6-7aad3c919739}"}}


    name,sessionId,status跟上面的例子是差不多的,区别是该请求的返回值是ELEMENT:{2192893e- f260-44c4-bdf6-7aad3c919739},表示定位到元素的id,通过该id,client可以发送如click之类的请求与 server端进行交互。


    那么remote server端的这些功能是如何实现的呢?答案是浏览器实现了webdriver的统一接口,这样client就可以通过统一的restful的接口去进 行浏览器的自动化操作。目前webdriver支持ie, chrome, firefox, opera等主流浏览器,其主要原因是这些浏览器实现了webdriver约定的各种接口。

    通过研究selenium-webdriver的源码,笔者发现其实webdriver的实现原理并不高深莫测无法揣度。在这里以webdriver ruby bindingfirefox-webdriver实现为例,简单介绍一下webdriver的工作原理。
    • 当测试脚本启动firefox的时候,selenium-webdriver 会首先在新线程中启动firefox浏览器。如果测试脚本指定了firefox的profile,那么就以该profile启动,否则的话就新启1个profile,并启动firefox;
    • firefox一般是以-no-remote的方法启动,启动后selenium-webdriver会将firefox绑定到特定的端口,绑定完成后该firefox实例便作为webdriver的remote server存在;
    • 客户端(也就是测试脚本)创建1个session,在该session中通过http请求向remote server发送restful的请求,remote server解析请求,完成相应操作并返回response;
    • 客户端接受response,并分析其返回值以决定是转到第3步还是结束脚本;

    这就是webdriver的工作流程,看起来很复杂实际上当了解了webdriver的实现原理后,理解上述问题应该比较简单。
    webdriver是按照server – client的经典设计模式设计的。
    server端就是remote server,可以是任意的浏览器。当我们的脚本启动浏览器后,该浏览器就是remote server,它的职责就是等待client发送请求并做出相应;
    client端简单说来就是我们的测试代码,我们测试代码中的一些行为,比如打开浏览器,转跳到特定的url等操作是以http请求的方式发送给被 测试浏览器,也就是remote server;remote server接受请求,并执行相应操作,并在response中返回执行状态、返回值等信息;


    14、webdriver的协议是什么?
    -The WebDriver Wire Protocol

    15、启动浏览器的时候用到的是哪个webdriver协议?
    -http

    16、什么是page object设计模式?
    -http://bbs.51testing.com/forum.php?mod=viewthread&tid=1088107&page=1&extra=#pid3684888
    相似功能地方,代码基本都是一样的,界面元素换个查找方式,把原来的使用 xpath方式,改为使用 id 查找,需要对每个用例脚本都要改,虽然几个用例看不出什么工作量,但是重复findElement的代码,已经让我们感到了代码的笨重。如果某些定位发生了改变,我们就得贯穿整个测试代码进行调整元素定位,这样就会导致我们的脚本在后期,难以维护。因此通过Page Object Model 我们可以创建更加健壮代码,并减少或者消除重复的测试代码,从而也能够提高代码的可读性,减少编写脚本的工作量。Page Object Model的实现,就是通过分离测试对象和测试脚本的抽象来实现的。

    17、什么是page factory设计模式?
    --[分层自动化]( http://bbs.51testing.com/forum.p ... 8&page=1#pid3659950)还是自己理解吧

    18、怎样去选择一个下拉框中的value=xx的option?
    -二次定位

    19、如何在定位元素后高亮元素(以调试为目的)?
    -重置元素属性,给定位的元素加背景、边框

    20、什么是断言?
    -断言的英文是assertion,断言检查的英文是assertion checking。
    -断言是指定一个程序必须已经存在的状态的一个逻辑表达式,或者一组程序变量在程序执行期间的某个点上必须满足的条件。

    21、如果你进行自动化测试方案的选型,你会选择哪种语言,java,js,python还是ruby?
    -使用自己熟悉的语言

    22、page object设置模式中,是否需要在page里定位的方法中加上断言?
    -不需要

    23、page object设计模式中,如何实现页面的跳转?
    -get、click (可能有坑)

    24、自动化测试用例从哪里来?
    -手工用例中抽取
    -可以参考自动化用例的执行策略

    25、你觉得自动化测试最大的缺陷是什么?
    -不稳定
    -可靠性
    -不易维护
    -成本与收益

    26、什么是分层测试?
    -[分层自动化]( http://bbs.51testing.com/forum.p ... 8&page=1#pid3659950)
    还是自己理解吧


    27、webdriver可以用来做接口测试吗?
    -有难度,不推荐




    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏21
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-8 20:29 , Processed in 0.070094 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表