1. 1.   专业技术

在学习完Selenium的大部分接口或者方法之后,你可能会去面试自动化测试,主要是Selenium的自动化测试。下面这些问题总结,可能会对你有所帮助。

  1. 什么是Selenium?

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

  1. Selenium是否支持桌面应用软件的自动化测试。

      Selenium不支持桌面软件的自动化测试,Selenium是根据网页元素的属性才定位元素,而其他桌面软件自动化测试工具是根据桌面元素的位置来定位元素,当然现在也有根据桌面元素的属性来定位的

  1. Selenium是否支持用例的执行的引擎

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

  1. Seleinum是否有读取excel文件的库

没有,这里需要用到第三方工具。例如Apache POI插件

  1. Selenium有哪些组件

最早的有Selenium IDE,IDE只支持安装在fiefox上一个插件,支持录制自动化脚本。还有remote RC,和Grid 和webdriver。我们一般最重要的就是使用webdriver。

  1. Selenium有什么限制或者缺陷

   除了基于web的软件和mobile的程序,selenium不支持桌面软件自动化测试。软件测试报告,和用例管理只能依赖第三方插件,例如Junit/TestNG和unittest。由于它是免费的软件,所以没有供应商去提供支持和服务,有问题,只能求助selenium社区。还有一个就是,selenium入门门槛可能有点高,需要具备一定编程语言基础的才能玩转

  1. 在selenium中,有哪些不同定位元素方法

ID/className/Name/LinkText/PartialLinkText/Xpath/CSS selector

  1. 什么是imlicitlyWait

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

  1. 什么是线程等待

有时候,我们需要强制设置线程等待,Thread.sleep(2000),driver这个实例,就是当前的线程。

  1. 你能解释下Selenium这个框架吗?
  2.  这个问题在面试中被问到的概率还是比较高的,同样类似的问题有,selenium的原理是什么?首先不要被这个问题吓到,我们主要围绕selenium的历史版本演化和基本的组件去展开描述就好,最后回到webdriver这个组件上面,我们基本上都是在使用webdriver提供的API。所以这个题目的最好的答案就是把图画出来,然后自己解释几句就可以。 早期Selenium1.0是有Selenium Grid,Selenium RC, Selenium IDE, Webdriver四部分组成,后来Selenium RC和Webdriver合并之后,就是Selenium2,当前我们在使用Selenium3。
    1.  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来模拟手动测试过程中的一系列动作和行为。基本上通过这个方式来回答这个问题,那就没问题了。

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

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

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

两个都可以实现退出浏览器session功能,close是关闭你当前聚焦的tab页面,而quit是关闭全部浏览器tab页面,并退出浏览器session。知道这两个区别,我们就知道quit一般用在结束测试之前的操作,close用在执行用例过程中关闭某一个页面的操作

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

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

  1. 如何处理下拉菜单?

通常我们也可以通过Click方法来点击下拉菜单里面的元素,还有一种方法,在Selenium中有一个类叫Select,支持这种下拉菜单交互的操作。

基本使用语法是这样的:

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

 

  1. 怎么验证勾选框是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();

 

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

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

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

这里需要用到swithTo方法。

需要获取当前浏览器多窗口句柄,然后根据判断跳转新句柄还是旧句柄

  1. 如何处理alert弹窗

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

我们知道,webdriver是能够处理alert弹窗的,Selenium提供了Alert这个接口。相关操作代码如下:

 

// 切换到Alert

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

// 点击弹窗上确定按钮

alert.accept();

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


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


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

 

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

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

  1. findElement 和 FindElements有什么区别?

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

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

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

标题,我们可以通过driver.getTitle()方法来得到一个字符串,然后使用字符串的containts方法或者equals方法去进行断言。

悬浮文本(tooltip),一般是利用Actions类,然后鼠标悬停方法,然后通过getText()方法来得到这个tooltip字符串。

 

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

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

写用例和管理并执行用例,我们都需要借助单元测试框架来实现,如果是Java语言一般有junit和TestNG,如果是python,常见的有unittest。

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

  1. 如何确定动态加载的元素:

- xpath或者css通过同级、父级、子级进行定位

使用selenium做网页UI自动化的时候,会遇到网页元素ID是动态加载生成的情况,这个时候使用传统的xpath精确定位,会找不到元素,这个时候可以考虑模糊匹配定位,匹配元素定位中不变且唯一的地方

可以使用的方法有

starts-with(以什么开始)

ends-with(以什么结束)

contains 包含

 

以contains 为例子:

比如我们在定位中使用的xpath定位一个使用下拉框中的某一项值,我们得到的xpath为

.//*[@id='cascader-menu-3932']/li[1]

 

目标下拉框元素中的3932是一个后台动态加载给前台的值,每次刷新网页都会变化,这个时候使用传统的xpath定位,一定是找不到该元素的,可以将上述标黄的部分改写成模糊匹配

[@id='cascader-menu-3932']

[contains(@id,"cascader-menu")]

其他的部分不改变,直接搬回来,然后就可以正常定位了

.//* + [contains(@id,"cascader-menu")] + /li[1] = .//*[contains(@id,"cascader-menu")]/li[1]

  1. 介绍一下selenium2.0

Selenium2.0 = Selenium1.0 + WebDriver(也就是说Selenium2.0合并了这两个项目)

Rc是在浏览器中运行js应用,使用浏览器内置的js翻译器翻译和执行selenese命令

WebDriver是通过原生浏览器支持或浏览器扩展来直接控制浏览器。针对各浏览器而开发,避免了js安全模型导致的限制;还利用操作系统及的调用,模拟用户输入;

  1. 请说明selenium 2.0与3.0的区别

Selenium 2.0 =Selenium 1.0+WebDriver

Selenium 3.0舍弃rc只有driver

  1. 元素找不到可能的原因?

1.动态id定位不到元素

2.iframe原因定位不到元素

3.不在同一个frame里边查找元素

4. xpath描述错误

5.点击速度过快 页面没有加载出来就需要点击页面上的元素

6.firefox安全性强,不允许跨域调用出现报错

 

1,selenium中如何判断元素是否存在?

判断元素是否存在和是否出现不同, 判断是否存在意味着如果这个元素压根就不存在, 就会抛出NoSuchElementException

这样就可以使用try catch,如果catch到NoSuchElementException 就返回false

 

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

面试题:selenium中隐藏元素如何定位?这个是很多面试官喜欢问的一个题,如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法就行了
但是吧~~~很多面试官自己都搞不清楚啥叫定位,啥叫操作元素(如click,clear,send_keys)

隐藏元素

如下图有个输入框和一个登录的按钮,本来是显示的

1070438-20181224173724546-907774977.png

元素的属性隐藏和显示,主要是 type="hidden"style="display: none;"属性来控制的,接下来在元素属性里面让它隐藏

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>这里有个按钮,是隐藏的
 
<!-- type="hidden" -->
<br>
输入账号<input id="yoyo" name="hello" type="hidden">
 
<!-- type="display: none;" -->
<br>
<button id="yy" name="heo" style="display: none;">登录</button>
<br>
 
<a hidden id="baidu" href="https://www.baidu.com">访问百度</a>
</p>
 
</body>
</html>

 

这样元素就不会显示了,也就是面试官所说的隐藏属性了

1070438-20181224180701590-773098790.png

定位隐藏元素

前面说了,定位隐藏元素和普通的元素没啥区别,接下来就来验证下,是不是能定位到呢?

from selenium import webdriver
 
driver = webdriver.Firefox()
driver.get("http://localhost:63342/test1122/a/b.html")
 
# 定位type="hidden"隐藏元素
ele1 = driver.find_element_by_id("yoyo")
print("打印元素信息:%s" % ele1)
 
# 获取元素属性
print(ele1.get_attribute("name"))
 
# 判断元素是否隐藏
print(ele1.is_displayed())

 

运行结果:

打印元素信息:<selenium.webdriver.remote.webelement.WebElement (session="1debdd46-21b1-451e-b8a7-5aeff1d74f9d", element="{28628a87-7f22-4574-9e14-931f9c6f20e1}")>
hello
False

 

运行结果可以看出,隐藏元素用普通定位方法,事实上是定位到了呢!

操作隐藏元素

隐藏元素可以正常定位到,只是不能操作(定位元素和操作元素是两码事,很多初学者傻傻分不清楚),操作元素是click,clear,send_keys这些方法

# 隐藏输入框元素输入文本
ele1 = driver.find_element_by_id("yoyo")
ele1.send_keys("yoyo")

隐藏元素用send_keys()方法会抛异常'ElementNotVisibleException': Message: Element is not currently visible and so may not be interacted with
这个报错是说元素不可见,不可以被操作,同样的对“登录”按钮点击操作也是会报'ElementNotVisibleException'

# 点击隐藏登录框
ele2 = driver.find_element_by_id("yy")
ele2.click()

 

JS操作隐藏元素

如果面试官想问的是定位后操作隐藏元素的话,本质上说这个问题就是毫无意义的,web自动化的目的是模拟人的正常行为去操作。
如果一个元素页面上都看不到了,你人工也是无法操作的是不是?人工都不能操作,那你自动化的意义又在哪呢?所以这个只是为了单纯的考察面试者处理问题的能力,没啥实用性!(面试造飞机,进去拧螺丝)
既然面试官这么问了,那就想办法回答上给个好印象吧!
首先selenium是无法操作隐藏元素的(但是能正常定位到),本身这个框架就是设计如此,如果非要去操作隐藏元素,那就用js的方法去操作,selenium提供了一个入口可以执行js脚本。
js和selenium不同,只有页面上有的元素(在dom里面的),都能正常的操作,接下来用js试试吧!

<a hidden id="baidu" href="https://www.baidu.com">访问百度</a> 这个链接是隐藏的,但是能用js点到

from selenium import webdriver
 
driver = webdriver.Firefox()
driver.get("http://localhost:63342/test1122/a/b.html")
 
# js点击hidden元素
 
js = 'document.getElementById("baidu").click()'
driver.execute_script(js)

运行完之后,会发现页面正常的点击,跳转到百度页面了

备注:百度搜到的可能方法是先用js去掉hidden属性,再用selenium操作,这个有点多此一举,你既然都已经会用js了,何必不一次性到位直接click呢?

 

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

 a,通过增加显性等待时间webdriverwait

 b,注意点击元素前是否需要滚动页面或是ActionChains操作

 

1,如何提高selenium脚本的执行速度?

 

    •  优化测试用例,尽可不使用 sleep,减少使用ImplicitlyWait
      ,而使用selenium的webdriverwait方法,这样可以优化等待时间
    • 另外从代码方面提高python的运行效率

      多个if elif条件判断,可以把最有可能先发生的条件放到前面写,这样可以减少程序判断的次数,提高效率

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

 先分析不稳定的原因,是元素没加载出来就去点击?那么增加等待时间。推荐webdriverwait方法。

 

1,你的自动化用例的执行策略是什么?

 

什么是持续集成?

 

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

 

id,name,clas,x path, css selector这些属性,你最偏爱哪一种,为什么?

 

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

 

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

 

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

 

webdriver client的原理是什么?

 

webdriver的协议是什么?

 

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

 

什么是page object设计模式?

 

什么是page factory设计模式?

 

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

 

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

什么是断言?

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

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

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

自动化测试用例从哪里来?

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

什么是分层测试?

webdriver可以用来做接口测试吗?