我正在尝试自动化Web应用程序。我应该点击一个链接,它会打开一个打印窗口。我无法在selenium自动化中实现这一点。所以我使用ctypes来做按键式按键,输入关键事件。下面是我为实现这一目标而开发的库。我通过调用相应的方法来完成事件。
import ctypes
import time
SendInput = ctypes.windll.user32.SendInput
# C struct redefinitions
PUL = ctypes.POINTER(ctypes.c_ulong)
class KeyBdInput(ctypes.Structure):
_fields_ = [("wVk", ctypes.c_ushort),
("wScan", ctypes.c_ushort),
("dwFlags", ctypes.c_ulong),
("time", ctypes.c_ulong),
("dwExtraInfo", PUL)]
class HardwareInput(ctypes.Structure):
_fields_ = [("uMsg", ctypes.c_ulong),
("wParamL", ctypes.c_short),
("wParamH", ctypes.c_ushort)]
class MouseInput(ctypes.Structure):
_fields_ = [("dx", ctypes.c_long),
("dy", ctypes.c_long),
("mouseData", ctypes.c_ulong),
("dwFlags", ctypes.c_ulong),
("time",ctypes.c_ulong),
("dwExtraInfo", PUL)]
class Input_I(ctypes.Union):
_fields_ = [("ki", KeyBdInput),
("mi", MouseInput),
("hi", HardwareInput)]
class Input(ctypes.Structure):
_fields_ = [("type", ctypes.c_ulong),
("ii", Input_I)]
# Actuals Functions
class KeyEvents :
def PressKey(self,hexKeyCode):
extra = ctypes.c_ulong(0)
ii_ = Input_I()
ii_.ki = KeyBdInput( hexKeyCode, 0x48, 0, 0, ctypes.pointer(extra) )
x = Input( ctypes.c_ulong(1), ii_ )
SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
def ReleaseKey(self,hexKeyCode):
extra = ctypes.c_ulong(0)
ii_ = Input_I()
ii_.ki = KeyBdInput( hexKeyCode, 0x48, 0x0002,0,ctypes.pointer(extra) )
x = Input( ctypes.c_ulong(1), ii_ )
SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
def PressAltTab(self):
'''
Press Alt+Tab and hold Alt key for 2 seconds in order to see the overlay
'''
self.PressKey(0x012) #Alt
self.PressKey(0x09) #Tab
self.ReleaseKey(0x09) #~Tab
time.sleep(2)
self.ReleaseKey(0x012)
def PressTab(self):
'''
Press Tab Key
'''
#self.AltTab()
self.PressKey(0x09) #Tab
self.ReleaseKey(0x09)
def PressEnter(self):
'''
PressEnter
'''
#self.AltTab()
self.PressKey(0x0D)#Enter Key
self.ReleaseKey(0x0D)
但是现在当我在linux中使用代码时,我得到以下错误
File "KeyEvents.py", line 4, in <module>
SendInput = ctypes.windll.user32.SendInput
AttributeError: 'module' object has no attribute 'windll'
我不明白这里出了什么问题。我是python的新手。请在这里帮助我。我应该做些什么来实现linux中的按键事件?
答案 0 :(得分:0)
我在Raspian Jessie(Raspberry Pi)上运行的代码也遇到了同样的问题。我认为这是因为windll.user32.SendInput仅适用于Windows。看起来它没有跨平台的灵活性..
如果您需要在Linux上执行Keypress事件,可以尝试使用xdotools。 我认为这非常简单,应该可以满足您的所有需求。
要安装,只需执行
sudo apt-get install xdotool
和
xdotool键alt + Tab
对于alt + Tab键按下。
有关详细信息,请参阅 http://xmodulo.com/simulate-key-press-mouse-movement-linux.html