Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Как лучше определить локатор данного элемента

locators
webdriver
Теги: #<Tag:0x00007fedb90d7178> #<Tag:0x00007fedb90d7038>

(Дмитрий Золкин) #1

как найти локатор??(точнее как лучше потом записать его в переменную вида var = (By.Xpath, <сюда локатор>)). Код html вот такой

Не хочется переписывать всю строку, которую выдает firepath
Кто может предложить какие варианты???
Всякие такие:
//app-project-plan-part/div/div… и тд до элемета
так же не нравятся почему-то((


(Yaroslav Pernerovskyy) #2

//i[@class=“expandicon fa fa-plus fa-minus”]
или
//div[@class=‘scheduler-wrapper’]//i[@class=“expandicon fa fa-plus fa-minus”]


(Дмитрий Золкин) #3

А если таких классов миллион на странице??Класс не уникален((


(Yaroslav Pernerovskyy) #4

тогда уточняйте ближайшими родителями
или цепляйтесь к тексту


(Maxim Andryushchenkov) #5

Вот меня всегда поражали такие задания по скрину) Вам никто не даст нормальный ответ. Нужен полный код.
С чего начинается написание гибкого xpath пути? Правильно - с определения и разделения сущностей на классы эквивалентности. Затем мы выделяем нужную нам сущность, цепляемся за нее первым xpath компонентом, а потом продолжаем написание xpath пути вплоть до элемента.
Иначе, если вы будете цеплятся только за отдельные элементы - будете находить по одному xpath пути по 10 элементов когда вам нужен один


(Дмитрий Золкин) #6

Полный код я не могу дать, поэтому дал кусок


(Yaroslav Pernerovskyy) #7

По тому куску вам ответили )))


(Maxim Andryushchenkov) #8

Ну раз скрины с кусками кидает, то можно еще посоветовать цепляться всегда к тексту)) Можете создать себе вот такой локатор //*[.=‘Text’] и не будете горя знать))


(Дмитрий Золкин) #9

Спасибо, а чем плох такой локатор?))Тем, что “Текст” будет еще где-то он найдет все вхождения ???


(Maxim Andryushchenkov) #10

Тем что элементов на странице с именно таким текстом может быть вагон. Ну и поиск такого элемента занимает больше времени по сравнению с нормальными локаторами.


(Дмитрий Золкин) #11

а какой нормальный локатор???Тут везде одни и те же классы, к названию класса прицепиться я не смог. Что надо цепляться к app-project-plan-part??? как я понимаю он как то еще уникален и идти ниже?


(Maxim Andryushchenkov) #12

Который единообразно представляет элемент на странице. Вам надо уцепиться за сущность, в которой искомый элемент определяется однозначно и составить так: //локатор_сущности//локатор_элемента


(Дмитрий Золкин) #13
<document>
    <html>
    <head>
    <body>
    <ui-view ng-version="4.4.4">
        <!---->
        <my-testing-app class="">
            <app-topbar _nghost-c0="">
                <div class="layout-main-content">
                    <ui-view>
                        <!---->
                        <app-project-plan-part class="" _nghost-c2="">
                            <div class="ui-g parent-height" _ngcontent-c2="">
                                <div class="ui-g-3 parent-height" _ngcontent-c2="">
                                    <div class="ui-g-9 parent-height" _ngcontent-c2="">
                                        <div class="main-wrapper" _ngcontent-c2="">
                                            <div _ngcontent-c2="">
                                                <div class="shedule-header" _ngcontent-c2="">
                                                    <div class="scheduler-wrapper" _ngcontent-c2="">
                                                        <scheduler _ngcontent-c2="" _nghost-c4=""
                                                                   ng-reflect--context-menu="[object Object],[object Object"
                                                                   ng-reflect--system-menu="[object Object]"
                                                                   ng-reflect-legend-object="[object Object]"
                                                                   ng-reflect-ovu-list="[object Object]"
                                                                   ng-reflect-task-list="[object Object]"
                                                                   ng-reflect-options="[object Object]">
                                                            <div class="scheduler-wrapper" _ngcontent-c4="">
                                                                <p-tieredmenu _ngcontent-c4="" popup="popup"
                                                                              ng-reflect-model="[object Object],[object Object"
                                                                              ng-reflect-popup="popup">
                                                                    <div class="labels" _ngcontent-c4="">
                                                                        <div class="schrow time-labels"
                                                                             _ngcontent-c4=""/>
                                                                        <!--bindings={ "ng-reflect-ng-if": "false" }-->
                                                                        <ul class="schedule-person-list"
                                                                            _ngcontent-c4="">
                                                                            <!--bindings={ "ng-reflect-ng-for-of": "[object Object]" }-->
                                                                            <li _ngcontent-c4="" person-item=""
                                                                                ng-reflect-person="[object Object]">
                                                                                <div class="schrow schedule-person"
                                                                                     ng-reflect-klass="schrow schedule-person"
                                                                                     ng-reflect-ng-class="[object Object]"
                                                                                     style="padding-left: 5px;">
                                                                                    <!--bindings={ "ng-reflect-ng-if": "true" }-->
                                                                                    <ul>
                                                                                        <!--bindings={ "ng-reflect-ng-for-of": "[object Object]" }-->
                                                                                        <li person-item=""
                                                                                            ng-reflect-person="[object Object]"
                                                                                            ng-reflect-init-pos="25">
                                                                                            <div class="schrow schedule-person"
                                                                                                 ng-reflect-klass="schrow schedule-person"
                                                                                                 ng-reflect-ng-class="[object Object]"
                                                                                                 style="padding-left: 25px;">
                                                                                                <!--bindings={ "ng-reflect-ng-if": "true" }-->
                                                                                                **<i class="expandicon fa fa-plus fa-minus"**
                                                                                                   ng-reflect-klass="expandicon fa fa-plus"
                                                                                                   ng-reflect-ng-class="fa-minus"/>
                                                                                                <div class="person-label">
                                                                                                    СФ
                                                                                                </div>
                                                                                            </div>
                                                                                            <!--bindings={ "ng-reflect-ng-if": "true" }-->
                                                                                            <ul>
                                                                                                </li>
                                                                                            </ul>
                                                                                        </li>
                                                                                    </ul>
                                                                                </div>
                                                                                <div class="schedule-area-container"
                                                                                     _ngcontent-c4="">
                                                                                    <p-toolbar _ngcontent-c4="">
                                                                                </div>
                                                        </scheduler>
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                        </app-project-plan-part>
                        <!--bindings={ "ng-reflect-ng-if": "false" }-->
                    </ui-view>
                </div>
                <msg-module _nghost-c1="">
        </my-testing-app>
        <!--bindings={ "ng-reflect-ng-if": "false" }-->
        <dialog-holder>
    </ui-view>
    <script src="conf.js" type="text/javascript"/>
    <script src="polyfills.dll.js" type="text/javascript"/>
    <script src="vendor.dll.js" type="text/javascript"/>
    <script src="app.js" type="text/javascript"/>
    </body>
    </html>
</document>

Вот целый код станицы… как бы вы написали локатор который находит нужный элемент???Подскажите пожалуйста. С текстом я понял получиться потому, как не странно он тут один))
Найти текст и подняться вверх на 1 и нажать на него я тоже смогу… Просто интересно как бы кто то еще написал


(Maxim Andryushchenkov) #14

Навскидку:
//div[contains(@class, ‘schedule-person’)]/i/div/…
//div[@class=‘person-label’]/…

Но, может и еще есть получше путь. Для вашего примера катит.


(Дмитрий Золкин) #15

Спасибо


(Bolatbek) #16

Это ж - ангуляр.
У вас не протрактор?


(Дмитрий Золкин) #17

Нет. Я её знаю Javascript. А протрактор на js.


(Сергей Кузьмин) #18

попробуйте java /.net / python порты протрактора и сможете искать по binding model repeater и т.д.


(Дмитрий Золкин) #19

спасибо поставил pytractor. Буду пробовать


(Dmtry) #20

Теска, pytractor не поможет составлять грамотно локаторы(

Локатор должен отражать сущность, разработчики ‘тоже люди’ они обращаются к элементу из кода поэтому где то рядом должно быть что то осмысленное, отражающее функционал, за него и цепляемся. В идеале посмотрев на локатор можно понять что это за элемент.
В вашем случае как я понял это какая то персона в списке и у него какой то функциональный элемент
вот на него css li[person-item] i таких элементов 5 на странице, берите их как List это в будущем позволит выбирать любую персону как person.get(0), из списка или например рандомно в автотесте выбирать постоянно разную строку. Если очень хочется то li[person-item] i:nth-child(1) вот так можно первый достать.

Не брезгуйте css, xpath,- это оружие которое нужно в гораздо более тяжелых случаях.