Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Есть angular приложение не могу понять почему не работает click на определенные элементы списка

python
angularjs
javascript
webdriver
Теги: #<Tag:0x00007f7b69909b60> #<Tag:0x00007f7b699096d8> #<Tag:0x00007f7b69909340> #<Tag:0x00007f7b69909020>

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

Не работает click не понимаю почему…
html:

<treecontrol class="tree-classic ng-isolate-scope" expanded-nodes="expandedNodes" on-node-toggle="showToggle(node, expanded, $parentNode)" options="opts" on-selection="showSelected(node,selected)" tree-model="treeData">
<ul class="ng-scope">
<!-- ngRepeat: node in node.children | filter:filterExpression:filterComparator -->
<li class="ng-scope tree-collapsed" set-node-to-data="" ng-class="headClass(node)" ng-repeat="node in node.children | filter:filterExpression:filterComparator ">
<i class="tree-branch-head" ng-click="selectNodeHead(node)" ng-class="iBranchClass()"/>
<i class="tree-leaf-head "/>
<div class="tree-label " tree-transclude="" ng-click="selectNodeLabel(node)" ng-class="[selectedClass(), unselectableClass()]">
<span class="ng-binding ng-scope">Тестовый 1</span>
</div>
<!-- ngIf: nodeExpanded() -->
</li>
<!-- end ngRepeat: node in node.children | filter:filterExpression:filterComparator -->
<li class="ng-scope tree-collapsed" set-node-to-data="" ng-class="headClass(node)" ng-repeat="node in node.children | filter:filterExpression:filterComparator ">
<!-- end ngRepeat: node in node.children | filter:filterExpression:filterComparator -->
<li class="ng-scope tree-collapsed" set-node-to-data="" ng-class="headClass(node)" ng-repeat="node in node.children | filter:filterExpression:filterComparator ">
<!-- end ngRepeat: node in node.children | filter:filterExpression:filterComparator -->
<li class="ng-scope tree-collapsed" set-node-to-data="" ng-class="headClass(node)" ng-repeat="node in node.children | filter:filterExpression:filterComparator ">
<!-- end ngRepeat: node in node.children | filter:filterExpression:filterComparator -->
<li class="ng-scope tree-collapsed" set-node-to-data="" ng-class="headClass(node)" ng-repeat="node in node.children | filter:filterExpression:filterComparator ">
<!-- end ngRepeat: node in node.children | filter:filterExpression:filterComparator -->
<li class="ng-scope tree-collapsed" set-node-to-data="" ng-class="headClass(node)" ng-repeat="node in node.children | filter:filterExpression:filterComparator ">
<!-- end ngRepeat: node in node.children | filter:filterExpression:filterComparator -->

Мой метод такой на python:

    def select_section_from_plan(self, locator, section):
        try:
            angular_not_active()(self.driver)
            element = WebDriverWait(self.driver, 10).until(
                EC.presence_of_element_located(locator)
            )
            list_of_elements = element.find_elements_by_tag_name("li")
            list_of_elements[section].click()
        except TimeoutException:
            pass

сам тест такой:

def test_check_auto_fill_event_type_russia(fill_all_service_part):
    with pytest.allure.step("Проверка выбора из списка"):
        main_mmd_page.select_section_from_plan(TablePartLocators_19_10.plan_locator, 2)

Почему то не нажимает если указать в тесте например 0 или 2, но работает когда передаю в параметр 1,3.

Как я понимаю он нажимает , потому что ошибок никаких не выдается элементы все найдены


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

Такое впечатление, что элементы есть сам клик выполняется, но на экране открывается именно если передаю параметр 1,3,4,5,6(В браузере открывается пункт на который надо нажать)


#3

Я правильно понимаю, что там, где <li> одной строкой, контент просто удален, а на самом деле внутри тоже куча тэгов, как у первого элемента?

Тогда, может быть, клик воспринимает не сам li, а какой-то элемент внутри него, <div>, например. А клик где-то отрабатывает, но это случайность.


(Vladislav Kulasov) #4

У вас событие click на элементах <i class=“tree-branch-head” ng-click=“selectNodeHead(node)”

<div class="tree-label " tree-transclude="" ng-click="selectNodeLabel(node)" попробуйте кликать на них а не на li

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

Да все 6 тегов одинаковые.Я просто открыл один из li, а так там 6 совершенно одинаковых ли только с разными span.
Я не понимаю почему на некоторые кликает на некоторые нет они же одинаковые


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

Почему событие на тегах внутри!?? Я же получаю список element.find_elements_by_tag_name(“li”) грубо говоря разделов списка и кликаю потом на него по номеру??


(Vladislav Kulasov) #7

Ну вы же когда кликаете на Body У вас же не кликаются все элементы на страницы, хотя все внутри тега body. Вообще зависит от реализации что там внутри selectNodeHead(node). Я просто предположил…


(Valentin Buryakov) #8

Возможно есть еще элементы li на странице и он кликает по ним, а не по тем которые вы предполагаете. И порядок в массиве может не соответсвовать желаемому. Посмотрите чему равен length ваших find_elements_by_tag_name(“li”) и покажите ваш локатор TablePartLocators_19_10.plan_locator, я в таких случаях использовал на JS

element.all(by.repeater('node in node.children')).get(index).click()

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

6 выдает length как и должно быть… А это на чем был код который с ngreapeter?? И куда его пихать?? Это джаваскрипт? Про js начал только читать… Пока окошки вывожу alert -том))) а тут еще надо понимать в самом фреймворке angularjs это мой следующий этап наверное)))


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

А как мне вместе скомпоновать js и python?? в python пока не силен особо… А тут js еще… Я могу это впихнуть в execute_javascript как -то так есть метод и туда параметром ваш скрипт ну или любой другой…??


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

Я пока далек от того что такое ng-reapeter и как еще по нему искать))))


(Valentin Buryakov) #12

Ну это я как пример показал, такое только в protractore можно делать, в питон никак не засунешь его.

6 выдает length как и должно быть

Тогда старнно, возможно стоит попробывать добавить ожидание перед кликом пока элемент станет Clickable.

и покажите ваш локатор TablePartLocators_19_10.plan_locator

так и не увидел


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

Завтра… Ушел уже с работы))


(Valentin Buryakov) #14

Да и попробуй сначала покликать, как подсказывали, не по самому элементу li, а по его div, span или
i. В ангуляре в репитерах часто такое, что нужно по определенному элементу клацнуть, именно тому на который клик повешен.


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

Я еще нашел какой то pytractor расширение для selenium +python. Завтра буду пробовать