Selenium2+python自动化39-关于面试的题

前言

最近看到群里有小伙伴贴出一组面试题,最近又是跳槽黄金季节,小编忍不住抽出一点时间总结了下,

回答不妥的地方欢迎各位高手拍砖指点。

 

一、selenium中如何判断元素是否存在?

首先selenium里面是没有这个方法的,判断元素存在需要自己写一个方法了。

元素存在有几种形式,一种是页面有多个元素属性重复的,这种直接操作会报错的;还有一种是页面隐藏的元素操作也会报错

判断方法参考这篇:Selenium2+python自动化36-判断元素存在

 

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

定位是可以定位到的,但是不能操作,可以判断元素is_displayed()

(我一直不里面这个定位到底是几个意思,只要页面上有的元素,我觉得都能定位到,

实在不行,小编可以爬源码Selenium2+python自动化37-爬页面源码(page_source),能不能操作那是另外一回事)

 

三、selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以点击的?

一种是隐式等待: driver.implicitly_wait()

另外一种是显式等待:WebDriverWait()

等待时间放长一点参考这篇:Selenium2+python自动化38-显示等待(WebDriverWait)

 

selenium+python高级教程》已出书:selenium webdriver基于Python源码案例

(购买此书送对应PDF版本)

 

 

 

四、如何提高selenium脚本的执行速度?

1.少用sleep

2.多用显式等待方法

3.弄个性能好的电脑

五、用例在运行过程中经常会出现不稳定的情况,也就是说这次可以通过,下次就没办法通过了,如何去提升用例的稳定性?

1.查找元素前先做前置条件判断:expected_conditions()里面的各种方法(这个我的博客里面暂时没写。后续补上)

2.显式等待:WebDriverWait()

这两者配合使用

 

六、你的自动化用例的执行策略是什么?

1.集成到jenkins一键执行,可以手动执行,也可以定时执行

 

 

七、什么是持续集成?

1.持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。

每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

 

 

八、自动化测试的时候是不是需要连接数据库做数据校验?

1 UI自动化不需要

2 接口测试会需要

 

九、id,name,class,xpath, css selector这些属性,你最偏爱哪一种,为什么?

1.css妥妥的,css语法简洁,定位快(xpath语法长,定位慢,还不稳定)

 

十、如何去定位页面上动态加载的元素?

1. WebDriverWait()方法循环去查询是否元素加载出来了

 

十一、如何去定位属性动态变化的元素?

1.先去找该元素不变的属性,要是都变,那就找不变的父元素,用层级定位(以不变应万变)

 

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

1.这个不会等的,没加载完也可以下一步操作

 

 

十三、webdriver client的原理是什么?

[Webdriver实现原理](http://www.cnblogs.com/timsheng/archive/2012/06/12/2546957.html)

通过研究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中返回执行状态、返回值等信息;

 

十四、webdriver的协议是什么?

1.这个尴尬了,不懂

 

十五、启动浏览器的时候用到的是哪个webdriver协议?

1.http

 

 

十六、什么是page object设计模式?

1.通俗来讲,就是页面元素放到一个脚本,方便页面元素的维护

2.测试用例从这个页面元素脚本里面去调用

 

 

十七、什么是page factory设计模式?

1.通俗来讲,就是把八种元素定位合并为一种方法

(这个我也不知道怎么解释了。。。)

 

 

十八、怎样去选择一个下拉框中的value=xx的option?

1.select类里面提供的方法:select_by_value(“xxx”)

参考这篇:Selenium2+python自动化15-select下拉框

2.xpath的语法也可以定位到

 

 

十九、如何在定位元素后高亮元素(以调试为目的)?

1.js方法,直接让该元素置顶

参考这篇:Selenium2+python自动化17-JS处理滚动条

2.要是点击后没高亮,就用js去修改属性吧(万能的js)

 参考这篇:Selenium2+python自动化25-js处理日历控件(修改readonly属性)

 

二十、什么是断言?

1.assert,判断测试结果与期望结果是否一致

 

 

十二一、如果你进行自动化测试方案的选型,你会选择哪种语言,java,js,python还是ruby?

1.大python威武,js也要略懂

 

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

1.不需要

 

 

二十三、page object设计模式中,如何实现页面的跳转?

1.click方法

 

 

二十四、自动化测试用例从哪里来?

1.自己写的

2.别人写的

(这问题有点脑残,反正不是天上掉下来的)

 

 

二十五、你觉得自动化测试最大的缺陷是什么?

1.需求变动大的时候,维护成本大

 

二十六、什么是分层测试?

1.数据层

2.接口层

3.UI层

自由发挥吧

 

二十七、webdriver可以用来做接口测试吗?

1.不可以

用大python就可以了妥妥的了

 

总结:从整个的面试题来看,难度还是挺大的,特别是脚本性能的优化这块,如果只是会简单的几个元素定位是完全无法着手优化的。

能提这些问题出来的面试官也是有一定实力的。

学习过程中有遇到疑问的,可以加selenium(python+java) QQ群交流:646645429

时间: 2024-08-30 03:27:37

Selenium2+python自动化39-关于面试的题的相关文章

Selenium2+python自动化23-富文本(自动发帖)

前言      富文本编辑框是做web自动化最常见的场景,有很多小伙伴遇到了不知道无从下手,本篇以博客园的编辑器为例,解决如何定位富文本,输入文本内容 一.加载配置     1.打开博客园写随笔,首先需要登录,这里为了避免透露个人账户信息,我直接加载配置文件,免登录了.       不懂如何加载配置文件的,看这篇Selenium2+python自动化18-加载Firefox配置 二.打开编辑界面     1.博客首页地址:bolgurl = "http://www.cnblogs.com/&qu

Selenium2+python自动化24-js处理富文本(带iframe)

前言     上一篇Selenium2+python自动化23-富文本(自动发帖)解决了富文本上iframe问题,其实没什么特别之处,主要是iframe的切换,本篇讲解通过js的方法处理富文本上iframe的问题 一.加载配置     1.打开博客园写随笔,首先需要登录,这里为了避免透露个人账户信息,我直接加载配置文件,免登录了.       不懂如何加载配置文件的,看这篇Selenium2+python自动化18-加载Firefox配置 二.打开编辑界面     1.博客首页地址:bolgur

Selenium2+python自动化29-js处理多窗口

前言 在打开页面上链接的时候,经常会弹出另外一个窗口(多窗口情况前面这篇有讲解:Selenium2+python自动化13-多窗口.句柄(handle)),这样在多个窗口之间来回切换比较复杂,那么有没有办法让新打开的链接在一个窗口打开呢? 要解决这个问题,得从html源码上找到原因,然后修改元素属性才能解决.很显然js在这方面是万能的,于是本篇得依靠万能的js大哥了. 一.多窗口情况     1.在打baidu的网站链接时,会重新打开一个窗口     (注意:我的百度页面是已登录状态,没登录时候

Selenium2+python自动化61-Chrome您使用的是不受支持的命令行标记:--ignore-certificate-errors

前言 您使用的是不受支持的命令行标记:--ignore-certificate-errors.稳定性和安全性会有所下降 selenium2启动Chrome浏览器是需要安装驱动包的,但是不同的Chrome浏览器版本号,对应的驱动文件版本号又不一样,如果版本号不匹配,是没法启动起来的.   一.Chrome遇到问题 1.如果在启动chrome浏览器时候,出现如下界面,无法打开网址,那么首先恭喜你,踩到了坑,接下来的内容或许对你有所帮助 >># coding:utf-8 >>from s

Selenium2+python自动化59-数据驱动(ddt)

前言 在设计用例的时候,有些用例只是参数数据的输入不一样,比如登录这个功能,操作过程但是一样的.如果用例重复去写操作过程会增加代码量,对应这种多组数据的测试用例,可以用数据驱动设计模式,一组数据对应一个测试用例,用例自动加载生成. 一.环境准备 1.安装ddt模块,打开cmd输入pip install ddt在线安装 >>pip install ddt   二.数据驱动原理 1.测试数据为多个字典的list类型 2.测试类前加修饰@ddt.ddt 3.case前加修饰@ddt.data() 4

Selenium2+python自动化55-unittest之装饰器(@classmethod)

前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间. 于是就想是不是可以只打开一次浏览器,执行完用例再关闭呢?这就需要用到装饰器(@classmethod)来解决了.   一.装饰器 1.用setUp与setUpClass区别 setup():每个测试case运行前运行 teardown():每个测试case运行完后执行 setUpClass():必须使用@classm

Selenium2+python自动化7-xpath定位

前言     在上一篇简单的介绍了用工具查看目标元素的xpath地址,工具查看比较死板,不够灵活,有时候直接复制粘贴会定位不到.这个时候就需要自己手动的去写xpath了,这一篇详细讲解xpath的一些语法. 什么是xpath呢? 官方介绍:XPath即为XML路径语言,它是一种用来确定XML1(标准通用标记语言3的子集)文档中某部分位置的语言.反正小编看这个介绍是云里雾里的,通俗一点讲就是通过元素的路径来查找到这个元素的,相当于通过定位一个对象的坐标,来找到这个对象. 一.xpath:属性定位

Selenium2+python自动化33-文件上传(send_keys)

前言 文件上传是web页面上很常见的一个功能,自动化成功中操作起来却不是那么简单. 一般分两个场景:一种是input标签,这种可以用selenium提供的send_keys()方法轻松解决: 另外一种非input标签实现起来比较困难,可以借助autoit工具或者SendKeys第三方库. 本篇以博客园的上传图片为案例,通过send_keys()方法解决文件上传问题 一.识别上传按钮 1.点开博客园编辑器里的图片上传按钮,弹出"上传本地图片"框. 2.用firebug查看按钮属性,这种上

Selenium2+python自动化52-unittest执行顺序

前言 很多初学者在使用unittest框架时候,不清楚用例的执行顺序到底是怎样的.对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行. 本篇通过最简单案例详细讲解unittest执行顺序. 一.案例分析 1.先定义一个测试类,里面写几个简单的case # coding:utf-8import unittestimport timeclass Test(unittest.TestCase):    def setUp(self):        print "start!"