Java技术领域,极度处置是一直充斥着程式设计本身,被频密提到的“有名”热门话题。在流程标识符继续执行的操作过程中,如若他们难以对造成的极度情况,采用及时、妥为的处置,那么很可能会导致数据服务造成极度行为或受阻。当然,标识符极度并不可悲,它非但是现代程式设计的基本重要组成部分,而且有利于开发人员知悉该在何时能、以及怎样处置什么样严重错误。上面,他们将和您探讨怎样“典雅地”处置极度,甚至利用极度处置,来科水狼更加干净、更更易保护的流程标识符。
什么是极度?
简而言之,作为流程员的一种常用名词,“极度”与任何某一的程式设计语言毫无关系。它属于流程因为忽然终止,而没能交货出预期输入的事件。一般来说,引起极度再次出现的潜在性因素往往来自如下表所示方面:
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:当流程将不恰当的HTA给方式时,可能会造成这类极度。NumberFormatException:当流程将字符串传达给难以切换为位数的方式时,可能会造成这类极度。ArithmeticException:当流程继续执行不恰当的算术运算(例如将位数除以零)时,可能会产生这类极度。
极度处置标准
通过对极度处置能力的提升,他们不仅可以保持标识符的干净,而且能够增强其可保护性、可扩展性和可阅读性。当然,不同的面向对象程式设计(Object-Oriented Programming,OOP)语言,具有不同的极度处置方式。以下是许多常用的Java极度处置标准:
Try-Catch:该关键字组合可被用于捕获极度。其中,try块应当被放在开头,而catch块应被放在try块的末尾,以便捕获极度,并采取必要的行动。也就是说,他们可以在遇到极度时,创建极度类的对象,以便使用以下预定义的方式,来显示调试信息:
printStackTrace():该函数可用于打印栈的跟踪、极度的名称、以及
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类的子类继续执行所需的操作。例如:
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(“frame1”);} catch(NoSuchFrameException e){ System.out.println(“Could not find the desired frame”)}
小结
综上所述,为了适应各种场景,极度处置对于任何自动化脚本和方法论结构都是至关重要的。请您务必在了解每个极度特征的基础上,有选择性地在自动化脚本中使用上述十种有关Selenium的常用极度处置命令。

