第一部分 Selenium
1. Selenium有哪些组件?
最早的有
1.Selenium IDE,IDE只支持安装在fiefox上一个插件,支持录制自动化脚本。
2.remote RC
3.Grid
4.webdriver。我们一般最重要的就是使用webdriver。
2.在selenium中,有哪些不同定位元素方法
ID/className/Name/LinkText/PartialLinkText/Xpath/CSS selector
3.Selenium有什么限制或者缺陷
除了基于web的软件和mobile的程序,selenium不支持桌面软件自动化测试。软件测试报告,和用例管理只能依赖第三方插件,例如Junit/TestNG和unittest。由于它是免费的软件,所以没有供应商去提供支持和服务,有问题,只能求助selenium社区。还有一个就是,selenium入门门槛可能有点高,需要具备一定编程语言基础的才能玩转。
(1) Selenium仅支持基于Web的应用程序的测试;
(2) 无法使用Selenium测试移动应用程序,可以选择Appium进行移动端功能测试;
(3) 验证码和条形码阅读器无法使用Selenium进行测试;
(4) Selenium本身不具有生成测试报告的功能,以JAVA为例,需要结合第三方框架如TestNG或JUnit来生成测试报告。
4.如何提高 Selenium 脚本的执行速度?
1)排除硬件和网络问题。
2)不要过多使用强制等待,尽量使用显式等待。
3)选择性能较好的浏览器,例如:chrome, safari。
4)分布式执行,Selenium grid支持多个浏览器同时执行,并且互不干扰,而且可以进行远程部署。
5.Selenium是否支持桌面应用软件的自动化测试。
Selenium不支持桌面软件的自动化测试,Selenium是根据网页元素的属性才定位元素,而其他桌面软件自动化测试工具是根据桌面元素的位置来定位元素,当然现在也有根据桌面元素的属性来定位的。
6.Seleinum是否有读取excel文件的库
没有,这里需要用到第三方工具。例如Apache POI插件。
7.举例一下你遇到过那些异常,在selenium自动化测试过程中
通过这个问题,大概知道你写过多少脚本。写脚本过程最常见的异常就是,这个元素无法找到。常见的selenium有以下这些:
1、ElementNotSelectableException :元素不能选择异常
2、ElementNotVisibleException :元素不可见异常
3、NoSuchAttributeException :没有这样属性异常
4、NoSuchElementException:没有该元素异常
5、NoSuchFrameException :没有该frame异常
6、TimeoutException : 超时异常
7、Element not visible at this point :在当前点元素不可见
8. Selenium怎么判断元素是否存在?
答:1. 其实Selenium是没有现成的方法判断一个元素是否存在,所以我们可以选择曲线救国,把想要寻找的元素放在一个list中,判断list的size()是否为0,为0则不存在;不为0则存在。
2.或者通过try catch的方式,当元素不存在时,捕捉异常,并且有相应的提示信息。
如下为放在list中的伪代码,大概思路就是这样。
List<WebElement> list = driver.findelements(By.xpath("")); int size = list.size(); if(size==0){ System.out.println("元素不存在于此页面!"); } else{ System.out.println("元素存在于此页面!"); }
9. 关闭浏览器中quit和close的区别
简单来说,两个都可以实现退出浏览器session功能,close是关闭你当前聚焦的tab页面,而quit是关闭全部浏览器tab页面,并退出浏览器session。知道这两个区别,我们就知道quit一般用在结束测试之前的操作,close用在执行用例过程中关闭某一个页面的操作。
10. Selenium 中如何保证操作元素的成功率?也就是说如何保证我点击的元素一 定是可以点击的?
1.添加元素智能等待时间 driver.implicitly_wait(30)
2.添加强制等待时间(比如 python 中写 sleep)
3.try 方式进行 id,name,clas,x path, css selector 不同方式进行定位,如 果第一种失败可以自动尝试第二种
11. Selenium是否支持用例的执行的引擎。
引擎好比就是一个发动机。Selenium是没有关于测试用例和测试套件管理和执行的模块。我们需要借助第三方单元测试框架来实现用例管理和用例的执行。例如Java中有Junit或者testNG,Python中有unittest单元测试框架。
12. 如何查找元素是否显示在屏幕上?
答: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();
第二部分 元素定位
1.如何处理alert弹窗
1. 切换到AlertAlert alert = driver.switchTo().alert();
1.1 点击弹窗上确定按钮alert.accept();
1.2 点击弹窗的取消按钮alert.dismiss()
2. 获取弹窗上线上的文本文字内容alert.getText();
2.1 有些弹窗还支持文本输入,这个可以把要输入字符通过sendkeys方法输入alert.sendkeys();
2.在selenium中如何处理多窗口?
1.先打印所有的窗口 窗口句柄 windows = driver.window_handles
2.切换到最后的窗口driver.switch_to.window(windows[-1])
3.你查找元素遇到过在Frame里面吗?你是如何处理Frame里面元素定位的?
1. 先判断元素是否在iframe中 frame_el = driver.find_element_by_xpath("//iframe[@name=\'baidu\']")
2. 切换到iframe中 driver.switch_to.frame(frame_el)
3.定位元素 driver.find_element_by_id(\'kw\')
4.返回主页面 driver.switch_to.default_content()
5.如何处理下拉菜单?
1.. 二次定位的方法 先定位select按钮 再通过索引定位不同下拉框元素
driver.find_element_by_id("nr").find_element_by_xpath("//option[@value=\'50\']").click()
2. 可以导入select 模块
1.先导入select模块 from selenium.webdriver.support.select import Select 2. 通过select的选项索引进行定位 select_by_index(2) 3.select_by_index() :通过索引定位select_by_value() :通过value值定位select_by_visible_text() :通过文本值定位 deselect_all() :取消所有选项 deselect_by_index() :取消对应index选项 deselect_by_value() :取消对应value选项deselect_by_visible_text() :取消对应文本选项 first_selected_option() :返回第一个选项 all_selected_options() :返回所有的选项
6.在Selenium中如何实现拖拽滚动条?
selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了。
1. 可以先使用 scrollHeight 获取对象的滚动高度。 2. 根据元素进行定位 使用 scrollTo 函数进行定位 scrollTo(x, y)js = "window.scrollTo(100,400);" driver.execute_script(js) 3.滚动到底部 js = "window.scrollTo(0,document.body.scrollHeight)" driver.execute_script(js) 4.滚动到顶部 js = "window.scrollTo(0,0)" driver.execute_script(js)
什么是JavaScript Executor,你什么时候会用到这个?
JavaScript Executor是一个接口,给driver对象提供一个执行javaScript并访问和修改前端元素属性和值。还是有比较多的场景,我们可能或者需要借助javaScript来实现: 1.元素通过现有定位表达式不能够实现点击 2.前端页面试用了ck-editor这个插件 3.处理时间日期插件(可能) 4.生成一个alert弹窗 5.拖拽滚动条基本语法: JavascriptExecutor js =(JavascriptExecutor) driver; js.executeScript(Script,Arguments);
7. 如何实现文件上传?
1. input标签 可以用selenium提供的send_keys()方法轻松解决;
2.非input标签 可以借助autoit工具或者SendKeys第三方库。
8.在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这个文件中。
答:通过selenium提供的TakesScreenshot和OutputType 完成屏幕截图。 Sample Code: // 获取截屏 File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); // 将截屏保存到指位置 FileUtils.copyFile(scrFile, new File("C:\\CaptureScreenshot\\sample.jpg"))
9. 在执行脚本过程,如何实现当前元素高亮显示?
利用javaScript去修改当前元素的背景颜色来到达高亮显示的效果,
10.如何获取页面标题,悬浮文本和错误文本,并验证?
1. 标题,我们可以通过driver.getTitle()方法来得到一个字符串,然后使用字符串的containts方法或者equals方法去进行断言。
2. 悬浮文本(tooltip),一般是利用Actions类,然后鼠标悬停方法,然后通过getText()方法来得到这个tooltip字符串。
3. 错误信息,直接把这个错误字段先进行定位,然后通过getText()方法拿到错误文本,主要的断言有包含,相等,不相等,不包含,以什么开头等。
11. 怎么验证勾选框是enable/disabled/ checked/Unchecked/ displayed/ not displayed?
1. 通过以下方法来验证元素是enable 还是disableboolean
enabled = driver.findElement(By.xpath(“元素定位表达式”)).isEnabled();
2. 通过以下方法来验证元素是select/checkboolean
checked = driver.findElement(By.xpath(“元素定位表达式”)).isSelected();
3. 通过以下方法来验证元素是dispalyed还是not displayboolean
displayed = driver.findElement(By.xpath(“元素定位表达式”)).isDisplayed();
12. 什么是页面加载超时
Selenium中有一个 Page Load wait的方法,有时候,我们执行脚本的速度太快,但是网页程序还有一部分页面没有完全加载出来,就会遇到元素不可见或者元素找不到的异常。为了解决问题,让脚本流畅的运行,我们可以通过设置页面加载超时时间。具体代码是这个:driver.manage().timeouts().pageLoadTimeout(10,TimeUnit.SECONDS);这行作用就是,如果页面加载超过10秒还没有完成,就抛出页面加载超时的异常。
13. 在日历这种web 表单你是如何处理的?
首先要分析当前网页试用日历插件的前端代码,看看能不能通过元素定位,点击日期实现,如果不能,可能需要借助javascript。还有些日历控件一个文本输入框,可以直接sendKeys()方法来实现传入一个时间的数据。
14. 如何去定位页面上动态加载的元素?
1. 触发动态加载元素的事件,直至动态元素出现,进行定位
2. 定位属性动态变化的元素?
xpath 或者 css 通过同级、父级、子级进行定位点击链接以后, Selenium 是否会自动等待该页面加载完毕?会的
15. 怎么保证你要操作的元素一定是可以点击的?
答:1)可能由于服务器性能较差,或者网速较慢等原因,导致元素暂时还未加载出来,元素此时无法点击。可以通过等待元素加载解决此问题(等待分三种:隐式等待,显式等待和强制等待,这里推荐显示等待,相对提高执行效率)。
2)元素定位没问题,但是元素太小,Selenium无法点击到元素的中心位置。此时可以通过往上面层级的方式,找到更大的元素中心点,此时就可以对元素进行点击。
3)当元素被遮挡,例如下拉框遮挡的元素,也会无法点击,并且报错。此时只需要点击页面的其他任意元素,使下拉框收回,遮挡元素便可以进行点击。
4)被点击的元素在可视范围之外时,元素也无法点击。此时可以通过操作滚动条来解决,Selenium中没有直接操作滚动条的方法,曲线救国又来了,可以通过执行javascript代码进行滚动条的操作。
下面的代码是将元素向右滚动x像素点,向下滚动y个像素点,如果需要向左和向上滚动,x,y分别为负值即可。当然滚动条操作还有其他的方法,比如滚动到某个元素的位置等,具体大家可以自查。伪代码如下: driver.excuteScript("windows.scrollBy(x,y)");
5)可以直接判断元素是否可以点击。 driver.findElement(By.id("")).isClickable();
16. 如何使用Selenium输入文本框?
答:使用sendKeys(“XXXXXX”)在文本框中输入字符串,例如:
WebElement username = drv.findElement(By.id(“电子邮件”));
username.sendKeys(“ sth”);
17. 如何获取Web元素中的文本?
答: Get方法用于获取指定Web元素内部文本,此方法不需要传递任何参数,直接调用即可,它返回的是字符串值。该方法常用于验证页面显示的消息,标签,错误信息等是否和预期匹配。
String Text = driver.findElement(By.id(“XXX”)).getText();
18. selenium中页面导航命令有哪些不同类型?
答: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/”);
19.web测试中如何验证网页标题是否正确?
A:可以结合junit/testNG中的断言。
// 验证页面标题内容是否正确
assertTrue(“验证当前页面标题正确性:”,driver.getTitle().equals(“预期页面标题内容”));
第三部分 :web框架
1.
第四部分 :其他
1. 什么是线程等待(硬式等待)
如Thread.sleep(2000),webdriver线程强制休眠2秒钟,2秒过后,再执行后续的代码。
2. 什么是pollingEvery
#这个是设置个一段时间就去做一件事,例如下面设置隔一秒就去查找元素一次。 WebDriverWait wait = new WebDriverWait(driver,30);wait.pollingEvery(1, TimeUnit.SECONDS);driver.findElement(By.xpath(“xxxx”));
3. 如何处理“不受信任的证书”的问题?
例如,在登录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);