microsoft excelでgoogle chromeを動かした話

58
Microsoft ExcelGoogle Chrome動かした話 (改良版) ひろくんだよん

Upload: -

Post on 23-Jan-2018

178 views

Category:

Technology


1 download

TRANSCRIPT

Microsoft ExcelでGoogle Chromeを動かした話

(改良版)

ひろくんだよん

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

制御

応答

実はPowerShellからも動かせる

C#用Selenium

Library

FirefoxDriver

ChromeDriver

IEDriver

制御

応答

制御

応答

制御

応答

制御

応答

制御

応答

大まかな方法

MicrosoftEdge

Driver

制御

応答

https://www.slideshare.net/hirofumitouhei/powershellwebselenium-webdriverよりhttps://github.com/hirokundayon/edobarai.git

ふと思った

PowerShellからも

動かせるなら

Microsoft Excelからも

動かせるのでは?

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スクリプトを書く。

命名

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より

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 を停止

命名

IPANEMA

魔法少女ちゅうかないぱねま東映制作1989年7月23日から同年12月24日までフジテレビ系列で放送

©石森プロ、東映

ぱいぱいよりも技能が未熟

魔法の呪文

リンパラ、

イパネマ、

シャオシャオパイ

SeleniumStandalone

Server

FirefoxDriver

ChromeDriver

IEDriver

制御

応答

制御

応答

制御

応答

制御

応答

制御

応答

大まかな方法(最初の方法)

MicrosoftEdge

Driver

制御

応答

こうして作ったのが

OSC 2017 Nagoya で披露した話

まてよ

SeleniumStandalone

Server

FirefoxDriver

ChromeDriver

IEDriver

制御

応答

制御

応答

制御

応答

制御

応答

制御

応答

大まかな方法

MicrosoftEdge

Driver

制御

応答

不要では?

FirefoxDriver

ChromeDriver

IEDriver

制御

応答

制御

応答

制御

応答

制御

応答

制御

応答

大まかな方法(改良案)

MicrosoftEdge

Driver

制御

応答

というわけで

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. さらにクリックして拡大表示

Excel でGoogle Chromeを操作

まとめ

Microsoft ExcelでGoogle Chromeを操作可能

• ChromeDriverを起動する。

• ServerXMLHTTPでHTTPリクエストをChromeDriverへ投げる。

• JSON形式の応答を加工して処理を続ける。

おしまい(^.^)/~~~