什么是异常?

  顾名思义,作为程序员的一种常用术语,“异常”与任何特定的编程语言无关。它属于程序因为突然中止,而未能交付出预期输出的事件。通常,引发异常出现的潜在因素往往来自如下方面:

  · Java虚拟内存(JVM)的不足

  · 请求访问的文件在目标系统中不存在

  · 用户提供了无效的数据

  · 在正常的通信过程中突然出现断网

  Java中的异常类型

  1. 已查明的异常(Checked Exceptions):编译器在编译的过程中,会检查到这些异常,并验证它们是否已被处理。如果未被处理,系统会报告编译错误。因此它们被通称为编译时异常(compile-time exceptions)。下面是一些常见的此类异常示例:

  · SQLException:程序在基于SQL语法执行数据库查询时,可能会产生此类异常。

  · IOException:程序在文件上执行无效的I/O流操作时,可能会产生此类异常。

  · ClassNotFoundException:当JVM无法找到所需的Java类时,可能会产生此类异常。

  2. 未查明的异常(Unchecked Exceptions):这些异常是在程序的执行期间发生的逻辑错误,因此通常称为运行时异常(Runtime Exceptions)。此类异常在编译时未被检查出来,或者在整个编译过程中已被忽略。下面是一些典型的此类异常示例:

  · NullPointerException:当访问具有空值的对象时,可能会产生此类异常。

  · ArrayIndexOutofBound:当使用无效的索引值去访问数组时,可能会产生此类异常。

  · IllegalArgumentException:当程序将不正确的参数传递给方法时,可能会产生此类异常。

  · NumberFormatException:当程序将字符串传递给无法转换为数字的方法时,可能会产生此类异常。

  · ArithmeticException:当程序执行不正确的算术运算(例如将数字除以零)时,可能会产生此类异常。

  异常处理标准

  通过对异常处理能力的提升,我们不仅可以保持代码的整洁,而且能够增强其可维护性、可扩展性和可阅读性。当然,不同的面向对象编程(Object-Oriented Programming,OOP)语言,具有不同的异常处理方法。以下是一些常用的Java异常处理标准:

  Try-Catch:该关键字组合可被用于捕获异常。其中,try块应当被放在开头,而catch块应被放在try块的末尾,以便捕获异常,并采取必要的行动。也就是说,我们可以在遇到异常时,创建异常类的对象,以便使用以下预定义的方法,来显示调试信息:

  · printStackTrace():该函数可用于打印栈的跟踪、异常的名称、以及其他重要的异常信息。

  · getMessage():此函数有助于获取针对异常的深入描述。

  try

  {

  // Code

  } catch(Exception e){

  // Code for Handling exception

  }

  同时,Try-Catch块也可以用其他高级方法来处理异常,例如,我们可能希望从单个代码块中捕获多个异常,那么就可以通过在try块之后的多个catch块,去处理不同的异常。而且,我们在try块之后,使用无限数量的catch块。

  try

  {

  //Code

  } catch(ExceptionType1 e1){

  //Code for Handling Exception 1

  } catch(ExceptionType2 e2){

  //Code for Handling Exception 2

  }

  Throw/Throws:如果程序员想显式地抛出异常,那么可以使用throw关键字,与要在运行时处理的异常对象协同使用。

  public static void exceptionProgram()throws Exception{

  try {

  // write your code here

  } Catch(Exception b){

  // Throw an Exception explicitly

  throw(b); }

  }

  如果开发者想抛出多个异常,则可以通过在方法签名的子句中使用throws关键字来抛出,并且由方法的调用者去进行异常处理。

  public static void exceptionProgram()throws ExceptionType1, ExceptionType2{

  try {

  // write your code here

  } catch(ExceptionType1 e1){

  // Code to handle exception 1

  } catch(ExceptionType1 e2){

  // Code to handle exception 2

  }

  finally:该个代码块往往是在try-catch块之后被创建的。也就是说,无论是否抛出异常,它都会被执行。

  try {

  //Code

  } catch(ExceptionType1 e1){

  //Catch block

  } catch(ExceptionType2 e2){

  //Catch block

  }  finally {

  //The finally block always executes.

  }

  Selenium中的常见异常

  WebDriverException定义了Selenium中的多种异常,我们从中选取最常见的异常予以介绍,并配上简单的针对Selenium的异常处理方案:

  1. NoSuchElementException

  当WebDriver无法定位所需要元素时,Selenium可能会产生此类异常。此处的NoSuchElementException是NotFoundException类的子类,它通常出现在程序使用了无效的定位器时。

  此外,如果WebDriver仍然停留在上一页、或正在加载下一页,而所需的定位器已到达了下一页时,就会因为该延迟而出现异常。为此,我们应当通过适当的等待处理测试,最大限度地减少此类异常的发生。

  当然,此类异常可以在catch块中被捕获到,并且可以在其中执行所需的操作,以继续完成自动化的测试。例如:

  try { driver.findElement(By.id("form-save")).click(); } catch(NoSuchElementException e){

  System.out.println(“WebDriver couldn’t locate the element”); }

  2. NoSuchWindowException

  该异常也是NotFoundException类的子类。如果WebDriver尝试着切换到无效的浏览器窗口,那么WebDriver将抛出NoSuchWindowException。因此,要实现窗口切换的好方法是,首先获取活动窗口的会话,然后在对应的窗口上执行所需的操作。例如:

  for(String windowHandle : driver.getWindowHandles()){

  try { driver.switchTo().window(handle); } catch(NoSuchWindowException e){ System.out.println(“Exception while switching browser window”); }

  }

  3. NoAlertPresentException

  当WebDriver尝试着切换到某个不存在或无效的警报时,Selenium可能会产生此类异常。对此,我建议开发者使用显式、或适当的等待时间,来处理浏览器的各类警报。倘若仍然等不到警报的话,catch块可以捕获该异常。例如:

  try {

  driver.switchTo().alert().accept(); } catch(NoSuchAlertException e){

  System.out.println(“WebDriver couldn’t locate the Alert”); }

  4. ElementNotVisibleException

  该异常被定义为ElementNotInteractableException类的子类。当WebDriver尝试着对不可见的元素、或不可交互的元素执行各项操作时,Selenium可能会产生此类异常。对此,我建议开发者在的确需要之处,让Selenium进行适当的超时等待。例如:

  try { driver.findElement(By.id("form-save")).click(); } catch(ElementNotVisibleException e){

  System.out.println(“WebDriver couldn’t locate the element”); }

  5. ElementNotSelectableException

  该异常属于InvalidElementStateException类的子类。在Selenium中,ElementNotSelectableException表明某个元素虽然存在于网页上,但是无法被WebDriver所选择。

  catch块不但可以处理Selenium中的此类异常,而且可以使用相同或不同的技术,重新选择相同的元素。例如:

  try {

  Select dropdown = new Select(driver.findElement(By.id(“swift”))); } catch(ElementNotSelectableException e){

  System.out.println("Element could not be selected")}

  6. NoSuchSessionException

  Selenium通过driver.quit()命令退出自动化的浏览器会话后,以及在调用某个测试方法时,会产生此类异常。当然,如果浏览器崩溃或出现断网,该异常也可能会发生。为了避免出现NoSuchSessionException,我们可以在测试套件结束时,退出浏览器,并确保用于自动化测试的浏览器版本的稳定性。例如:

  private WebDriver driver;

  @BeforeSuite

  public void setUp(){ driver = new ChromeDriver(); }

  @AfterSuite

  public void tearDown(){ driver.quit(); }

  7. StaleElementReferenceException

  当DOM中不再存在程序所需的元素时,Selenium将抛出StaleElementReferenceException。当然,如果DOM未能被正确加载、或WebDriver被卡在错误的页面上时,也可能会产生这种异常。对此,您可以使用catch块捕获该异常,并且使用动态的XPath、或尝试着重新刷新页面。例如:

  try { driver.findElement(By.xpath(“//*[contains(@id,firstname’)]”)).sendKeys(“Aaron”);

  } catch(StaleElementReferenceException e){

  System.out.println("Could not interact with a desired element")}

  8. TimeoutException

  当WebDriver超过了执行下一步的等待时限时,Selenium中可能会产生此类异常。Selenium的各种等待通常被用于避免出现ElementNotVisibleException之类的异常。不过,即使在使用了适当的等待之后,如果元素仍然不可交互,那么TimeoutException也会被抛出。为此,我们必须通过执行手动测试,来检验元素的延时性,以便采取进一步的处理等待。

  9. InvalidSelectorException

  当使用无效的或不正确的选择器时,Selenium中会抛出此类异常。当然,类似情况也可能发生在创建XPATH时。对此,我们需要在将代码推送到主分支之前,检查测试脚本,并测试脚本的端到端流程。此外,SelectorHub和ChroPath等工具,也可以被用于验证定位器。

  10. NoSuchFrameException

  NoSuchFrameException属于NotFoundException类的子类。当WebDriver尝试着切换到当前网页上无效的、或不存在的框架时,Selenium可能会产生此类异常。为此,我们需要首先确保框架的名称或id是正确的;其次,应确保框架的加载不会过于消耗时间。当然,如果在网页上加载框架的确非常耗时的话,则需要修正相应的等待处理。例如:

  try {

  driver.switchTo().frame("frame_1"); } catch(NoSuchFrameException e){

  System.out.println("Could not find the desired frame")

  }

  小结

  综上所述,为了适应各种场景,异常处理对于任何自动化脚本和逻辑结构都是至关重要的。请您务必在了解每个异常特征的基础上,有选择性地在自动化脚本中使用上述十种有关Selenium的常用异常处理命令。

你需要知道的有关Selenium异常处理的都在这儿相关推荐

  1. 全程干货,requests模块与selenium框架详解

    requests模块 前言: 通常我们利用Python写一些WEB程序.webAPI部署在服务端,让客户端request,我们作为服务器端response数据: 但也可以反主为客利用Python的re ...

  2. linux selenium_爬虫界又出神器|一款比selenium更高效的利器

    提起selenium想必大家都不陌生,作为一款知名的Web自动化测试框架,selenium支持多款主流浏览器,提供了功能丰富的API接口,经常被我们用作爬虫工具来使用.但是selenium的缺点也很明 ...

  3. SpringBoot自适应异常处理

    效果演示 我们先来看一下Springboot的默认效果 浏览器访问 客户端访问 划重点!!! 但是绝大部分公司的代码,都是没做自适应处理的,很大一部分原因在于,你在网上搜索Springboot全局异常 ...

  4. 激活手表显示无法登陆服务器,在Firefox中使用Nightwatch运行测试无法连接到Selenium服务器...

    我正在尝试使用Nightwatch.js对网站进行自动测试,而我正在使用macOS High Sierra . 所以我开始使用文档中所述的Selenium Standalone Server进行测试 ...

  5. python异常处理类源码_Flask源码异常处理问题

    Flask version: 0.3 我事先在views.py里面定义了如下的异常处理方法: @app.errorhandler(404) def page_not_found(): return & ...

  6. MIPS中的异常处理和系统调用【转】

    转自:http://blog.csdn.net/jasonchen_gbd/article/details/44044091 权声明:本文为博主原创文章,转载请附上原博链接. 异常入口 系统调用是用户 ...

  7. 在Python中用Selenium执行JavaScript

    Selenium自己不带浏览器, 需要与第三方浏览器结合在一起使用.例如在Firefox上运行Selenium. PhantomJS是一个"无头"浏览器. 它会把网站加载到内存并执 ...

  8. Struts 声明式异常处理和个性化异常处理(转)

    首先我们的国际化资源文件中有 user.not.found = 用户不能找到,用户名称=[{0}] user.password.error = user.password.error 第一种 声明式异 ...

  9. Spring MVC之异常处理

    2019独角兽企业重金招聘Python工程师标准>>> Spring MVC之异常处理 Spring MVC提供了几种异常处理的方法: 对于每个异常类的处理 对于每个@Control ...

最新文章

  1. Win95架构师发布移动设备富媒体文档创建平台
  2. hdu6376 度度熊剪纸条 思维
  3. 宝塔控制面板创建ftp后链接不上的解决方法
  4. MongoDB在windows服务器安装部署及远程连接MongoDB
  5. 微软中国发布“IE8浏览器性能解密”,为金山网盾辟谣
  6. [BUUCTF-pwn]——[第六章 CTF之PWN章]stack
  7. Ubuntu gnome 14.10下MySQLdb安装
  8. 在东岸听刘元演奏萨克斯
  9. 实现内、外网同时访问
  10. linux cp后文件变大,使用 rsync 复制大文件的一些误解 | Linux 中国
  11. 用 Anaconda 完美解决 Python2 和 python3 共存问题
  12. php 防止不登录进入后台,php后台如何避免用户直接进入方法实例
  13. Visual Studio Code是什么
  14. 摩托罗拉投资Android社交游戏拓荒商Moblyng
  15. 无需拆机,Kindle 全系列 5.12.2.2 ~ 5.14.2版本如何越狱?如何安装第三方插件
  16. python 曲线拟合 画图+公式
  17. ppt模板如何制作个性人物海报?
  18. 智能扫地机器人陀螺仪导航
  19. python画五角星和六角星程序_python画五角星和六角星程序
  20. Xilinx AXI GPIO学习笔记以及问题点

热门文章

  1. oracle自动分区maxvalue,分区表中的maxvalue参数设置-Oracle
  2. eclipse取消不了多行注释_Eclipse常用快捷键
  3. pandas使用pct_change函数计算数据列的百分比变化:计算当前元素和前一个元素之间的百分比变化(包含NaN值的情况以及数据填充方法)
  4. R语言gc函数垃圾回收实战
  5. Keras构建前馈神经网络并使用callbacks输出acc以及loss曲线(训练接、验证集)及效果可视化
  6. KDT 对比 DDT 小栗子
  7. 胡想——对机器人控制体系的一些想法
  8. The Third Revolution in Sequencing Technology 测序技术的第三次革命
  9. saccharomyces_cerevisiae 酿酒酵母
  10. 实验七:层叠样式表(二)