狠狠撸

狠狠撸Share a Scribd company logo
Microsoft Excelで
Google Chromeを
動かした話
(改良版)
ひろくんだよん
Seleniumとは?
? 原子番号34の元素
? 元素記号はSe
? 第16族元素
– 酸素と同族
– ハロゲンの隣
? 灰色セレン
– 金属セレン
– 六方晶系
– 融点は217.4℃
? 赤色セレン
– 単斜晶系
では
なくて
Seleniumとは?
http://docs.seleniumhq.org/
? Webベースアプリケーション用テスト
自動化ツール
? ライセンスはApache 2.0 License
Selenium WebDriver
http://docs.seleniumhq.org/projects/webdriver/
? プログラムからWebブラウザ制御
? 制御可能ブラウザ
– Mozilla Firefox, Google Chrome(Linux, Windows,
MacOS, Android), Internet Explorer, Safari, Edge
? 使用可能言語
– Java, Ruby, Python, C#, Javascript(Node.js)など
? OS
– Linux, MacOS, Windowsなど
Selenium WebDriver
http://docs.seleniumhq.org/projects/webdriver/
? プログラムからWebブラウザ制御
? 制御可能ブラウザ
– Mozilla Firefox, Google Chrome(Linux, Windows,
MacOS, Android), Internet Explorer, Safari, Edge
? 使用可能言語
– Java, Ruby, Python, C#, Javascript(Node.js)など
? OS
– Linux, MacOS, Windowsなど
Selenium
Client
Firefox
Driver
Chrome
Driver
IE
Driver
制御
応答
制御
応答
制御
応答
制御
応答
制御
応答
大まかな仕組み
Microsoft
Edge
Driver
制御
応答
実は
PowerShell
からも
動かせる
C#用
Selenium
Library
Firefox
Driver
Chrome
Driver
IE
Driver
制御
応答
制御
応答
制御
応答
制御
応答
制御
応答
大まかな方法
Microsoft
Edge
Driver
制御
応答
/hirofumitouhei/powershellwebselenium-webdriver より
https://github.com/hirokundayon/edobarai.git
ふと
思った
PowerShell
からも
動かせるなら
Microsoft Excel
からも
動かせるのでは?
C#用
Selenium
Library
Firefox
Driver
Chrome
Driver
IE
Driver
制御
応答
制御
応答
制御
応答
制御
応答
制御
応答
大まかな方法
Microsoft
Edge
Driver
制御
応答
/hirofumitouhei/powershellwebselenium-webdriver より
構想した手順
1. Selenium Client & WebDriver Language
Bindings から C#用ファイルをとってくる。
2. 任意のフォルダにC#用ファイルを置く。
3. Microsoft Excel VBAで呼び出し部分を宣言
4. Microsoft Excel VBAスクリプトを書く。
命名
PAIPAI
魔法少女ちゅうかなぱいぱい
東映制作
1989年1月15日から同年7月9日までフジテレビ系列で放送
?石森プロ、東映
だが挫折
orz
挫折の理由
1. Selenium Client & WebDriver Language
Bindings から C#用ファイルをとってくる。
2. 任意のフォルダにC#用ファイルを置く。
3. Microsoft Excel VBAで呼び出し部分を宣言
4. Microsoft Excel VBAスクリプトを書く。
赤字の部分がよくわからなかった。
情弱なので。
だが
思いだした
以前、
こういうのを
行なった
curlをつかって
http://www.suruga-ya.jp/product/detail/980001420000 より
Selenium
Server
bashでWebブラウザを動かした
Chrome
Driver
HTTPリクエスト
応答
応答
応答(JSON)
HTTPリクエスト
応答(JSON)
/hirofumitouhei/bashwebselenium-webdriver より
https://github.com/hirokundayon/Emily.git
Visual Basic でも出来る事
? HTTPリクエストを投げて応答を処理する
ServerXMLHTTP
https://msdn.microsoft.com/ja-jp/library/ms766431(v=vs.85).aspx
? プログラムを実行
Shell関数:PIDも取得できる
https://msdn.microsoft.com/ja-jp/library/xe736fyk(v=vs.90).aspx
? PIDを指定してプログラムを停止
(後述)
という事は
次の手順で処理可能
1. Selenium Standalone Server を起動
2. Webブラウザを自動実行
i. Selenium Standalone Server に
HTTPリクエストを投げる。
ii. 応答を受けて処理する。
3. Selenium Standalone Server を停止
命名
IPANEMA
魔法少女ちゅうかないぱねま
東映制作
1989年7月23日から同年12月24日までフジテレビ系列で放送
?石森プロ、東映
ぱいぱいよりも
技能が未熟
魔法の呪文
リンパラ、
イパネマ、
シャオシャオパイ
Selenium
Standalone
Server
Firefox
Driver
Chrome
Driver
IE
Driver
制御
応答
制御
応答
制御
応答
制御
応答
制御
応答
大まかな方法(最初の方法)
Microsoft
Edge
Driver
制御
応答
こうして
作ったのが
OSC 2017 Nagoya で
披露した話
まてよ
Selenium
Standalone
Server
Firefox
Driver
Chrome
Driver
IE
Driver
制御
応答
制御
応答
制御
応答
制御
応答
制御
応答
大まかな方法
Microsoft
Edge
Driver
制御
応答
不要
では?
Firefox
Driver
Chrome
Driver
IE
Driver
制御
応答
制御
応答
制御
応答
制御
応答
制御
応答
大まかな方法(改良案)
Microsoft
Edge
Driver
制御
応答
という
わけで
Firefox
Driver
Chrome
Driver
IE
Driver
制御
応答
制御
応答
制御
応答
制御
応答
大まかな方法(改良案)
Microsoft
Edge
Driver
制御
応答
Firefox
Driver
Chrome
Driver
IE
Driver
制御
応答
制御
応答
制御
応答
制御
応答
今回実装できた部分
Microsoft
Edge
Driver
制御
応答
次の手順で処理可能
1. ChromeDriver を起動
2. Webブラウザを自動実行
i. ChromeDriver にHTTPリクエストを投げる。
ii. 応答を受けて処理する。
3. ChromeDriverを停止
Chrome Driver の起動
Dim pid As Integer
pid = Shell("/path/to/chromedriver.exe")
? /path/to/chromedriver は適宜指定。
? pid(プロセスID)は後で停止する時に使用。
? chromedriver の置き場所
https://sites.google.com/a/chromium.org/chromedriver/
HTTP リクエストを処理する
ServerXMLHTTPを使用
https://msdn.microsoft.com/ja-jp/library/ms766431(v=vs.85).aspx
Function useAPI(_
ByVal url As Variant, _
ByVal method As String, _
ByVal json As String) As String
Dim objHTTP As Object
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
objHTTP.Open method, url, False
objHTTP.setRequestHeader "Content-type", "application/json"
objHTTP.send json
useAPI = objHTTP.responseText
Set objHTTP = Nothing
End Function
Selenium WebDriverのAPI (一部)
メソッド URIのテンプレート コマンド
POST /session 新しくセッション
を作る
POST /session/{session id}/url 指定したURLへ
飛ぶ
GET /session/{session id}/title タイトルを得る
POST /session/{session id}/element 要素を見つける
POST /session/{session id}
/element/{element id}/sendKeys
指定した要素に
キー入力を送る
POST /session/{session id}
/element/{element id}/click
指定した要素を
クリックする
https://w3c.github.io/webdriver/webdriver-spec.html より
Webブラウザ(Google Chrome)起動
? メソッド
POST
? JSON
{"desiredCapabilities":{},
"requiredCapabilities":{}}
? URL
http://localhost:9515/session
Selenium WebDriverのAPIの応答例
{
"state": null,
"sessionId":
"45314279-a985-4a7e-aee1-
30582a4f9c2a",
"hCode": 682306787,
"value": {
"applicationCacheEnabled": true,
"rotatable": false,
"handlesAlerts": true,
"databaseEnabled": true,
"version": "46.0.1",
"platform": "WINDOWS",
"nativeEvents": false,
"acceptSslCerts": true,
"webdriver.remote.sessionid":
"45314279-a985-4a7e-aee1-
30582a4f9c2a",
"webStorageEnabled": true,
"locationContextEnabled": true,
"browserName": "firefox",
"takesScreenshot": true,
"javascriptEnabled": true,
"cssSelectorsEnabled": true
},
"class":
"org.openqa.selenium.remote.
Response",
"status": 0
}
JSON のパーズ
次の2つを使用
? VBA-JSON
https://github.com/VBA-tools/VBA-JSON
? VBA-Dictionary
https://github.com/VBA-tools/VBA-Dictionary
VBA-JSONが使用。
JSON のパーズ
使用例
Dim Json As Object
Set Json = JsonConverter.ParseJson( _
{""a"":123,""b"":{“”element””:””2””}}“ _
)
' Json("a") -> 123
' Json("b")(“element”) -> 2
Googleのページへ飛ぶ
? メソッド
POST
? JSON
{"url": ”http://www.google.co.jp”}
? URL
“http://localhost:9515/session/“ _
& SESSION_ID & "/url”
Googleの検索窓を探す
? メソッド
POST
? JSON
{“using”:”‘name’”,”value”:“q”}
? URL
http://localhost:9515/session/ _
& SESSION_ID & "/element”
応答例
{
"state": "success",
“sessionId”:
"da990f64-671f-4b4e-b4f9-af3363fb54e8",
"hCode": 1209818291,
"value": {
"ELEMENT": "0"
},
"class": "org.openqa.selenium.remote.Response",
"status": 0
}
部品が見つかった場合は success
部品のID
検索
? メソッド
POST
? JSON
{“value”:[“OSC 名古屋 2012 レポートn"]}
? URL
http://localhost:9515/session/ _
& SESSION_ID & _
“/element/” & ELEMENT_ID & “/value”
検索結果からリンクを探す
? メソッド
POST
? JSON
{"using":"partial link text”,
”value”:“OSS支える!”}
? URL
”http://localhost:9515/session/” _
& SESSION_ID & ”/element”
リンクをクリック
? メソッド
POST
? JSON
なし
? URL
”http://localhost:9515/session/” _
& SESSION_ID & ”/element/” _
& ELEMENT_ID & “/click”
ChromeDriverの停止
Dim strComputer As String
Dim objWMIService
Dim colProcessList
Dim objProcess
strComputer = "."
Set objWMIService = _
getObject(“winmgmts:” & strComputer & “rootcimv2”)
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where ProcessID = " _
& CStr(pid))
For Each objProcess In colProcessList
objProcess.Terminate
Next
こんな
感じで
作ります
必要なもの
? Microsoft Office
次の環境で動作確認済
–Microsoft Excel 2016(32bit版)
–Microsoft Excel 2016(64bit版)
? Google Chrome
? ChromeDriver
ここで
実演
実演内容
次の処理を自動実行
1. Webブラウザ起動
2. Googleで「OSC 名古屋 2012 レポート」を検索
3. OSC2012 Nagoya のレポートを表示させる
https://www.ospn.jp/press/20120601osc2012-nagoya-report.html
4. メモリーカードエラー写真をクリック
5. さらにクリックして拡大表示
Excel でGoogle Chromeを操作
まとめ
Microsoft ExcelでGoogle Chromeを操作可能
? ChromeDriverを起動する。
? ServerXMLHTTPでHTTPリクエストを
ChromeDriverへ投げる。
? JSON形式の応答を加工して処理を続ける。
おしまい
(^.^)/~~~

More Related Content

Microsoft Excelでgoogle chromeを動かした話