【问题标题】:Protractor cannot find element after page has loaded页面加载后量角器找不到元素
【发布时间】:2019-05-28 22:36:42
【问题描述】:

似乎是一个常见问题,但找不到与我的问题相对应的任何内容。

我的测试运行良好,直到它重新加载页面并需要从下拉列表中捕获一个元素。首先,我尝试使用 IsPresent 来查看 Protractor 是否可以找到名为“workbenchItems”的下拉谎言,并且我还添加了一个长时间的睡眠,但它不起作用,然后当然它也无法捕获下拉列表 - 元素我需要捕捉的最后一行叫做:'我需要捕捉的下拉列表中的元素'

在此处查看量角器代码:

<div class="workbenchItems">
    <div data-uib-accordion="" data-close-others="false" data-template- url="modules/common/accordion/accordion.tpl.html">
        <div role="tablist" class="panel-group accordion" ng-transclude="">
            <div data-uib-accordion-group="" ng-click="$ctrl.setIsOpen($ctrl.itemIndex, $ctrl.isOpen)" class="panel-default ng-scope ng-isolate-scope panel panel-open"
                data-template-url="modules/common/accordion/accordion-group.tpl.html" data-nobody="true"
                data-leveltitle="h3" data-is-open="$ctrl.isOpen">
                <div class="panel-heading no-bottom-border" data-ng-class="{'no-bottom-border': noBody}" style="">
                    <h2 class="panel-title"><a href="" tabindex="0" class="accordion-toggle" ng-click="toggleOpen()"
                            uib-accordion-transclude="heading"><span uib-accordion-header="" ng-class="{'text-muted': isDisabled}"
                                ng-bind-html="heading" class="ng-binding">
                                <div class="ng-scope"><span ng-bind="::$ctrl.item.sectionName" class="ng-binding">Element
                                        from dropdown that I need to catch</span> <span class="count ng-binding"
                                        ng-bind="::$ctrl.item.sectionCount">2159</span></div>
                            </span></a></h2>
                </div>
                <div class="panel-collapse in collapse" uib-collapse="!isOpen" aria-expanded="true" aria-hidden="false"
                    style="">

这是我试图从行中捕获第二个元素

const toolaud = await element.all(by.tagName('accordion-toggle')).get(1);
     toolaud.click();
     browser.waitForAngular();
     browser.sleep(60 * 1000);

【问题讨论】:

  • 什么是browser.waitForAngular();
  • 从这里拿来的:protractortest.org/#/… 不过没关系,即使我删除它也不起作用。也许这是某种嵌套元素问题?或者它可能是什么。刚刚用xpath试过了,也不管用..
  • tagName('accordion-toggle') 我找不到标签名称为accordion-toggle,也许没有这样的标签名称
  • @Tina86 使用element(by.css("h2.panel-title a")) 而不是element.all(by.tagName('accordion-toggle')).get(1)
  • 非常感谢萨达姆,这很有效!但是我怎样才能点击第一个呢?由于有很多面板标题..

标签: angular selenium protractor automated-tests


【解决方案1】:

使用by.css("h2.panel-title a") 而不是by.tagName('accordion-toggle')

解决办法:

element.all(by.css("h2.panel-title a")).get(0);

由于面板标题很多,上面的代码将为您获取第一个面板标题。
您可以在get() 函数中提供 index 的值来获取相应的面板标题。
如果您提供 2 作为索引,例如get(2),那么它将获得第 3 个面板标题 [索引从 0 开始而不是 1]。

说明:

h2.panel-title a 表示:

搜索具有panel-title 类的h2 标记元素。之后,在找到的标签 HTML 代码中搜索 a 标签。


附加信息:

  1. 如果只有 1 个面板标题,那么还有 1 种方法可以解决相同的问题。

    element(by.css("h2.panel-title a"));
    
  2. $$("h2.panel-title a").get(0)element.all(by.css("h2.panel-title a")).get(0) 含义相同,工作方式相同。始终最好在任何地方保持相同的语法。因此,它对其他开发人员来说变得不那么混乱了。如果您使用element()element.all() 语法而不是$()$$(),那么我建议保持语法相同而不更改它,即使两种语法产生相同的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多