当前位置: 首页 > 科技观察

关于Selenium异常处理,你想知道的都在这里

时间:2023-03-13 07:56:53 科技观察

【.com快译】在Java技术领域,异常处理是一个“古老”的话题,和编程本身一样被频繁提及。在程序代码执行过程中,如果我们未能及时、妥善地处理异常情况,可能会导致应用服务出现异常或中断。当然,代码异常并不可怕,它不仅是现代编程的基本组成部分,还可以帮助开发人员知道何时以及如何处理哪些错误。接下来,我们将和大家一起探讨如何“优雅地”处理异常,甚至使用异常处理来写出更干净、更易维护的程序代码。什么是例外?顾名思义,“异常”作为程序员常用的术语,与任何特定的编程语言无关。这是程序由于突然终止而无法提供预期输出的事件。通常,导致异常的潜在因素往往来自以下几个方面:Java虚拟内存(JVM)不足请求的文件在目标系统中不存在用户提供无效数据正常通信时突然断网Java异常类型1.已检查异常:在编译过程中,编译器会检查这些异常,并验证它们是否已经被处理。如果不处理,系统会报编译错误。因此它们统称为编译时异常(compile-timeexceptions)。以下是此类异常的一些常见示例:SQLException:当程序根据SQL语法执行数据库查询时,可能会出现此类异常。IOException:当程序对文件执行无效的I/O流操作时,可能会发生此类异常。ClassNotFoundException:当JVM找不到所需的Java类时,可能会引发此类异常。2.UncheckedExceptions:这类异常是程序执行过程中发生的逻辑错误,因此常被称为RuntimeExceptions。此类异常不会在编译时检查,或者在整个编译过程中被忽略。以下是此类异常的一些典型示例:NullPointerException:访问具有空值的对象时可能会发生此类异常。ArrayIndexOutofBound:当使用无效的索引值访问数组时,可能会发生此类异常。IllegalArgumentException:当程序将不正确的参数传递给方法时,可能会出现这种类型的异常。NumberFormatException:当程序将字符串传递给无法转换为数字的方法时,会引发此类异常。ArithmeticException:当程序执行不正确的算术运算(例如将数字除以零)时,可能会出现此类异常。异常处理标准通过提高异常处理能力,不仅可以保持代码整洁,还可以增强代码的可维护性、可扩展性和可读性。当然,不同的面向对象编程(Object-OrientedProgramming,OOP)语言有不同的异常处理方式。下面是一些常用的Java异常处理标准:Try-Catch:这个关键字组合可以用来捕获异常。其中,try块应该放在开头,catch块应该放在try块的末尾,以便捕获异常并采取必要的动作。也就是说,当我们遇到异常时,我们可以创建一个异常类的对象来使用下面预定义的方法来显示调试信息:printStackTrace():这个函数可以用来打印堆栈跟踪,exception等重要的异常信息。getMessage():此函数有助于获得对异常的深入描述。try{//Code}catch(Exceptione){//CodeforHandlingexception}同时,Try-Catch块还可以使用其他高级方法来处理异常。例如,我们可能希望从单个代码块中捕获多个异常,那么我们可以在try块之后通过多个catch块来处理不同的异常。此外,我们在try块之后使用了无限数量的catch块。try{//Code}catch(ExceptionType1e1){//CodeforHandlingException1}catch(ExceptionType2e2){//CodeforHandlingException2}Throw/Throws:如果程序员想显式抛出异常,可以使用throw关键字,和运行一样结合使用时处理的异常对象。publicstaticvoidexceptionProgram()throwsException{try{//writeyourcodehere}Catch(Exceptionb){//ThrowanExceptionexplicitlythrow(b);}}如果开发者想抛出多个异常,可以在方法签名的子句中使用throws关键字。Throw,由方法的调用者来处理异常。publicstaticvoidexceptionProgram()throwsExceptionType1,ExceptionType2{try{//writeyourcodehere}catch(ExceptionType1e1){//Codetohandleexception1}catch(ExceptionType1e2){//Codetohandleexception2}finally:此代码块通常在try-catch块之后创建。也就是说,无论是否抛出异常,它都会被执行。try{//Code}catch(ExceptionType1e1){//Catchblock}catch(ExceptionType2e2){//Catchblock}finally{//Thefinallyblock一直执行。}Selenium中的常见异常WebDriverException定义了Selenium中的多种异常,我们选择介绍了最常见的异常,以及Selenium简单的异常处理方案:1.NoSuchElementException当WebDriver无法定位到需要的元素时,Selenium可能会产生这样的异常。这里的NoSuchElementException是NotFoundException类的子类,通常在程序使用了无效的定位器时出现。另外,如果WebDriver还停留在上一页,或者加载下一页,而需要的定位器已经到达下一页,也会因为这个延迟而出现异常。为此,我们应该通过适当的等待处理测试来尽量减少此类异常的发生。当然,也可以在catch块中捕获此类异常,并在其中执行所需的操作,继续进行自动化测试。例如:try{driver.findElement(By.id("form-save")).click();}catch(NoSuchElementExceptione){System.out.println("WebDrivercouldn'tlocatetheelement");}2.NoSuchWindowException异常也是NotFoundException类的子类。如果WebDriver尝试切换到无效的浏览器窗口,则WebDriver将抛出NoSuchWindowException。因此,实现窗口切换的一个好方法是先获取活动窗口的session,然后对相应的窗口进行想要的操作。例如:for(StringwindowHandle:driver.getWindowHandles()){try{driver.switchTo().window(handle);}catch(NoSuchWindowExceptione){System.out.println("Exceptionwhileswitchingbrowserwindow");}}3.NoAlertPresentException当WebDriverSelenium在尝试切换到不存在或无效的警报时可能会生成此类异常。对此,我建议开发人员使用明确或适当的等待时间来处理各种浏览器警报。如果警报仍未等待,则catch块可以捕获异常。例如:try{driver.switchTo().alert().accept();}catch(NoSuchAlertExceptione){System.out.println("WebDrivercouldn'tlocatetheAlert");}4.ElementNotVisibleException此异常定义为ElementNotInteractableException类型的子类。当WebDriver试图对不可见或无法交互的元素执行各种操作时,Selenium可能会产生此类异常。对此,我建议开发者让Selenium在真正需要的地方进行适当的超时。例如:try{driver.findElement(By.id("form-save")).click();}catch(ElementNotVisibleExceptione){System.out.println("WebDrivercouldn'tlocatetheelement");}5.ElementNotSelectableException异常属于InvalidElementStateException类的一个子类。在Selenium中,ElementNotSelectableException表示网页上虽然存在某个元素,但WebDriver无法选择该元素。catch块不仅处理Selenium中的此类异常,而且还使用相同或不同的技术重新选择相同的元素。例如:try{Selectdropdown=newSelect(driver.findElement(By.id(“swift”)));}catch(ElementNotSelectableExceptione){System.out.println(“Elementcouldnotbeselected”)}6.NoSuchSessionExceptionSelenium传递了driver.quit()command此类异常在退出自动浏览器会话后和调用测试方法时引发。当然,如果浏览器崩溃或者掉线,也有可能出现异常。为了避免NoSuchSessionException,我们可以在测试套件结束时退出浏览器,并保证用于自动化测试的浏览器版本的稳定性。例如:privateWebDriverdriver;@BeforeSuitepublicvoidsetUp(){driver=newChromeDriver();}@AfterSuitepublicvoidtearDown(){driver.quit();}7.StaleElementReferenceException当DOM中不再存在程序需要的元素时,Selenium会抛出StaleElementReferenceException.当然,如果DOM无法正确加载,或者WebDriver卡在错误的页面上,也会引发此异常。对此,可以使用catch块来捕获异常,并使用动态XPath,或者尝试刷新页面。例如:try{driver.findElement(By.xpath("//*[contains(@id,firstname')]")).sendKeys("Aaron");}catch(StaleElementReferenceExceptione){System.out.println("Couldnotinteractwithadesiredelement")}8.TimeoutException当WebDriver超过执行下一步的等待时间限制时,Selenium中可能会出现此类异常。Selenium的各种等待常用于避免ElementNotVisibleException等异常。然而,即使在使用适当的等待之后,如果元素仍然没有交互,那么TimeoutException将被抛出。为此,我们必须通过执行手动测试来检查元素的延迟,以等待进一步处理。9.InvalidSelectorException当使用无效或不正确的选择器时,Selenium会抛出此类异常。当然,在创建XPATH的时候也可能会出现类似的情况。为此,我们需要在将代码推送到master分支之前检查测试脚本并测试脚本的端到端流程。此外,SelectorHub和ChroPath等工具也可用于验证定位器。10.NoSuchFrameExceptionNoSuchFrameException是NotFoundException类的子类。当WebDriver尝试切换到当前网页上的无效或不存在的框架时,Selenium可能会引发此异常。为此,我们首先需要确保框架的名称或id是正确的;其次,我们应该确保框架的加载不会太耗时。当然,如果网页加载frame真的很耗时,就需要修复相应的等待进程。例如:try{driver.switchTo().frame("frame_1");}catch(NoSuchFrameExceptione){System.out.println("Couldnotfindthedesiredframe")}自动化脚本和逻辑结构都很关键。请务必在了解每种异常的特点的基础上,在自动化脚本中选择性地使用上述十种与Selenium相关的常见异常处理命令。原标题:AllYouNeedToKnowAboutExceptionHandlingInSelenium,作者:RamitDhamija