Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    OtorioO
    @OtorioO
    Добрый день! Подскажите, возможно ли вывод функции dump_tree и прочих с юникодом в массиве превратить в читаемые русские буквы?
    Button - ''    (L124, T128, R179, B168)
      | ['Button9', u'\u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a \u0442\u0438\u043f\u043e\u0432 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044fButton5']
       | child_window(auto_id="deleteButton", control_type="Button")
    Oleg
    @eratheo
    Моя попытка, естественно, не сработала, ибо всплывающее диалоговое окно блокирует всё. Другой вариант - .select() элемента в итоге приводит к _ctypes.COMError. Его реально выловить с помощью try / except? Если уменьшить время ожидания с помощью wait_until_passes...
    Yaroslav
    @2yar2
    Привет! Я только начинаю осваивать pywinauto. Хочу автоматизировать приложения на QT 5.15
    НАчал искать инспекторы, которые работают и показывают полное дерево приложений. Перепробовал штук 5. Но таких не нашлось(
    Нашел прекрасное приложение SWAPY. Но и оно тоже не работает(не видит) дерево приложений(((
    Может быть кто-то сталкивался с подобной проблемой?
    Возможно ли обновить SWAPY, что-бы он поддерживал QT 5.15 ?
    Ринат Карпатович
    @zhetkynshekov
    Здравствуйте, мне нужна помощь по pywinauto, только начал его использовать. Проблема в том что, я не могу увидить дочерние элементы программы кроме одного, это тайтла проги. Прога ncalayer, работаю на питон.
    Посмотрел в Spy++ тоже ничего не видит
    Vasily Ryabov
    @vasily-v-ryabov

    Всем привет. Извиняюсь, давно не заходил в чат, постоянно перегружен. Сейчас попробую ответить большинству тех, кто писал в чат за последний год. :)

    @AnchutkaProsto хорошее предложение! Мы завели feature request: pywinauto/pywinauto#1126 Если всё ещё актуально, можно просто взять .wrapper_object() вместо клика, например, и этот враппер преобразовать к uia_controls.ToolbarWrapper. Это должно временно решить проблему.

    Vasily Ryabov
    @vasily-v-ryabov
    @Vankalif насколько я помню, в настройках сервиса можно поставить галочку "давать доступ к GUI" (как автоматически такой сервис создать - не знаю, не пробовал), но по факту это скорее всего не работает, и надо без сервисов как-то. pythonw.exe не пробовал. Кстати, вместо целого экрана текста проще было добавить одну строчку на pywinauto: from pywinauto import Desktop; titles = [w.window_text() for w in Desktop(backend="win32").windows()].
    Vasily Ryabov
    @vasily-v-ryabov
    @zhetkynshekov окно с настройками NCA Layer отлично видно в Inspect.exe. Это часть Windows SDK. В крайнем случае можно использовать py_inspect.py (соседний репозиторий посмотрите в организации pywinauto на гитхабе). Ну, и объект Application(backend="uia") надо с нужным бэкендом создавать. Читайте Getting Started Guide или найдите видео про pywinauto на Хабре.
    @2yar2 для вас то же самое. См. предыдущий ответ.
    @OtorioO на это есть бага / фича реквест: pywinauto/pywinauto#1045 Пока руки не дошли до него. В новом мажорном релизе будет. Только пока непонятно, когда по срокам. Вряд ли раньше весны, но может и ещё дольше.
    @eratheo сам пока ни разу пробовал модуль multiprocessing, так что подсказать не смогу, к сожалению. Когда дойдут руки, ковырну глубже.
    Квасок
    @Kvacdopil_twitter
    Может кто есть еще тут живой. Меня просят пересесть с тестов фронта на тесты win приложения и рекомендовали pywinauto, только вот я сходу не могу сделать по аналогии с фронтом: когда ты отдельно пишешь фикустуры, отдельно все элементы и потом уже только в тестах что-то делаешь. Нет ли какого-то самого простого примера pywinauto под базовую струкруты проекта по аналогии как это делают для фронта обычно?
    Vasily Ryabov
    @vasily-v-ryabov
    @Kvacdopil_twitter а что для тестов фронта используете? pytest? Я лично фронт ни разу не тестировал, поэтому примеров таких с ходу нет. Если покажете, как это выглядит, то будет хотя бы понятна суть вопроса.
    Vasily Ryabov
    @vasily-v-ryabov
    В pywinauto есть WindowSpeification - аналоги локаторов селениумовских. Вот их и можно прописать в фикстурах, видимо. Для этого нужно доки почитать и поиграться. Вот эта дока точно маст хэв: https://pywinauto.readthedocs.io/en/latest/getting_started.html
    Квасок
    @Kvacdopil_twitter
    @vasily-v-ryabov первая ссылка под рукой https://github.com/archick12/python_automation . И да, pytest используется. Была идея в теории: сделать фикстуру, где идет запуск/соединение с приложением (которое тестят), а в src описать все нужные элементы, а соответственно в тестах уже использовать то, что нужно. Пока столкнулся с проблемой, что пока я в src не укажу приложение, с которым надо соединиться, то тесты падают или методы (например кликнуть) не работают
    Vasily Ryabov
    @vasily-v-ryabov
    Ну да, обычно приложение нужно. Но есть и другой способ: использовать Desktop(backend="uia") вместо Application(backend="uia"). Тогда не нужно делать start(...) или connect(...). Но десктоп видит сразу все экземпляры приложений, что может вызвать конкуренцию и работу не с тем экземпляром.
    Askalion
    @Askalion
    Привет. Возникла проблема при работе через vdi, при долгом ожидании окна пользователь успевает разлогиниться. Есть способ залогинится обратно, через скрипт? Видел подобную реализацию в UFT
    Квасок
    @Kvacdopil_twitter
    Вопрос: можно ли как-то получить hint кнопки/элемента? Хинт отображается только при наведении курсора и в print_control текста хинта нет
    Vasily Ryabov
    @vasily-v-ryabov
    Для тулбара можно получить tooltip_texts(), по остальным .move_mouse_input(), дождаться тултипа и искать либо на топ уровне (особенно для “win32” бэкенда), либо непосредственно чайлд у окна.
    VDI - как любое другое приложение должно автоматизироваться. Если 2-факторного входа нет, то наверняка все можно. Код за других писать времени нет, уж пардоньте.
    aBigway
    @aBigway
    Здравствуйте! А как реализовано взаимодействие с паттерном Value Value , backend='uia'? Есть возможность вводить значение в поле с типом Edit программно, а не через type_keys? Пробовал получать legacy_properties и менять свойство Value, но в скрипте и в поле ничего не происходит
    Vasily Ryabov
    @vasily-v-ryabov
    @aBigway Добрый день. Если .wrapper_object() возвращает EditWrapper, то у него должны быть методы .get_value() и .set_value("text"). Если он не распознался как EditWrapper, то можно сделать так: .iface_value.SetValue("text") Конечно, если для данного элемента реализован ValuePattern на стороне приложения.
    Проверить это можно в Inspect.exe (который в Windows SDK), там после выбора элемента надо открыть меню Actions и выбрать ValuePattern.SetValue, ввести и попробовать применить. Если через Inspect.exe это не сработает, значит и pywinauto не сможет, что логично.
    Meghrikyan
    @Meghrikyan
    Добрый день, выдает ошибку: import pywinauto
    C:\web3\Python310\lib\site-packages\pywinauto__init.py:71: UserWarning: Apply externally defined coinit_flags: 0
    warnings.warn("Apply externally defined coinit_flags: {0}"
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "C:\web3\Python310\lib\site-packages\pywinauto\
    init.py", line 87, in <module>
    from .sysinfo import UIA_support
    File "C:\web3\Python310\lib\site-packages\pywinauto\sysinfo.py", line 44, in <module>
    import comtypes # noqa: E402
    File "C:\web3\Python310\lib\site-packages\comtypes\
    init__.py", line 375
    except COMError, err:
    ^^^^^^^^^^^^^
    SyntaxError: multiple exception types must be parenthesized
    Подскажите пожалуйста в чем секрет.
    Vasily Ryabov
    @vasily-v-ryabov
    @Meghrikyan это проблема comtypes и нового setuptools. Если откатить setuptools до версии меньше 57.5.0 и заново переустановить comtypes, то должно заработать. Или подождите релиза comtypes==1.1.11 на этой неделе. Смогу его выпустить в пятницу скорее всего.
    Meghrikyan
    @Meghrikyan
    @vasily-v-ryabov Спасибо большое за ответ. Мне спешить некуда, я только учусь. И до конца месяца подожду.
    Vasily Ryabov
    @vasily-v-ryabov
    @Meghrikyan можно обновлять: pip install -U comtypes
    Meghrikyan
    @Meghrikyan
    Спасибо!
    Meghrikyan
    @Meghrikyan

    @Meghrikyan можно обновлять: pip install -U comtypes

    всё заработало, еще раз спасибо, пошёл пробовать новый инструмент. вернусь с вопросами

    Evgenii
    @EvgeniiBiriukov

    Василий, приветствую! Это круто, что есть такой инструмент для Python для автоматизации десктопа!

    Но, прошу помочь хоть чем-то с проблемой поиска элементов.
    Автоматизирую приложение следующим образом:

    1. Открываю главное окно. Здесь все ок и print_control_identifiers показывает все, что нужно
    2. Нажимаю на контрол и title окна меняется. Но, теперь ни одного дочернего элемента нет! Перепробовал все, что мог.

    В чем может быть причина?

    image.png
    Выше это мой код
    image.png
    А, в результате только родительский элемент
    Уже несколько дней сижу с этой проблемой, но пока результата не могу добиться
    Vasily Ryabov
    @vasily-v-ryabov
    @EvgeniiBiriukov привет. Могу предположить, что иерархия элементов размазана по нескольким процессам. Если Inspect.exe из Windows SDK показывает все элементы, то можно попробовать зайти через объект Desktop(backend="uia") вместо Application, остальное всё то же самое, только коннект не нужен, ясное дело. Если же Inspect.exe в режиме "UI Automation" (надо переключить с дефолтного MSAA) не видит элементы, то pywinauto тоже тут бессилен. Они используют тот же системный UIAutomationCore.dll. И тогда вопросы только к разработчикам приложения, почему не поддержали его на стороне приложения.
    igvfx
    @igvfx

    Привет столкнулся со следующей проблемой:
    Приложение всегда запускается с двумя окнами в одном процессе: одно - терминал, второе - UI
    Смотрю в process hacker:
    Если UI свернуто, то window title меняется на имя терминала.
    Если запускаю еще один инстанс приложения и разворачиваю UI, то title первого процесса меняется на title второго.
    Тут и запутался. Соответственно, мой код работает, если UI уже в фокусе.
    Записал видео cloud.mail.ru/public/H4Q1/fHcQGaWLX

    ```

    from pywinauto import Application

    SCRIPT_NAME = "EP100_SQ010_SH014.v001.nk"

    app = Application(backend="uia").connect(best_match = SCRIPT_NAME).window(class_name='Foundry::UI::DockMainWindow')
    app.set_focus()
    node_graph = app.by(name='Node Graph', control_type='TabItem')
    node_graph.click_input()
    ` ``

    вывод dump_tree: pastebin.com/wHVUPDCk

    Vasily Ryabov
    @vasily-v-ryabov
    @igvfx, привет. Мне кажется, тут надо запоминать pid'ы процессов для каждого конкретного окна, и делать отдельные инстансы типа app1 и app2. Допустим, сделали Application().start(...) и .connect(...) для первой пары процессов, затем запустили и подконнектились ко второй паре. А дальше спецификация окна типа app2.by(name="...") привязана к конкретному процессу автоматически, т.к. форкается от app2, а не от app1. Ну, а смена заголовка в окне - это, значит, надо менять критерии поиска для minimize() и maximize(). Что ж поделать. Ну, или по class_name искать от app2, чтобы не зависеть от заголовка. Приложение-то всё равно не перепишешь - придётся мучиться. :)
    Главное, помнить, что объект класса Application помнит только pid (атрибут app2.process). Тексты - это уровнем дальше.
    Архипов Александр
    @ArchieAlexArkhipov

    @vasily-v-ryabov , привет!) Подскажи, пожалуйста, почему такой способ получить доступ к контролу по координатам может не работать в Chrome, Yandex Browser, но работать в FireFox и др приложениях? В Chrome-like браузерах получаю Chrome_RenderWidgetHostHWND класс контрола на все окно, а в Firefox детально контрол.

    Глобально задача стоит так: при клике на какую-то кнопочку на экране записать имя кнопочки. Подзадача еще такая: запомнить несколько важных кнопочек, потом уведомлять, что важные кнопочки были нажаты.

    x, y = 100, 100 # cursor coordinates elem = pywinauto.uia_defines.IUIA().iuia.ElementFromPoint(tagPOINT(x, y)) element = pywinauto.uia_element_info.UIAElementInfo(elem) wrapper = pywinauto.controls.uiawrapper.UIAWrapper(element)

    Aleksandr Sokolov
    @avsokol
    Да потому что у Хрома внутри не windows application, а JavaScipt V8 движок со всеми вытекающими. Yandex browser - тот же хром в обертке. Ну а Firefox к этому типу не относится.
    Архипов Александр
    @ArchieAlexArkhipov
    Спасибо за ответ) можете, пожалуйста, подсказать, как лучше получить имя кнопки по координатам с учетом JavaScript V8? Кстати заметил, что при смене UI automation на MSAA в inspect.exe, то хром отлично парсится. Но как это учесть в коде не понятно
    Vasily Ryabov
    @vasily-v-ryabov
    @ArchieAlexArkhipov тут есть пример, как у Хрома включить accessibility на самой странице: https://github.com/vasily-v-ryabov/ui-automation-course/tree/master/02_google_drive_Murashov (способ работает даже на линуксе и макоси, но там пока бэкенды в pywinauto не полностью доделаны, в процессе).
    У firefox просто accessibility всегда включена по умолчанию (тоже на всех осях проверяли).
    А насчёт отслеживания кликов, то это глобальные хуки ставить можно через модуль pywinauto.win32_hooks, пример есть в https://github.com/pywinauto/pywinauto/blob/master/examples/hook_and_listen.py Ну, и метод pywinauto.Desktop(backend="uia").from_point(x, y) тоже может помочь.
    Архипов Александр
    @ArchieAlexArkhipov

    @vasily-v-ryabov спасибо за ответ! Попробовал все методы, к сожалению, не получилось решить проблему. Запускаю Chrome с флагами --force-renderer-accessibility --incognito --start-maximized , как в 02_google_drive_Murashov. Навожу курсор на любую новость, но inspect.exe отсылает меня на все окно. На фото ниже видно, что курсор указывает на новость, в дереве она есть(выделена красным), но фокус приходится на Яндекс Document(выделен желтым).
    Фото странного поведения хрома

    Ниже полная информация про Яндекс Document(выделен желтым).
    информация про Яндекс Document(выделен желтым)
    Обрезанная информация ProviderDescription: "[pid:19480,providerId:0x5C05C6 Main:Nested [pid:5560,providerId:0x5C05C6 Annotation(parent link):Microsoft: Annotation Proxy (unmanaged:UIAutomationCore.DLL); Main:Microsoft: MSAA Proxy (IAccessible2) (unmanaged:UIAutomationCore.DLL)]; Hwnd(parent link):Microsoft: HWND Proxy (unmanaged:uiautomationcore.dll)]"

    Ниже полная информация про новость(выделена красным).
     информация про новость(выделена красным)

    Чтобы добраться до нужной новости, пробовал брать детей Яндекс Document(выделен желтым), смотреть у них координаты, отбирать те, которые содержали координаты курсора. Дальше вглубь, пока не найду элемент минимальной площади, содержащий курсор. Работает почему-то нестабильно, видимо, из-за необязательно вложенной системы элементов.

    Видимо, я не понимаю, как устроена accessibility для браузеров. Подскажите, пожалуйста, по 3 вопросам:

    • Почему такое поведение наблюдается в Chrome и inspect.exe?
    • Как достичь безотказности при работе с браузерами Chrome, Yandex Browser? Чтобы при нажатии любых кнопок можно было получить их имя?
    • Как-то можно обращаться в коде к MSAA? Потому что с ним inspect.exe отлично просматривает Chrome, хотя в Yandex Browser проблема повторяется.

    Заранее спасибо!

    Vasily Ryabov
    @vasily-v-ryabov
    @ArchieAlexArkhipov по поводу отказоустойчивости, с одной стороны, это вопрос к разработчикам хрома, с другой, типичная ситуация для многих GUI приложений - это ленивая инициализация, которая обрабатывается в pywinauto всякого рода wait методами, включая app.wait_cpu_usage_lower().
    Ещё советую проверить, используется ли 64-битный inspect.exe (могут быть незначительные отличия в поведении) и 64-битный питон для pywinauto.
    Vasily Ryabov
    @vasily-v-ryabov
    Вообще, MSAA можно использовать и из pywinauto, но использование MSAA ключевых слов в child_window спецификациях добавлено только в ветке atspi для следующего мажорного релиза. А пока это только метод legacy_properties() у врапперов.