- 建立檔案
ping.vbs
1 | Dim args, flag, unsuccOut |
- 建立批次檔案
ping.bat
1 | @echo off |
編程沒有什麼不好
ping.vbs
1 | Dim args, flag, unsuccOut |
ping.bat
1 | @echo off |
鬧鐘
倒計時
碼表
通用功能
1 | python 2.7 |
主程序 Frame
程序內的Label、button等都是透過座標做定位,如果程序視窗最大化將會破壞佈局,所以在Frame style選擇中不顯示”視窗最大化”按鈕。
1 | wx.Frame.__init__(self...,style=wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX | wx.TAB_TRAVERSAL) |
佈局
功能上由於是透過下拉選單來選擇,所以佈局上都是透過Show or Hide來顯示對應功能的對象。
1 | self.Label_Stopwatch = wx.StaticText(self, wx.ID_ANY, u"00:00:00", (35, 90), wx.Size(200, 40), wx.TE_CENTRE) |
定時器
主要功能核心”定時器 Timer”,創建定時器時需要為定時器綁定一個event函數,再來可以根據情況設定運行時間(例如:一秒),默認會是循環運行(每隔一秒),也可設定參數只執行一次,在循環運行過程中也可以被按鈕事件觸發停止運行。
在創建程序時先執行每1秒獲取電腦時間的定時器,鬧鐘及倒計時功能都是與系統時間比對後實現的。
1 |
|
倒計時功能
相比鬧鐘功能,倒計時在設計上不能以減一秒的方式進行判斷,由於在每次判斷都有毫秒差,時間一長就有分秒差,原先設定倒計時5分鐘的循環到後面提醒的時間將會越來越快。
因此判斷上必須將”倒數時間+當前時間”設一個end變數,每隔一秒的判斷其實就是end減當前時間,如果有自動重複功能 也是end變數加上設定的倒數時間,這樣才不會有誤差。
1 | # 設定時間加上當前時間 |
Dialog
Dialog對話彈窗,設定檔案路徑及提醒訊息,透過event呼叫的wx.Dialog,再將設定的值傳回類。
1 | def OnBeepSetting(self, event): |
Pywinauto可以控制Windows,它支持多種Windows控制,基本上可被呼叫的或可選的項目,都能找到對應的句炳並進行操作,非常好用。
Windows自動控制還有一個工具Autoit
,這非常好入門,但缺點是支持的控制項並沒有pywinauto多。
Windows 7 sp1
python 2.7
檔案下載
pywin32
檔案下載
pywinauto
1 | pip install pywinauto |
(可選)pyinstaller
打包成exe時使用
1 | pip install pyinstaller |
這邊紀錄是因為之前環境有安裝過相同依賴,但版本不同導致無法打包。
1 | altgraph==0.15 |
sky+工具能將選擇的句柄操作,生成pywinauto
代碼,直接貼上就可以用了,
安裝Atoit,這裡頭的小工具autoitinfo
可以快速查找窗口句炳。
1 | from pywinauto.application import Application |
方式一:創建pywinauto對象,開啟並連接notepad.exe程序句柄
1 | app = Application().start("notepad.exe") |
方式二:綁定啟動過程序內的新句柄
這個方法是使用pywinauto對象之下,主要是用在連接另外新開啟的dig,如:說明、開啟/另存檔案等,因為這些不能算是一個主程序。
1 | about_dlg = app.window_(title_re = u"另存为") |
方式三:綁定已開啟的程序句柄
1 | app = Application().connect(title_re = "", class_name = "") |
參數title、class_name可以透過輔助工具查看到
控制心法
程序控制
如果class有中文或字符可以在[]中輸入class_name
1 | app."class"."controls" |
程序內控制項操作
1 | app."class"."class"."controls" |
雖然app只是一個pywinauto的對象,如果要操作還是需要輸入底下connect的class才可以操作。
“class” 為透過pywinauto所開啟的class,這必須是connect過的class否則無法直接進行控制,這部份是需要注意的。
“操作” 為該程序可以控制的所有方式,具體調用方法可以參考官方文檔,由下圖可以看到官方文檔其實已經針對了不同需求,提供了方法。
1 | app."class".print_control_identifiers() |
這邊以notepad為例進行操作
1 | >>> app.notepad.print_control_identifiers() |
看到Notepad下面有Edit、StatusBar可以控制,要了解控制項的方法就必須得看文檔。
這邊是自己操作一些控制項的紀錄
TypeKeys() 輸入文字
app.notepad.Edit.TypeKeys(“1\thello,hello\rwahaha”)
SetEditText() 替換文字
app.notepad.Edit.SetEditText(“全部都被我換掉…”)
pywinauto.controls.menuwrapper
1 | >>> app.notepad.Menu().ItemCount() |
1 | >>> print app.notepad.Menu().Item(0).Text() |
先選擇上層選單,在透過SubMenu()
方法控制子選單。
類似root層級,透過固定的位置逐層選擇,該方法也適用於遍歷尋找指定選單位置。
1 | # 上層選單 "文件(&F)" - Menu().Item(0) |
選擇”另存为(&A)…” - ClickInput()
1 |
|
直接選擇已知”選單名”
1 | # 方式一的部分這邊一行就可以搞定了。 |
windows中對話框的種類非常多,可以參考下面的連結了解一下。
https://www.blog.pythonlibrary.org/2010/06/26/the-dialogs-of-wxpython-part-1-of-2/
https://www.blog.pythonlibrary.org/2010/07/10/the-dialogs-of-wxpython-part-2-of-2/
連接對話框
1 | about_dlg = app.window_(title_re = u"另存为") |
由於對話框是一個新的窗口,必須先連接後在用print_control_identifiers
查看有哪些win32_controls。
1 | about_dlg.print_control_identifiers() |
controls.common_controls.TreeViewWrapper
官方文檔中對於每一個物件都做了說明,建議操作時同時參考查閱。
1 | >>> about_dlg.SysTreeView32.ItemCount() |
1 | >>> print about_dlg.SysTreeView32.PrintItems() |
點擊
1 | >>> about_dlg.SysTreeView32.GetItem(u"\我的最愛\下載").ClickInput() |
1 | >>> about_dlg.SysTreeView32.Item(u"\桌面\電腦\本機磁碟 (C:)").ClickInput() |
先展開,再點擊
指定展開 “桌面\電腦\本機磁碟 (C:)”
1 | >>> about_dlg.SysTreeView32.GetItem(u"\桌面\電腦\本機磁碟 (C:)").Click(where = |
打印所有項目名稱
1 | >>> print about_dlg.SysTreeView32.PrintItems() |
點擊 剛剛展開”本機磁碟 (C:)”中的Python27
1 | >>> about_dlg.SysTreeView32.Item(u"\桌面\電腦\本機磁碟 (C:)\Python27").ClickInput |
整理上述實例,開始到結束。
1 | # -*- coding: utf8 -*- |
盡可能參考官方文檔查詢控制方法,找class名稱或底下控制項,可以使用autoitinfo、spy+取得名稱,開發過程使用交互模式調試非常方便。
參考
查詢DLL裡頭可以調用的方法
Download DLL Export Viewer v1.66
檔案:CameraDll.dll
DLL可以由安裝QQ(2006版)或下方直接下載獲得
QQ路經:C:\Program Files (x86)\Tencent\QQ
DLL Export Viewer
開啟CameraDll.dll
1 | import ctypes |
運行結果
檔案:PrScrn.dll
DLL可以由安裝微信獲得
微信路經:C:\Program Files (x86)\Tencent\WeChat
DLL Export Viewer
開啟CameraDll.dll
1 | import ctypes |
運行結果
啟動Runner之後需要配置.gitlab-ci.yaml文件,來定義pipeline。
項目構建需要透過pipeline來控制流程,具體配置pipeline可以參考這篇通过 .gitlab-ci.yml 配置任务。
.gitlab-ci.yml
在project中新建.gitlab-ci.yml
文件。
1 | stages: |
.gitlab-ci.yml
1 | git add . |
查看構建歷史
查看輸出日誌
WUA_SearchDownloadInstall.vbs
1 | Set updateSession = CreateObject("Microsoft.Update.Session") |
update.bat
1 | cd %~dp0 |
%~dp0:當前資料夾
雖然selenium提供很多方法瀏覽器的各種操作,但還是有些情況是需要調用JS才能夠實現的,另外調用js還有一個優點,那就是不會報錯,對於那些不穩定的元素不想用try的話,可以試試execute_script
來調用JS。
打開網頁進入谷歌
1 | from selenium import webdriver |
用js進行刪除及輸入
1 | # 刪除圖片元素 |
先用js搜索元素,再返回selenium對象
1 | # 搜索 |
標籤頁切換
這邊,以中國銀行點擊功能為例,會自動開啟新分頁。
創建selenium對象
1 | from selenium import webdriver |
訪問中國銀行,開啟功能分頁
1 | browser.get("http://www.boc.cn/") |
查看目前所有分頁的handle,而handle每次生成都會是不一樣的。
1 | handles = browser.window_handles |
遍歷所有handle1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16for h in handles:
browser.switch_to_window(h) # 切換handle
print("當前 handle: ", browser.current_window_handle)
print("當前 title: ", browser.title)
輸出:
handle: CDwindow-e10a2580-b8af-471c-a645-9265207ff5e6
title: 中国银行全球门户网站
handle: CDwindow-21cd97f5-9e7f-436e-9de1-dfdb4bd38a14
title: 海外及港澳台地区客户网银登录
handle: CDwindow-95f59ba3-cbff-424f-a739-9fd170b936ae
title: 登录
handle: CDwindow-fee5a3db-f3b2-4606-aefa-cbd42ebf3b30
title: 中国银行
handle: CDwindow-c2977923-b62a-4fbf-a4d3-51ec90f3cdd8
title: 中国银行
selenium可以模擬人的行為,好用歸好用,但如果安裝在server主機上或不想顯示GUI,那有什麼方法?
hantomJS
PhantomJS是一個真實的無頭瀏覽器,需要另外下載配置到環境變數才能使用。
下載對應的系統版本,加到環境變數中。
python module selenium
新版本已不支持PhantomJS,建議安裝3.4.2版
1 | selenium == 3.4.2 |
1 | from selenium import webdriver |
Chhome headless
Chrome V59 開始推出了headless mode,原生支持無頭環境運行Chrome,速度非常快。
1 | from selenium import webdriver |
僅適用於linux,支持
安裝方法
1 | apt-get install Xvfb |
python 控制
1 | from pyvirtualdisplay import Display |
搭建Docker Selenium 2.53.1+Firefox46的筆記,在此紀錄…
docker-compose.yml
1 | hub: |
搭建完成