Microsoft ExcelでWebブラウザ(Selenium WebDriver)を動かした話

Preview:

Citation preview

Microsoft ExcelでWebブラウザ

(Selenium WebDriver)を動かした話

ひろくんだよん

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日までフジテレビ系列で放送

©石森プロ、東映

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

魔法の呪文

リンパラ、

イパネマ、

シャオシャオパイ

Selenium Server の起動

Dim pid As Integer

pid =Shell(

"java -Dwebdriver.chrome.driver=/path/to/chromedriver-jar selenium-server-standalone-X.X.X.jar")

• 赤字部分は一行で書く。

• /path/to/chromedriverは適宜指定。– 他のWebブラウザ用ドライバーも適宜指定

• pid(プロセスID)は後で停止する時に使用。

• jarファイル、chromedriverなどの置き場所http://www.seleniumhq.org/download/

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":

{"browserName":“chrome”},

"requiredCapabilities":{}}

• URLhttp://localhost:4444/wd/hub/session

Webブラウザ(Internet Explorer)起動

• メソッドPOST

• JSON{“desiredCapabilities”:

{"browserName":“internet explorer”},"requiredCapabilities":{}}

• URLhttp://localhost:4444/wd/hub/session

Webブラウザ(Mozilla Firefox)起動

• メソッドPOST

• JSON{"desiredCapabilities":

{"browserName":"firefox”},"requiredCapabilities":{}}

• URLhttp://localhost:4444/wd/hub/session

Webブラウザ(Microsoft Edge)起動

• メソッドPOST

• JSON{"desiredCapabilities":

{"browserName":“MicrosoftEdge”},"requiredCapabilities":{}}

• URLhttp://localhost:4444/wd/hub/session

Webブラウザ(Google Chrome on Android)起動

• メソッドPOST

• JSON{"desiredCapabilities":

{"browserName":"chrome“, “chromeOptions":

{"androidPackage": "com.android.chrome"}},"requiredCapabilities":{}}

• URLhttp://localhost:4444/wd/hub/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

}

Googleのページへ飛ぶ

• メソッドPOST

• JSON{"url": ”http://www.google.co.jp”}

• URL

“http://localhost:4444/wd/hub/session/“ _& SESSION_ID & "/url”

Googleの検索窓を探す

• メソッドPOST

• JSON{“using”:”‘name’”,”value”:“q”}

• URLhttp://localhost:4444/wd/hub/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:4444/wd/hub/session/ _

& SESSION_ID & _“/element/” & ELEMENT_ID & “/value”

検索結果からリンクを探す• メソッド

POST

• JSON{"using":"partial link text”,”value”:“OSS支える!”}

• URL”http://localhost:4444/wd/hub/session/” _

& SESSION_ID & ”/element”

リンクをクリック

• メソッドPOST

• JSONなし

• URL”http://localhost:4444/wd/hub/session/” _

& SESSION_ID & ”/element/” _& ELEMENT_ID & “/click”

Selenium Server の停止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 OfficeMicrosoft Excel 2013(32bit版) で動作検証

• Java Runtime EnvironmentJava Runtime Environment 1.8.0 u131 で動作検証

• Selenium Standalone ServerSelenium Standalone Server V3.4.0 で動作検証

ここで実演

実演内容

次の処理を自動実行

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でWebブラウザ(Selenium WebDriver)を操作可能

• Selenium Serverを起動する。

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

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

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

Recommended