2020年5月31日 星期日

Sikulix 在 mac 下的設定使用

Sikulix IDE  在 mac 使用基本上何在 Windows 下差不多,以下為設定步驟:

1. 確認是否有安裝 java:

可以在終端機界面下打以下指令確認。

java -version

如果有裝會顯示如下結果。

(base) ChundeMacBook-Pro:bin $ java -version
openjdk version "1.8.0_152-release"
OpenJDK Runtime Environment (build 1.8.0_152-release-1056-b12)
OpenJDK 64-Bit Server VM (build 25.152-b12, mixed mode)


因為 Oracle 對 Java 有一些限制,如果要避免的話,可以用 OpenJDK,可以到 OpenJDK官網下載對應 macOS / x64 的 tar.gz 檔,下載回來後執行以下指令解壓縮。

tar xf openjdk-xx.x.x_osx-x64_bin.tar.gz

解壓縮完會得到一個 jdk-xx.x.x.jdk 的目錄,在用以下指令搬到 JVM即可。

sudo mv jdk-xx.x.x.jdk /Library/Java/JavaVirtualMachines/

2.下載 Sikulix IDE 及 Jython stanalone jar 檔

在 Sikuli  官網下載頁面 ,下載上述二個 Jar 檔,並放置在同一目錄下,第一次執行前,請去 mac 系統偏好設定 ,設定安全性及隱私,允許 java 取得輔助使用螢幕錄製的使用權,如下圖所示。



設定完在 Finder中點 Sikulix Jar 檔二下即可執行,這時會出現 Sikulix IDE 界面,此時如果你直接輸入簡單測試程式執行時,會出現下面錯誤訊息。


一開始本人也搞不清楚這是什麼問題,經過研究才發現,原來一開始開啟的介面,其適用的語言是 javascript ,這可由 Sikulix IDE 界面最右下角確認,如下圖所示。



這時只要選擇新增一個新的檔案即可,這時右下顯示的適用語言,就是 Jython 了,測試程式也可正常執行,如下圖所示。



經過此設定 Sikulix IDE 即可正常使用。

2020年5月27日 星期三

在 Win10 下如何設定 Sikuli 定時自動執行

[Python,Sikuli] 如何定時執行程式,來將每日例行工作自動化。中,我們介紹如何用 Python 設定排程,來達到定時執行的功能,但這樣的作法還是需要我們每日開啟 Sikulix IDE 去執行該 Script,但事實上 Win10  我們可以結合 Win 10 工作排程器及 Sikulix 所提供的命令列語法來達成我們所要的效果,以下分別說明。

Sikulix 所提供的命令列語法

Sikulix 有提供命令列參數 -r 可供我們指定所要執行的 .sikuli 、.jar 、.skl (後兩者可由 Sikulix IDE產生),使用格式如下:
 java -jar /path/sikulixide -r /path/test.[sikuli|jar|skl]
例如假設我們現有一個 test.sikuli 在 c:\test 目錄下,sikulixide 的 jar 檔在 c:\sikulix 目錄下,則在命令列模式下指令如下:
java -jar c:\sikulix\sikulixide.jar -r c:\test\test.sikuli

Win 10 工作排程器

Win10 內建的工作排程器可於 Window 系統管理工具找到,如下圖所示。

開啟工作排程器後直接選擇建立工作,如下圖黃色標示。


選擇後會進入到設定畫面,要依序完成上方紅色框內的五個頁面設定,如下圖所示。


首先第一個「一般」頁面基本上只要設定名稱就好了,在此範例我們設名稱為 TEST,後面進到「觸發程序」 ,這是設定如何啟動程序的條件,在這裡我們設定每日早上8點啟動,依下圖紅色數字順序設定即可完成。


接下來進到「動作」頁面,是設定我們要執行什麼動作,在這我們依下圖紅色數字順序,把在前面 Sikuli 範例指令鍵入後,按確定即可建立完成。

後面的「條件」與「設定」頁面則可視個人需求進行調整,在本例我們不需要調整,直接選擇確定即可。


設定完成後,選擇左手邊的「工作排程器程式庫」,即可在畫面中間看到我們所設的 TEST  工作,如想測試執行結果,可按右手邊的執行,如下圖順序所示。


如果執行成功,在中間畫面[上次執行結果]欄位,會顯示操作順利完成,如果無法行會出現工作尚未執行並有相關錯誤訊息,這時就要回到該工作的「動作」頁面重新設定所要執行的程序或指令。

結語

透過 Win10 工作排程器及 Sikuli ,我們可以做到定時自動執行功能,來達到簡便工作的目的,有興趣的朋友可多多嘗試。

2020年5月24日 星期日

[Python,Sikuli]如何將 Excel 內含有中文的資料轉存為 CSV 檔後讀入程式內使用

如何用 Sikuli 來將重複性的工作自動化,讓省下來的時間從事更有生產力的工作並提升生活品質。 中有介紹到 Sikuli 主要是遵循 Python 2.7 (Jyhton) 語法,故在讀入,由Excel轉出內含中文的資料讀入程式時,也會遇到 Python 2.7 所遇到的問題,這問題可分為以下兩個部分:

CSV 檔格式的問題

由 Excel 轉出的 csv 檔並不能夠直接使用,必需要先用 notepad++ 之類的程式,將 csv 檔轉為 UTF-8碼格式,就如同下圖所示,在 notepad++ 開啟 csv 檔,選擇[轉換]->[轉換至UTF-8碼格式]後,在將 csv 檔存檔。


讀取 CSV 檔

在 Python 2.7 中是用提供讀取 csv 檔用的套件,套件名稱就叫 csv,但在讀取中文的有問題,如同以下範例所示:


如要讀取內含中文的 csv 檔, 必需用codecs套件所提供的open方法,來指定打開的文件的語言編碼,它會在讀取的時候自動轉換為內部unicode,避免前述問題,但 codecs 套件讀入的格式,不是如 csv 套件一般,已經轉換好的 list 格式,需自行處理,不過相當簡單,只要用 split 函式,以換行符號(\n)為關鍵字,即可轉換為 list,如下列範例所示。

import codecs;
data = open("c:\\jython2.7.1\\test2.csv").read();
#判斷是否被轉含有 BOM UTF-8 格式,如果是將 BOM 去除
if data[:3] == codecs.BOM_UTF8:  
    data = data[3:];
#用換行符號(\n)將每行資料分開
splitdata=data.split('\n');
for i in splitdata:
   print(i);

執行結果如下圖:


結語

當我們有大量資料要輸入網頁或特定程式,而不想要用人工一筆一筆鍵入時,我們可用 sikuli 讀入 csv  檔,將資料一筆一筆輸入網頁或特定程式,而如果資料含有中文時,在讀入 csv 檔時,就要採用上述的處理方式,而無法直接套用內建csv 套件,如有需求的朋友,可參考使用。

2020年5月20日 星期三

雪泥鴻爪

出處: 蘇東坡《和子由澠池懷舊》詩

人生到處知何似,應似飛鴻踏雪泥。

泥上偶然留指爪,鴻飛那復計東西。

老僧已死成新塔,壞壁無由見舊題。

往日崎嶇還記否,路長人困蹇驢嘶。




2020年5月13日 星期三

[Python,Sikuli] 如何定時執行程式,來將每日例行工作自動化。

很多時侯我們會希望能夠定時執行某些作業,例如:每日定時上網捉取某些資料、定時關機等,透過將例行工作自動化來節省自已的時間,只要這些作業是固定的,就可以使用 Sikuli 來幫助我們進行自動化的作業。在如何用 Sikuli 來將重複性的工作自動化,讓省下來的時間從事更有生產力的工作並提升生活品質。 這篇文章中,我們提到 Sikuli 基本上是根基於 Python (Jython) 的語法,故想要定時執行某一任務,可參照 Python 上的函式,實現的方式有以下兩種 :

使用 threading 模組中的 Timer


Python 的 threading 模組,是 Python 標準函式庫裡面的模組,所以不用特別安裝即可使用,雖然功能不是很多,但是基本多執行緒程式設計常用的功能它都有,在這我們會用到該模組的 Timer , Timer 是一個執行緒,它可以在我們指定的時間間隔之後執行一個函式。

最簡單使用 Timer,基本上必需具備下列語法: 
  
import threading ;
timer = threading.Timer(timer_start_time, func , func_param);
timer.start();

其中使用 threading .Timer 建立執行緒時,至少需傳入2個參數,第一個參數 timer_start_time為,預計於多久後執行的時間間隔(單位是秒),第二個參數 func 為所要呼叫的函式名,第三個參數 func_param 是呼叫函式的引數(tuple),如果所呼叫的函式沒引數的話可省略。
 
前面提到 Timer 建立執行緒時,所要傳入的第一個參數,為預計於多久後執行的時間間隔,但我們想要的是指定時間執行,這時就需要將指定時間換算為時間間隔,這時可用 datetime 模組進行計算轉算,語法如下:

import datetime;
#取得現在時間
now_time = datetime.datetime.now();
#設定預計執行的時間
next_time = datetime.datetime.strptime(str(next_year)+"-"+str(next_month)+"-"+str(next_day)+str(next_time), "%Y-%m-%d %H:%M:%S");
#計算預定執行的時間與現在的時間間隔,並換算為秒數。
timer_start_time = (next_time - now_time).total_seconds(); 

  以下為示範每日定時關機的程式碼:



使用 sched 模組


sched 模組是 Python 內建的模組,它是一個排程(延時處理機制),每次想要定時執行某任務都必須寫入一個排程,其執行為依序執行,基本上必需具備下列語法: 

import sched;
from datetime import datetime;
import time; 
#初始化 schedule
schedule = sched.scheduler(time.time, time.sleep)
#設定 schedule 及執行
schedule.enter(timer_start_time, 0, func,())
schedule.run();
 
相較於 threading 模組中的 Timer,其步驟多了一步初始化的動作,其設定一樣是預計執行時間的間隔,但其 enter 內的參數不能省略,所以所于呼叫的函式就 算沒有引數,也要給一個空tuple (),同樣示範每日定時關機的程式碼如下:
 
 
可以看到基本上概念跟前一個是差不多的,只不過是應用不同模組來執行。

結語 


對於每日固定執行的工作,我們可以透過 Sikuli 來定時執行 ,將例行工作自動化,將節省下來的時間應用在更有生產力的工作。