【问题标题】:How to Identify "Flash Message" Error displayed on the page如何识别页面上显示的“Flash Message”错误
【发布时间】:2016-08-05 20:24:29
【问题描述】:

我正在从事自动化测试。在我们的应用程序中,所有错误消息都会在页面顶部显示为“Flash 消息”,它会显示几秒钟。这些消息在点击页面上的“下一步”按钮或“提交”按钮后出现。

要找到那个元素,这是不可能的。因为元素路径只会在那一刻显示。我们无法验证。

当显示该错误时,我复制了错误的html,html如下:

<document>
  <html class="no-js" dir="ltr">
  <!--<![endif]-->
    <head>
     <body class="alert-open alert-with-am-fade-and-slide-top">
       <div class="page-wrapper">
          <spinner-overlay>
           <navbar-panel class="ng-scope">
           <div class="container-main">
              <alerts-container class="alert-container">
                <div class="alert ng-scope top am-fade-and-slide-top alert-danger" ng-class="[type ? 'alert-' + type : null]" style="display: block;">
                 <!-- ngIf: dismissable -->
                 <!-- ngIf: content | isArray:false -->
                 <div class="ng-scope" ng-if="content | isArray:false">
                      <strong class="ng-binding" ng-bind="::title">Error[![enter image description here][1]][1]</strong>
                       <span class="ng-binding" ng-bind-html="content"/>
                 </div>
              <!-- end ngIf: content | isArray:false -->
           <!-- ngIf: content | isArray -->
             </div>
             </alerts-container>
              <!-- /page wrapper -->
       </div>

元素路径如下:

html/body/div[1]/alerts-container/div/div

请看附图。

请帮助我如何通过 Selenium Script 进行验证,是否显示此错误。

谢谢 萨拉达

【问题讨论】:

    标签: selenium


    【解决方案1】:

    我想到的办法是使用browser.executeScript()函数观察目标元素的作用域(使用angular.element().scope()获取作用域)

    一旦 $watch 被触发,你就知道是时候检查你的 div 是否存在了。

    **更新:**这里是一个示例,展示了如何使用 Selenium webdriver 执行 javascript sn-p:https://www.mkyong.com/selenium/how-to-execute-javascript-in-selenium-webdriver/

    angularJs是一个javascript框架,所以,在上面的例子中,如果你去一个有angular的页面,那么你可以使用angular。

    driver.executeScript('var element = document.querySelector(".page-wrapper .alert-container"); \
       var scope = angular.element(element).scope(); \
       window.MyDivIsShown = false; \ 
       window.MyDivWatch = scope.$watch(content,function(n,o){ \
           window.setTimeout(function(){ \
              if(n) \
                window.MyDivIsShown = !!document.querySelector(".alert-container strong") \
       },100);');
    

    这将在内容更改时设置标志的范围添加一个监视。该更改将在 alert-container div 下显示 strong 元素或不显示,并将反映在标志中。 所以,接下来你要做的是使用 selenium 执行一个应该显示 div 的操作,并读取标志:

    performActionThatshouldDisplayAlert();
    driver.sleep(2000); //couple of seconds
    var returnValue = driver.executeScript("window.MyDivWatch(); \
        return window.MyDivIsShown;");
    expect(returnValue).to.beTruthy();
    

    注意几个技巧:

    • 我使用了 setTimeout,这样 div 就有时间显示,并且可以完成摘要循环。您可能需要增加 100 毫秒的时间间隔。
    • 我在测试结束时清除了示波器手表。
    • 在我们的测试中,我们需要等待一切安定下来。根据您使用的语言,您可能需要执行driver.sleep() 以外的其他操作以等待检查标志。

    我希望它向您展示了可以做的事情的症结所在。搜索一下以了解如何在 webdriver 中针对您使用的语言运行 executeScript,如何使其等待一段时间,以及根据您的测试的断言框架,如何测试返回值是 true 还是 false (我相信你知道大部分,如果不是全部的话)。

    【讨论】:

    • 非常抱歉,我没有完全理解您的回答。你能详细解释一下吗?
    • 我的另一个问题是,我们是否可以在 selenium webdriver 中使用 angularjs?
    • 答案比评论长,我会编辑主帖
    猜你喜欢
    • 2021-11-08
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    相关资源
    最近更新 更多