Транспортир не может найти элемент после загрузки страницы - PullRequest
0 голосов
/ 02 января 2019

Похоже на обычный вопрос, но не могу найти ничего, соответствующего моей проблеме.

Мой тест работает нормально, пока он не перезагрузит страницу и не должен поймать элемент из выпадающего списка.Сначала я попытался с помощью 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);

1 Ответ

0 голосов
/ 04 января 2019

Используйте by.css("h2.panel-title a") вместо by.tagName('accordion-toggle')

Решение:

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

Поскольку существует много названий панелей, приведенный выше код даст вам первый заголовок панели.
Вы можете указать значение индекса в функции get(), чтобы получить соответствующий заголовок панели.
Если вы укажите 2 в качестве индекса, например, get(2), тогда он получит 3-й заголовок панели [Индексирование начинается с 0, а не с 1].

Объяснение:

h2.panel-title a означает:

Поиск элемента тега h2, который имеет класс panel-title.После этого найдите тег a внутри HTML-кода найденного тега.


Дополнительная информация:

  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() вместо $() и $$(), то я бы предложил оставить синтаксис одинаковым и не изменять его, даже если оба синтаксиса дают одинаковый результат.

...