microsoft excelでgoogle chromeを動かした話
TRANSCRIPT
Seleniumとは?
• 原子番号34の元素
• 元素記号はSe
• 第16族元素
–酸素と同族
–ハロゲンの隣
• 灰色セレン
–金属セレン
–六方晶系
–融点は217.4℃
• 赤色セレン
–単斜晶系
Seleniumとは?
http://docs.seleniumhq.org/
• Webベースアプリケーション用テスト自動化ツール
• ライセンスはApache 2.0 License
Selenium WebDriverhttp://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 WebDriverhttp://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など
SeleniumClient
FirefoxDriver
ChromeDriver
IEDriver
制御
応答
制御
応答
制御
応答
制御
応答
制御
応答
大まかな仕組み
MicrosoftEdge
Driver
制御
応答
C#用Selenium
Library
FirefoxDriver
ChromeDriver
IEDriver
制御
応答
制御
応答
制御
応答
制御
応答
制御
応答
大まかな方法
MicrosoftEdge
Driver
制御
応答
https://www.slideshare.net/hirofumitouhei/powershellwebselenium-webdriverよりhttps://github.com/hirokundayon/edobarai.git
C#用Selenium
Library
FirefoxDriver
ChromeDriver
IEDriver
制御
応答
制御
応答
制御
応答
制御
応答
制御
応答
大まかな方法
MicrosoftEdge
Driver
制御
応答
https://www.slideshare.net/hirofumitouhei/powershellwebselenium-webdriverより
構想した手順
1. Selenium Client & WebDriver Language Bindings から C#用ファイルをとってくる。
2. 任意のフォルダにC#用ファイルを置く。
3. Microsoft Excel VBAで呼び出し部分を宣言
4. Microsoft Excel VBAスクリプトを書く。
挫折の理由
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より
SeleniumServer
bashでWebブラウザを動かした
ChromeDriver
HTTPリクエスト
応答応答
応答(JSON)
HTTPリクエスト
応答(JSON)
https://www.slideshare.net/hirofumitouhei/bashwebselenium-webdriverよりhttps://github.com/hirokundayon/Emily.git
Visual Basic でも出来る事
• HTTPリクエストを投げて応答を処理するServerXMLHTTPhttps://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 を停止
SeleniumStandalone
Server
FirefoxDriver
ChromeDriver
IEDriver
制御
応答
制御
応答
制御
応答
制御
応答
制御
応答
大まかな方法(最初の方法)
MicrosoftEdge
Driver
制御
応答
SeleniumStandalone
Server
FirefoxDriver
ChromeDriver
IEDriver
制御
応答
制御
応答
制御
応答
制御
応答
制御
応答
大まかな方法
MicrosoftEdge
Driver
制御
応答
不要では?
FirefoxDriver
ChromeDriver
IEDriver
制御
応答
制御
応答
制御
応答
制御
応答
制御
応答
大まかな方法(改良案)
MicrosoftEdge
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":{}}
• URLhttp://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-JSONhttps://github.com/VBA-tools/VBA-JSON
• VBA-Dictionaryhttps://github.com/VBA-tools/VBA-DictionaryVBA-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”}
• URLhttp://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"]}
• URLhttp://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 & “\root\cimv2”)
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. さらにクリックして拡大表示
まとめ
Microsoft ExcelでGoogle Chromeを操作可能
• ChromeDriverを起動する。
• ServerXMLHTTPでHTTPリクエストをChromeDriverへ投げる。
• JSON形式の応答を加工して処理を続ける。