使用 python 自动从 windows 文件对话框打开文件
Open file from windows file dialog with python automatically
我进行自动化测试并获得一个文件对话框。我想使用 python 或 selenium 从 windows 打开文件对话框中选择一个文件。
注意:该对话框由其他程序给出。我不想用 Tkinter 创建它。
Window 看起来像:
.
如何操作?
您可以使用 ctypes 库。
考虑这段代码:
import ctypes
EnumWindows = ctypes.windll.user32.EnumWindows
EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
GetWindowText = ctypes.windll.user32.GetWindowTextW
GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW
SendMessage = ctypes.windll.user32.SendMessageW
IsWindowVisible = ctypes.windll.user32.IsWindowVisible
def foreach_window(hwnd, lParam):
if IsWindowVisible(hwnd):
length = GetWindowTextLength(hwnd)
buff = ctypes.create_unicode_buffer(length + 1)
GetWindowText(hwnd, buff, length + 1)
if(buff.value == "Choose File to Upload"): #This is the window label
SendMessage(hwnd, 0x0100, 0x09, 0x00000001 )
return True
EnumWindows(EnumWindowsProc(foreach_window), 0)
您在每次打开时循环 window,然后将击键发送到您选择的那个。
tab
的SendMessage function gets 4 params: the window hendler (hwnd
), The phisical key to send - WM_KEYDOWN (0x0100), The virtual-key code(0x09
)和第4个参数的repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag
您还可以发送按键向上、向下按键、字符、returns 等...
使用文档寻求帮助。
我用这个作为参考:Win32 Python: Getting all window titles
祝你好运!
考虑使用 pywinauto 包。它有一个非常自然的语法来自动化任何 GUI 程序。
代码示例,在记事本中打开一个文件。请注意,语法取决于语言环境(它使用 GUI 程序中可见的 window 标题/控制标签):
from pywinauto import application
app = application.Application().start_('notepad.exe')
app.Notepad.MenuSelect('File->Open')
# app.[window title].[control name]...
app.Open.Edit.SetText('filename.txt')
app.Open.Open.Click()
我进行自动化测试并获得一个文件对话框。我想使用 python 或 selenium 从 windows 打开文件对话框中选择一个文件。
注意:该对话框由其他程序给出。我不想用 Tkinter 创建它。
Window 看起来像:
如何操作?
您可以使用 ctypes 库。
考虑这段代码:
import ctypes
EnumWindows = ctypes.windll.user32.EnumWindows
EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
GetWindowText = ctypes.windll.user32.GetWindowTextW
GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW
SendMessage = ctypes.windll.user32.SendMessageW
IsWindowVisible = ctypes.windll.user32.IsWindowVisible
def foreach_window(hwnd, lParam):
if IsWindowVisible(hwnd):
length = GetWindowTextLength(hwnd)
buff = ctypes.create_unicode_buffer(length + 1)
GetWindowText(hwnd, buff, length + 1)
if(buff.value == "Choose File to Upload"): #This is the window label
SendMessage(hwnd, 0x0100, 0x09, 0x00000001 )
return True
EnumWindows(EnumWindowsProc(foreach_window), 0)
您在每次打开时循环 window,然后将击键发送到您选择的那个。
tab
的SendMessage function gets 4 params: the window hendler (hwnd
), The phisical key to send - WM_KEYDOWN (0x0100), The virtual-key code(0x09
)和第4个参数的repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag
您还可以发送按键向上、向下按键、字符、returns 等... 使用文档寻求帮助。
我用这个作为参考:Win32 Python: Getting all window titles
祝你好运!
考虑使用 pywinauto 包。它有一个非常自然的语法来自动化任何 GUI 程序。
代码示例,在记事本中打开一个文件。请注意,语法取决于语言环境(它使用 GUI 程序中可见的 window 标题/控制标签):
from pywinauto import application
app = application.Application().start_('notepad.exe')
app.Notepad.MenuSelect('File->Open')
# app.[window title].[control name]...
app.Open.Edit.SetText('filename.txt')
app.Open.Open.Click()