Selenium是一款基于Web功能测试的自动化测试框架。它的应运而生经历了不同时代,组成了一系列工具集,已然成为了Web功能自动化测试的首选“武器”。
本次主要基于Web功能自动化中常见面试题和大家交流分享。下面涉及到的代码示例以JAVA语言为例,技术点笔试/面试题,共30问,分为上下两个篇章;上篇主要关注于Selenium核心技术点。
01Selenium中有哪些不同类型的定位
答:定位器可以看作一个地址,用于在网页中唯一标识一个页面元素,为了准确地识别Web元素,Selenium中有8种不同的定位方式:ID;ClassName;Name;TagName;LinkText;PartialLinkText;Xpath;CSS Selector。
02什么是XPath?
答:元素定位方式的一种,根据XML路径来定位Web元素,使用XPath定位元素的基本原理是在整个页面的各个元素间进行遍历,从而使用户能根据与当前元素关联的其他元素来确定当前元素的相对/绝对位置。
Xpath中“ /”和“ //”的意义如下:
(1)“ /”: 用于创建具有绝对路径的Xpath,即xpath从文档根节点/起始节点开始;
(2)“ //”: 用于创建具有相对路径的Xpath,即xpath从文档中的任何位置开始(非根节点)。
03WebDriver启动浏览器的脚本(列举不同类别的浏览器驱动)?
答:以下语法可用于启动浏览器:
WebDriver driver =new FirefoxDriver();
WebDriver driver =new ChromeDriver();
04WebDriver提供哪些常见类型的驱动程序?
答:WebDriver中常见驱动程序有(这部分建议在面试前查阅一下官网,做到实时同步更新):
· FirefoxDriver
· InternetExplorerDriver
· ChromeDriver
· SafariDriver
· OperaDriver
· AndroidDriver
05WebDriver中有哪些不同的等待类型?
答:Selenium WebDriver共有两类等待:
(1)隐式等待:在整个测试脚本中,每个连续测试步骤/命令间设置默认等待时间(例 如10秒)。因此,要执行后续测试步骤,需等待前一个测试步骤/命令执行完毕后,再经过10秒时,才能继续下一步。
(2)显式等待:与隐式等待不同,显式等待仅适用于特定实例, 用于中止当前执行,直到满足特定条件的元素出现为止(在允许的时间内)。
06driver.close() 和driver.quit() 有什么区别?
答:此二者区别如下:
· driver.close() :关闭用户当前正在使用的Web浏览器窗口,即WebDriver当前正在访问的窗口。.close() 方法既不需要任何参数,也无任何返回值;
· driver.quit() :不同于close(),quit()方法用于关闭程序已打开的所有窗口。该方法也不需要任何参数,也无任何返回值。
07WebDriver可以测试移动应用程序吗?
答:由于WebDriver是基于Web的测试框架,因此无法测试移动应用程序(APP),移动APP测试可以选择Appium。
08如何使用Selenium输入文本框?
答:使用sendKeys(“XXXXXX”)在文本框中输入字符串,例如:
WebElement username = drv.findElement(By.id(“电子邮件”));
username.sendKeys(“ sth”);
09如何查找元素是否显示在屏幕上?
答:WebDriver通过isDisplayed(), isSelected(), isEnabled(),这三种方法判断Web元素的可见性,这类方法将返回结果是布尔类型;Web元素可以是按钮,下拉框,复选框,单选按钮,标签等。
(1)isDisplayed():
boolean b1 = driver.findElement(By.id(“XXX”)).isDisplayed();
(2)isSelected():
boolean b2 = driver.findElement(By.id(“XXX”)).isSelected();
(3)isEnabled():
boolean b3 = driver.findElement(By.id(“XXX”)).isEnabled();
10如何获取Web元素中的文本?
答: Get方法用于获取指定Web元素内部文本,此方法不需要传递任何参数,直接调用即可,它返回的是字符串值。该方法常用于验证页面显示的消息,标签,错误信息等是否和预期匹配。
String Text = driver.findElement(By.id(“XXX”)).getText();
11如何获取下拉菜单中的值?
答: 通过WebDriver中Select类来选择下拉列表中的值:
(1)通过selectByValue(“XXX”):
Select selectByValue =new Select(driver.findElement(By.id(“某id”)));
selectByValue.selectByValue(“某选项”);
(2)通过selectByVisibleText(“XXX”):
Select selectByVisibleText =new Select (driver.findElement(By.id(“某id”)));
selectByVisibleText.selectByVisibleText(“某选项”);
(3)通过selectByIndex(X):
Select selectByIndex =new Select(driver.findElement(By.id(“某id”)));
selectByIndex.selectByIndex(3);
12Selenium中页面导航命令有哪些不同类型?
答:Selenium中常见的页面导航操作如下:
(1)navigate().back() – 回上一页,回到Web浏览器历史记录中的上一个网页。
例:driver.navigate().back();
(2)navigate().forward() – 去下一页, 基于浏览器的历史记录导航到下一个网页。
例:driver.navigate().forward();
(3)navigate().refresh() – 刷新当前页面。
例:driver.navigate().refresh();
(4)navigate().to() – 开启新的Web浏览器窗口,并导航到指定的URL。
例:driver.navigate().to(“https://www.atstudy.com/”);
13如何使用linkText单击超链接?
答:可以通过链接文本的全包含和部分包含来获取该链接的定位 。
(1)通过链接文本找到该元素,单击该元素,用户将被重定向到相应的页面;
driver.findElement(By.linkText(“超链接的内容”)).click();
(2)通过“部分包含链接文本”单击超链接,根据链接子字符串查找元素,找到后单击:
driver.findElement(By.partialLinkText(“部分链接内容”)).click();
注:partialLinkText(“XXX”)用于查找具有指定子字符串的web元素
14如何处理frame?
答: iframe类似于网页中的嵌套,及一个页面中嵌套多个其他完整的页面;在Selenium中基于iframe的操作如下:
(1)通过id定位iframe
driver.switchTo().frame(“目标frame的id“);
(2)通过tagName定位iframe
driver.switchTo().frame(driver.findElements(By.tagName(“iframe”).get(0));
(3)通过index定位iframe [frame(index)]
driver.switchTo().frame(0);
(4)通过frame的名字定位[frame(Name of Frame)]
driver.switchTo().frame(“name of the frame”);
15findElement()和findElements()分别用于何种场合?
答:单一匹配和多匹配的区别;
(1)findElement() :用于查找当前网页中与指定定位中,可以匹配的第一个元素,值得一提注意的是,仅返回第一个匹配上的元素;
WebElement element =driver.findElements(By.xpath(“//指定路径”));
(2)findElements() —— 用于查找当前网页中与指定定位匹配的所有元素,所有匹配的元素都将被提取并存储在WebElements列表中;
List <WebElement> elementList =driver.findElements(By.xpath(“//指定路径”));
16如何在列表中找到多个Web元素?
答:在进行Web测试时,我们经常会遇到一系列相同类型的元素,例如以有序/无序列表形式排列的多个超链接,图像等,要定位一系列同类型的元素,在JAVA中可以通过WebElement List来完成;
假定以下代码用来循环点击页面中有序/无序列表包含的每个相同类型的超链接元素:
Sample code:
// 创建一个列表,专门用于存放WebElement类型的对象
List <WebElement> elementList = driver.findElements(By.xpath("//指定路径"));
// 获取列表长度
int listSize = elementList.size();
// 遍历列表
for (int i=0; i<listSize; i++)
{
// 点击列表中当前元素链接,进入链接所在页面
serviceProviderLinks.get(i).click();
//回到前一页
driver.navigate().back();
}