我正在开发一个自动化程序,以检查/测试第三方应用程序中的内容。目前,我将使用pyautogui突出显示和复制值(至少直到我们可以访问查询应用程序数据库为止),然后使用tkinter从剪贴板中检索数据。
下面的脚本用于复制可以在屏幕上突出显示的内容(在脚本的#get manager部分下)。
但是,当我导航到具有文本正文的部分时(#QAR测试2),请使用pyautogui.hotkey(“ Ctrl”,“ a”)突出显示所有内容,并使用pyautogui.hotkey(“ Ctrl”,“ c “)进行复制,似乎剪贴板上没有填充(由于尝试打印已分配给它的变量时出现错误消息)。
作为参考,我附上目标文本的屏幕截图。文本(尤其是段落)不能复制到剪贴板吗?
#QAR测试2之后引发的错误消息是:
HKEY_CURRENT_USER\Software\Microsoft\Office\<version>.0\Outlook\Security
Traceback (most recent call last):
File "C:/Users/haudrxr/Downloads/PCA_5_5_18_QAR.py", line 92, in <module>
background_tm= copy_clipboard()
File "C:/Users/haudrxr/Downloads/PCA_5_5_18_QAR.py", line 10, in copy_clipboard
clipboard = Tk().clipboard_get()
File "C:\Users\haudrxr\AppData\Local\Continuum\anaconda3\lib\tkinter\__init__.py", line 804, in clipboard_get
return self.tk.call(('clipboard', 'get') + self._options(kw))
_tkinter.TclError: CLIPBOARD selection doesn't exist or form "STRING" not defined
答案 0 :(得分:0)
根据@TerryJanReedy,该错误表明剪贴板中什么也没有,甚至没有空字符串。
因此,请先尝试在其中添加一些内容。
试试:
# View
if parent_success_obj.uid:
serializer_obj = ProviderStatusSerilaizer(
data = data,
context = {
'provider_id': parent_success_obj.uid,
'provider_status': status
}
)
# Serializer
class ProviderStatusSerilaizer(serializers.ModelSerializer):
class Meta:
model = ProviderStatus
fields= ('uid','created_by','remark','effective_date_from','effective_date_to',) # I am removing provider_id and provider_status as I will be injecting this data separately
def create(self, validated_data):
validated_data.update(self.context) # updating validated data dictionary with context dictionary
return super().create(validated_data)
答案 1 :(得分:0)
正如我的评论中所述,control-c快捷键不会立即起作用:
在尝试访问剪贴板数据之前,请尝试添加一个很小的暂停,因为键盘快捷键不是瞬时的。在另一条SO thread中找到的代码注释“ ctrl-c通常非常快,但是您的程序可能执行得更快”。
在这种情况下,我将import {faCoffee} from "@fortawesome/free-solid-svg-icons";
<FontAwesomeIcon icon={faCoffee} />
移动到剪贴板内容之前(我不知道它为什么存在的上下文),并将其简化为sleep
。 0.1s
更改后的代码如下所示:
QAR Test 2
注意:如果仍然不能解决问题,那么值得研究一种获取剪贴板内容的方法,因为许多人(比我本人经验丰富!)报告说,它返回#QAR Test 2
if windll.user32.OpenClipboard(None):
windll.user32.EmptyClipboard()
windll.user32.CloseClipboard()
pyautogui.click(262, 162) # navigates to tab with text box
pyautogui.click(614, 314) #clicks in text box
pyautogui.hotkey("Ctrl", "a")
pyautogui.hotkey("Ctrl", "c")
time.sleep(0.1)
background_tm= copy_clipboard()
print(background_tm)
print("test1")
而不是返回在某些情况下的实际内容。
答案 2 :(得分:0)
嘿,我想主要原因是您所做的错别字: 您使用了'Ctrl',即使用大写字母C的控件,由于错误处理机制,有时会接受,但并非总是如此。试试这个:
pyautogui.hotkey('ctrl','c')
或使用热键的后端方法
pyautogui.keyDown('ctrl')
pyautogui.press('c')
pyautogui.keyUp('ctrl')
并在调用此函数之前使用更多的sleep()时间,这可能是因为该程序可能运行得更快(或对此而言运行得更慢),其安全性胜过遗憾。 祝你好运
希望这会有所帮助