selenium面试问题答案总结

1. 什么是Selenium?
Selenium是一个开源的web自动化测试框架,主要是基于web uI的自动化测试。如今的版本,逐步增长了对移动端的自动化测试。Selenium支持多种语言进行开发自动化测试脚本,有Java,python,C#,Javascript等等。Selenium支持跨浏览器平台测试。javascript

2.Selenium是否支持桌面应用软件的自动化测试。
Selenium不支持桌面软件的自动化测试,Selenium是根据网页元素的属性才定位元素,而其余桌面软件自动化测试工具是根据桌面元素的位置来定位元素,固然如今也有根据桌面元素的属性来定位的。前端

3.Selenium是否支持用例的执行的引擎。
引擎比如就是一个发动机。Selenium是没有关于测试用例和测试套件管理和执行的模块。咱们须要借助第三方单元测试框架来实现用例管理和用例的执行。例如Java中有Junit或者testNG,Python中有unittest单元测试框架。java

4.Seleinum是否有读取excel文件的库
没有,这里须要用到第三方工具。例如Apache POI插件。python

5.Selenium有哪些组件?
最先的有Selenium IDE,IDE只支持安装在fiefox上一个插件,支持录制自动化脚本。还有
remote RC,和Grid 和webdriver。咱们通常最重要的就是使用webdriver。web

6.Selenium有什么限制或者缺陷
       除了基于web的软件和mobile的程序,selenium不支持桌面软件自动化测试。软件测试报告,和用例管理只能
依赖第三方插件,例如Junit/TestNG和unittest。因为它是免费的软件,因此没有供应商去提供支持和服务,有问题,只能求助selenium社区。还有一个就是,selenium入门门槛可能有点高,须要具有必定编程语言基础的才能玩转。面试

7.在selenium中,有哪些不一样定位元素方法
ID/className/Name/LinkText/PartialLinkText/Xpath/CSS selectorchrome

8.什么是imlicitlyWait
imlicitlyWait是隐式等待,通常在查找元素的时候使用。例如,我设置一个查找元素最大时间为10秒,使用了
imlicitlyWait后,若是第一次没有找到元素,会在10秒以内不断循环去找元素,知道超过10秒,报超时错误。编程

9.什么是expliciteWait
这个是显式等待,就是无论如何都是要等10秒,若是你设置了10秒超时,这个是selenium2的功能
在selenium3中,我暂时没有找到这个接口。c#

10.什么是线程等待
有时候,咱们须要强制设置线程等待,Thread.sleep(2000),driver这个实例,就是当前的线程。windows

11.什么是pollingEvery
这个是设置个一段时间就去作一件事,例以下面设置隔一秒就去查找元素一次。
 WebDriverWait wait = new WebDriverWait(driver,30);
 wait.pollingEvery(1, TimeUnit.SECONDS);
 driver.findElement(By.xpath("xxxx"));

12你能解释下Selenium这个框架吗?

    这个问题在面试中被问到的几率仍是比较高的,一样相似的问题有,selenium的原理是什么?首先不要被这个问题吓到,咱们主要围绕selenium的历史版本演化和基本的组件去展开描述就好,最后回到webdriver这个组件上面,咱们基本上都是在使用webdriver提供的API。因此这个题目的最好的答案就是把图画出来,而后本身解释几句就能够。 早期Selenium1.0是有Selenium Grid,Selenium RC, Selenium IDE, Webdriver四部分组成,后来Selenium RC和Webdriver合并以后,就是Selenium2,当前咱们在使用Selenium3。

 Selenium Grid:它是selenium框架的一部分,主要是专门用来把测试用例并行地在不一样浏览器,不一样操做系统,不一样机器上运行。通常咱们写脚本,调试都在单机上线性地一个测试用例接着一个测试用例执行下去。若是有人问题如何提升测试用例执行效率,告诉他Selenium Grid能够实现。

 Selenium IDE: 这个算Selenium里面最简单的一个组建,只支持在火狐浏览器上安装这个扩展程序,支持录制web ui脚本,而后导出不一样语言的脚本,例如java c#等。这个功能算鸡肋,由于不少时候导出脚本debug的时间还不如本身代码从新写来的快。

 Selenium RC: RC是remote control的缩写,主要的功能就是让你无论使用什么语言(Selenium支持的这几种语言之一)来写测试脚本,只要是这个浏览器支持java script,那么写一遍测试脚本,都能在这些不一样浏览器运行脚本。

 Webdriver:这个是用来替代Selenium RC,就是一个网页自动化工具,支持在不一样浏览器上运行测试脚本,运行速度比Selenium RC要快不少。听说(我也记得不清楚),webdriver最先是google内部开发的一个工具,用来捐给selenium了,变成开源了。

    目前,咱们作的web ui的自动化测试,大部分都是在使用webdriver提供的API来模拟手动测试过程当中的一系列动做和行为。基本上经过这个方式来回答这个问题,那就没问题了。

 13.你写的测试脚本能在不一样浏览器上运行吗,支持跨浏览器平台吗

 这里出现了跨浏览器平台的概念,就是写一个测试用例,能够在主流的几个浏览器跑起来。

   是的,我写的测试用例能在IE,火狐和谷歌这三种浏览器上运行。主要是在windows平台上运行脚本,因此mac的safari浏览器暂时没有写过。主要实现这个跨浏览器的思想就是,把浏览器类型写到配置文件,代码里写if语句去判断配置文件的浏览器的类型,来决定用什么浏览器去执行测试用例。

14.一天你写多少个自动化测试用例

  这个要看具体状况,彻底取决于手工测试用例的实现难易程度。一般,熟练的话,写一个5到8个步骤的测试用例,差很少要半小时。时间最多花在元素定位和报错debug上面,例如在POM思想的框架中,某一些元素定位和方法是复用的,可能会更快一些。因此,一天,大概能完成15-30个自动化测试用例。

 15.什么是POM,为何要使用它

  POM是Page Object Model的简称,它是一种设计思想,而不是框架。大概的意思是,把一个一个页面,当作一个对象,页面的元素和元素之间操做方法就是页面对象的属性和行为,因此天然而然就用了类的思想来组织咱们的页面。通常一个页面写一个类文件,这个类文件包含该页面的元素定位和业务操做方法。

 为了咱们测试用例写的简单,清晰,咱们不少时候在页面对象会封装不少业务操做方法,测试脚本只须要调用相关方法就能够。

 还有一个可能和这个问题相关的面试题,若是页面元素常常发生需求变化,你是如何作,答案就是采用POM思想。好处就是只要该一个页面,我就去修改这个页面对象的元素定位和相关方法,脚本不须要修改。

16.在你作自动化过程当中,遇到了什么问题吗?举例下

 这个问题,不论是自动化仍是任何工做,都会被问到。主要想知道你是如何解决问题的,从而推断你问题分析和解决的能力。

 固然有遇到问题和挑战,主要有如下几点:

 频繁地变动UI,常常要修改页面对象里面代码
 运行用例报错和处理,例如元素不可见,元素找不到这样异常
 测试脚本复用,尽量多代码复用
 一些新框架产生的页面元素定位问题,例如ck编辑器,动态表格等
  这个遇到的难点彻底取决写脚本人的代码能力。回答三个左右就差很少,记得既然抛出了难点问题,必定要记得处理这个问题的方法。

17.举例一下你遇到过那些异常,在selenium自动化测试过程当中

经过这个问题,大概知道你写过多少脚本。写脚本过程最多见的异常就是,这个元素没法找到。常见的selenium有如下这些:

1. ElementNotSelectableException :元素不能选择异常
2. ElementNotVisibleException :元素不可见异常
3. NoSuchAttributeException :没有这样属性异常
4. NoSuchElementException:没有该元素异常
5. NoSuchFrameException :没有该frame异常
6. TimeoutException : 超时异常
7. Element not visible at this point  :在当前点元素不可见

 18. 如何处理alert弹窗

咱们常见的alert弹窗有两种:基于windows弹窗和基于web页面弹窗

咱们知道,webdriver是可以处理alert弹窗的,Selenium提供了Alert这个接口。相关操做代码以下:

 // 切换到Alert

Alert alert = driver.switchTo().alert();

// 点击弹窗上肯定按钮

alert.accept();

// 点击弹窗的取消按钮
alert.dismiss()

// 获取弹窗上线上的文本文字内容
alert.getText();

// 有些弹窗还支持文本输入,这个能够把要输入字符经过sendkeys方法输入
alert.sendkeys();

19. 在selenium中如何处理多窗口?

这个多窗口之间跳转处理,在实际selenium自动化测试常常遇到。就是,你点击一个连接,这个连接会在一个新的tab打开,而后你接下来要查找元素在新tab打开的页面,因此这里须要用到swithTo方法。

须要获取当前浏览器多窗口句柄,而后根据判断跳转新句柄仍是旧句柄,具体代码能够参考我博客文章:http://blog.csdn.net/u011541946/article/details/73611301

 20. 你查找元素遇到过在Frame里面吗?你是如何处理Frame里面元素定位的?

有时候咱们知道元素定位表达式没有问题,可是仍是提示no such element,那么咱们就须要考虑这个元素是否在frame中。若是在,咱们就须要从topwindow,经过swithcTo.Frame()方法来切换到目标frame中,能够经过frame的name和id和索引三种方法来定位frame。

 21. 怎么验证勾选框是enable/disabled/ checked/Unchecked/ displayed/ not displayed?

 经过如下方法来验证元素是enable 仍是disable

boolean enabled = driver.findElement(By.xpath("元素定位表达式")).isEnabled();

 经过如下方法来验证元素是select/check

boolean checked = driver.findElement(By.xpath("元素定位表达式")).isSelected();

 经过如下方法来验证元素是dispalyed仍是not display

boolean displayed = driver.findElement(By.xpath("元素定位表达式")).isDisplayed();

22. 如何处理下拉菜单?

一般咱们也能够经过Click方法来点击下拉菜单里面的元素,还有一种方法,在Selenium中有一个类叫Select,支持这种下拉菜单交互的操做。

基本使用语法是这样的:

Select Se=new Select(element);
Se.selectByIndex(index);
Se.selectByvalue(value);
Se.selectByVisibleText(text);

 23. 在日历这种web 表单你是如何处理的?

首先要分析当前网页试用日历插件的前端代码,看看能不能经过元素定位,点击日期实现,若是不能,可能须要借助javascript。还有些日历控件一个文本输入框,能够直接sendKeys()方法来实现传入一个时间的数据。

 24. 关闭浏览器中quit和close的区别

简单来讲,两个均可以实现退出浏览器session功能,close是关闭你当前聚焦的tab页面,而quit是关闭所有浏览器tab页面,并退出浏览器session。知道这两个区别,咱们就知道quit通常用在结束测试以前的操做,close用在执行用例过程当中关闭某一个页面的操做。
25. 什么是页面加载超时

 Selenium中有一个 Page Load wait的方法,有时候,咱们执行脚本的速度太快,可是网页程序还有一部分页面没有彻底加载出来,就会遇到元素不可见或者元素找不到的异常。为了解决问题,让脚本流畅的运行,咱们能够经过设置页面加载超时时间。具体代码是这个:driver.manage().timeouts().pageLoadTimeout(10,TimeUnit.SECONDS);

 这行做用就是,若是页面加载超过10秒尚未完成,就抛出页面加载超时的异常。

 26.什么是JavaScript Executor,你何时会用到这个?

 JavaScript Executor是一个接口,给driver对象提供一个执行javaScript并访问和修改前端元素属性和值。

 仍是有比较多的场景,咱们可能或者须要借助javaScript来实现:

1.元素经过现有定位表达式不可以实现点击

2.前端页面试用了ck-editor这个插件

3.处理时间日期插件(可能)

4.生成一个alert弹窗

5.拖拽滚动条

 基本语法:

JavascriptExecutor js =(JavascriptExecutor) driver;
js.executeScript(Script,Arguments);

27.在Selenium中如何实现截图,如何实现用例执行失败才截图

 在Selenium中提供了一个TakeScreenShot这么一个接口,这个接口提供了一个getScreenshotAs()方法能够实现全屏截图。而后咱们经过java中的FileUtils来实现把这个截图拷贝到保存截图的路径。

 代码举例:

File src=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
try {
// 拷贝到咱们实际保存图片的路径

FileUtils.copyFile(src,new File("C:/selenium/error.png"));
}
catch (IOException e)
{
System.out.println(e.getMessage());
}

 若是要实现执行用例发现失败就自动截图,那么咱们须要把这个截图方法进行封装。而后在测试代码中的catch代码块去调用这个截图方法。这个咱们在POM的框架中通常是把截图方法封装到BasePage这个文件中。

 28.在Selenium中如何实现拖拽滚动条?

  在Selenium中经过元素定位会自动帮你拖拽到对应位置,因此是没有自带的scoll方法。可是这个是有限制,例如当前页面高度太长,默认是页上半部分,你定位的元素在页尾,这个时候可能就会报元素不可见的异常。咱们就须要利用javaScript来实现拖拽页面滚动条。

咱们通常能够两个方法去拖拽,一个是根据拖拽的坐标(像素单位),另一个是根据拖拽到一个参考元素附件。

 代码举例(根据元素坐标拖拽):

JavascriptExecutor jse= (JavascriptExecutor)driver;
jse.executeScript("window.scrollBy(0,250)", "");

 29.如何实现文件上传?

 咱们在web页面实现文件上传过程当中,能够直接把文件在磁盘完整路径,经过sendKeys方法实现上传。若是这种方法不能实现上传,咱们就可能须要借助第三方工具,我用过一个第三方工具叫autoIT.

 还有一个方法是利用robot类:

http://blog.csdn.net/u011541946/article/details/74332938

 30.如何处理“不受信任的证书”的问题?

 例如,在登陆12306网站的时候,若是你没有下载和安装过这个网站的根证书,那么你就会遇到打开12306网站提示证书不受信任的拦截页面。

 下面举例火狐和谷歌上处理这个问题的基本代码

 火狐:

// 建立firefoxprofile
FirefoxProfile profile=new FirefoxProfile();
// 点击继续浏览不安全的网站
profile.setAcceptUntrustedCertificates(true);
// 使用带条件的profile去建立一个driver对象
WebDriver driver=new FirefoxDriver(profile);

 Chrome:

// 建立类DesiredCapabilities的对象
DesiredCapabilities cap=DesiredCapabilities.chrome();
// 设置ACCEPT_SSL_CERTS 变量值为true
cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
// 新建一个带capability的chromedriver对象
WebDriver driver=new ChromeDriver(cap);

31.findElement 和 FindElements有什么区别?

 首先,两个都是查找元素,都支持八大元素定位方法。findElement()获得的只有一个元素,若是根据提供的元素定位方式找不到,会报noSuchElement异常。

 findElements()返回的是一组元素,因此咱们须要根据可以找到一组元素的表达式去定位,返回一组元素咱们能够放在集合里,这样咱们就可使用集合里面的迭代方法去遍历元素,拿到元素去作其余操做。

 32.在执行脚本过程,如何实现当前元素高亮显示?

 这个其实就是利用javaScript去修改当前元素的背景颜色来到达高亮显示的效果,

33.如何获取页面标题,悬浮文本和错误文本,并验证?

 标题,咱们能够经过driver.getTitle()方法来获得一个字符串,而后使用字符串的containts方法或者equals方法去进行断言。

 悬浮文本(tooltip),通常是利用Actions类,而后鼠标悬停方法,而后经过getText()方法来获得这个tooltip字符串。

 错误信息,直接把这个错误字段先进行定位,而后经过getText()方法拿到错误文本,主要的断言有包含,相等,不相等,不包含,以什么开头等。

 34.在selenium自动化测试中,你通常完成什么类型的测试?

     主要是冒烟测试和回归测试。回归测试主要写一些功能稳定,容易实现的场景,经过自动化手段去实现,节约测试时间。

 35.你是如何管理你的测试用例并执行?

     写用例和管理并执行用例,咱们都须要借助单元测试框架来实现,若是是Java语言通常有junit和TestNG,若是是python,常见的有unittest。

     就你实际状况,说一下。例如我使用TestNG比较多,须要配置testng.xml文件来实现测试用例的执行。有时候须要配置多个testng.xml去实现不一样的任务场景。再展开,可能问你一下testng框架的知识点。例如,方法依赖,用例执行优先级,数据源驱动等。

 36.关于自动化测试报告生成?

 我我的通常用TestNG原生的测试报告,也有第三方叫reportNG的插件,不过我没有实际使用过。

Python下报告生成通常使用HTMLTestRunner.py

 37. 了解或者使用过框架不?

 相似的问题还有,你知道那些自动化测试框。

咱们知道POM自动化测试框,还有关键字驱动框架。固然还有数据驱动框架,最近几年出的行为驱动框架。

 38. 这个框架是你本身写的吗?

 我本身设计过POM的框架和关键字驱动框架。

 39.能不能介绍下你的框架

    把你本身POM的框架从上往下,树形结构画图出来,而后讲下有哪些层,哪些包,包下几个重点的类的做用和一些工具类说一下。用例如何执行,页面对象和元素定位放哪里,错误日志和截图如何处理,报告如何获得等。

相关文章
相关标签/搜索