文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-02 18:26

关注

【51CTO.com快译】在Java技术领域,异常处理是一直伴随着编程本身,被频繁提及的“古老”话题。在程序代码执行的过程中,倘若我们无法对产生的异常情况,采用及时、妥善的处理,那么很可能会导致应用服务产生异常行为或中断。当然,代码异常并不可怕,它非但是现代化编程的基本组成部分,而且有助于开发者知晓该在何时、以及如何处理哪些错误。下面,我们将和您讨论如何“优雅地”处理异常,甚至利用异常处理,来编写出更加整洁、更易于维护的程序代码。

什么是异常?

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

Java中的异常类型

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

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

异常处理标准

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

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

  1. try 
  2. // Code 
  3. } catch(Exception e){ 
  4. // Code for Handling exception 

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

  1. try 
  2. //Code 
  3. } catch(ExceptionType1 e1){ 
  4. //Code for Handling Exception 1 
  5. } catch(ExceptionType2 e2){ 
  6. //Code for Handling Exception 2 

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

  1. public static void exceptionProgram()throws Exception{  
  2. try { 
  3. // write your code here 
  4. } Catch(Exception b){  
  5. // Throw an Exception explicitly 
  6. throw(b); } 

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

  1. public static void exceptionProgram()throws ExceptionType1, ExceptionType2{  
  2. try { 
  3. // write your code here 
  4. } catch(ExceptionType1 e1){ 
  5. // Code to handle exception 1 
  6. } catch(ExceptionType1 e2){ 
  7. // Code to handle exception 2 

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

  1. try { 
  2. //Code 
  3. } catch(ExceptionType1 e1){ 
  4. //Catch block 
  5. } catch(ExceptionType2 e2){ 
  6. //Catch block 
  7. }  finally { 
  8. //The finally block always executes. 

Selenium中的常见异常

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

1. NoSuchElementException

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

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

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

  1. try { driver.findElement(By.id("form-save")).click(); } catch(NoSuchElementException e){ 
  2. System.out.println(“WebDriver couldn’t locate the element”); } 

2. NoSuchWindowException

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

  1. for(String windowHandle : driver.getWindowHandles()){ 
  2. try { driver.switchTo().window(handle); } catch(NoSuchWindowException e){ System.out.println(“Exception while switching browser window”); } 

3. NoAlertPresentException

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

  1. try { 
  2. driver.switchTo().alert().accept(); } catch(NoSuchAlertException e){ 
  3. System.out.println(“WebDriver couldn’t locate the Alert”); } 

4. ElementNotVisibleException

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

  1. try { driver.findElement(By.id("form-save")).click(); } catch(ElementNotVisibleException e){ 
  2. System.out.println(“WebDriver couldn’t locate the element”); } 

5. ElementNotSelectableException

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

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

  1. try { 
  2. Select dropdown = new Select(driver.findElement(By.id(“swift”))); } catch(ElementNotSelectableException e){ 
  3. System.out.println("Element could not be selected")} 

6. NoSuchSessionException

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

  1. private WebDriver driver; 
  2. @BeforeSuite 
  3. public void setUp(){ driver = new ChromeDriver(); } 
  4. @AfterSuite 
  5. public void tearDown(){ driver.quit(); } 

7. StaleElementReferenceException

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

  1. try { driver.findElement(By.xpath(“//*[contains(@id,firstname’)]”)).sendKeys(“Aaron”); 
  2. } catch(StaleElementReferenceException e){ 
  3. 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是正确的;其次,应确保框架的加载不会过于消耗时间。当然,如果在网页上加载框架的确非常耗时的话,则需要修正相应的等待处理。例如:

  1. try { 
  2. driver.switchTo().frame("frame_1"); } catch(NoSuchFrameException e){ 
  3. System.out.println("Could not find the desired frame") 

小结

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

原文All You Need To Know About Exception Handling In Selenium,作者:Ramit Dhamija

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

 

来源:51CTO内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯