Pywinauto - Альтернативы для двойного щелчка
В настоящее время я использую Pywinauto вместе с Behave для тестирования настольного приложения, и я столкнулся с дорожным ударом. в какой-то момент в моей автоматизации мне нужно использовать двойной щелчок, в настоящее время у меня это работает так:
@step("User selects {row} in Multi payment window")
def step_impl(context, row):
"""
:param row: that we are going to fill.
:type context: behave.runner.Context
"""
tries = 5
for i in range(tries):
try:
context.popup[str(row)].click_input(button='left', double=True)
except:
if i < tries - 1: # i is zero indexed
continue
else:
break
Работает отлично! но если я не присутствую или машина открыта, это вызовет проблемы, потому что я использую click_input (), поэтому я попытался использовать click (double = True), но, похоже, он не может щелкнуть по нему, что я могу сделать, чтобы обойти это?
Это результат запуска print_control_identifiers (), элементы, которые я пытаюсь дважды щелкнуть, это строка 0 и строка 1, они являются пользовательскими элементами.
1 ответ
Это очень низкий уровень и пытается эмулировать двойной клик в winapi. Может быть, есть более идиоматические способы сделать это.
Смотрите код здесь и объяснение фактической последовательности событий здесь:
Двойной щелчок левой кнопкой мыши создает последовательность из четырех сообщений: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK и WM_LBUTTONUP.
Я извлекаю дескриптор окна, используя app.windows()[0].handle
затем создать HwndWrapper
из этого HwndWrapper(handle)
а затем позвоните HwndWrapper.double_click
:
from pywinauto import Application
from pywinauto.controls.hwndwrapper import HwndWrapper
app = Application(backend='uia').start(r'MFCApplication1.exe')
HwndWrapper(app.windows()[0].handle).double_click()
app.kill()
затем обертка воспроизводит последовательность.
Это работает, даже если ваше окно не видно.