Selenium IDEとは

# Selenium IDEでいろんなことをやってみる。

今は、**「Selenium 3」**が主流ですが、**「Selenium IDE」**もまだまだ使えますね。
**使いやすさ**や**使い勝手**がとても良いです。

**非プログラマー**には、使いやすい**Webブラウザツール**ですね。
まずは、**「アドオン」** を入手しましょう。


http://docs.seleniumhq.org/download/


<img width="1020" alt="スクリーンショット 2020-01-16 0.43.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55160/32f67c2b-3714-33ab-1a30-8fa868d4cd26.png">

![スクリーンショット 2021-10-20 21.46.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55160/6de932ff-8eb8-0510-3db3-d49b5cc7f983.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55160/adeaac57-0aeb-25d5-3f38-d5cf0955b75a.png)


SeleniumIDEから　**「Chrome」** か　**「Firefox」** か　**「Edge」** を選択して**追加**する


試しに、**Chrome**を追加してみます。


<img width="1105" alt="スクリーンショット 2020-04-11 17.45.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55160/4ad5895c-577e-5f89-94f3-474de2f08c6f.png">

# 注意点

![テスト.png](https://qiita-image-store.s3.amazonaws.com/0/55160/3a224de4-1e22-771f-95b9-324e4b7ba616.png)

**「SeleniumIDE」** でとりあえず。現在バージョンは、**「3.17.4」** です。

※昔、Firefox55が使えないことがありました。

![selenium.png](https://qiita-image-store.s3.amazonaws.com/0/55160/754223b7-4e97-0365-9e05-b5fe067cc0e8.png)

どうしようかと。Firefox ESR版（法人向け）で次のアナウンスまで待つことに。
で、ついに。帰ってきました！！


# 進めます

### 現在のバージョン

最終更新日が**2021年12月7日で**あり、**1年以上**更新されていない状態です。

Chrome **（3.17.2）**　
https://chrome.google.com/webstore/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd

Firefox **（3.17.4）**
https://addons.mozilla.org/ja/firefox/addon/selenium-ide/

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55160/8e42478c-44fb-8206-82e9-d2e78628544c.png)


https://addons.mozilla.org/ja/firefox/addon/selenium-ide/versions/

何かUIも変わったような。**SideexをFork**している感はある。

![Selenium.png](https://qiita-image-store.s3.amazonaws.com/0/55160/51c7149d-3588-4dcc-3518-19b109da5093.png)

赤枠にチェックが。これは良い！

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55160/0f35ee41-147a-6f98-0f52-248707e14a04.png)


※セキュリティ修正だけを長期継続する延長サポート版 (ESR: Extended Support Release) の Firefox を提供
https://www.mozilla.jp/business/

今は　**「Selenium WebDriver」** が主流ですがここはあえて。簡単に実装できるのも魅力です。
日々更新していきます。コマンドを作成して、テスト自動化できるよう完成させます。
記録しても作成できますが、さすがに限度がありますね。
**「Seleniumコマンド」** を使用し、**スクリプト** を作成しましょう。

![Selenium.jpg](https://qiita-image-store.s3.amazonaws.com/0/55160/0c601e19-958f-0593-c616-cbf9150c1eb8.jpeg)

# FirefoxだけではなくChromeも動かす（こちらは旧タイプ）
SeleniumIDEの「オプション」の　**「WebDriver」で** **「Enable WebDriver Playback」** をチェック
その下の入力ボックスに、**「Chrome」** と指定し「OK」をクリック。
![キャプチャ.jpg](https://qiita-image-store.s3.amazonaws.com/0/55160/e6964a68-8735-d1e5-eb82-f28b5cf7ab80.jpeg)

次に、**「Selenium Server」** を起動します。


```html+cheetah:Batファイルを作成する

java -jar selenium-server-standalone-2.48.2.jar -Dwebdriver.chrome.driver=chromedriver.exe
```
※Batをたたき起動します。
起動後、**Selenium IDE** も動かす。
するとChromeブラウザが起動します。が、エラーがところどころでますね。
そこが課題でもあります。
![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/55160/c6d7007f-fbcf-d833-6d43-9e8e877ca30b.jpeg)

# コマンドを作成してみる

テスト自動化で必要になるコマンドを書いてみました。
そのまえに、**getEval**とは何なのか？
「selenium オブジェクト内でJavaScriptを実行させるコマンドになります。」
またstoreEvalは、「値を保持するために使用します。」
このことを前提として進めていきます。

速度の調整も必要ですね。FASTだと、コマンドでつかめなくなることもあるのでスクリプトに応じて「速度調整」することをお勧めします。


```html+cheetah:日付でユニークにする。
<tr>
	<td>storeEval</td>
	<td>storedVars.getDatetime=function() 
　　　　　　　{var date = new Date();
              var y = date.getFullYear();
              var m = date.getMonth() + 1;
              var d = date.getDate();
              var w = date.getDay();
              var h = date.getHours();
              var i = date.getMinutes();
              var j = date.getSeconds();
              var m = ('0' + m).slice(-2);
              d = ('0' + d).slice(-2);
             return y + '/' + m + '/' + d + '/' + h + '/' + i + '/' + j; }
       </td>
　　　　<td>date</td>
</tr>
```
```html+cheetah:ID変数初期化
<tr>
	<td>store</td>
	<td>0</td>
	<td>ID</td>
</tr>
```
```html+cheetah:ID番号を1増やす
<tr>
	<td>store</td>
	<td>javascript{eval(storedVars['ID']) + 1}</td>
	<td>ID</td>
</tr>
```
```html+cheetah:ユニーク番号でのcapture取得
<tr>
	<td>captureEntirePageScreenshot</td>
	<td>C:\\temp\\test${ID}.jpg</td>
	<td></td>
</tr>
```
```html+cheetah:timestampを作成し常にユニークにする。
<tr>
	<td>storeEval</td>
	<td>var date = new Date();
　　　　　   var yyyy = date.getFullYear(); 
            var mm = ("0" + (date.getMonth() + 1)).slice(-2);
   　　　　　var dd = ("0" + date.getDate()).slice(-2);
            var hh = ("0" + date.getHours()).slice(-2);
            var mi = ("0" + date.getMinutes()).slice(-2);
            var ss = ("0" + date.getSeconds()).slice(-2);
            storedVars.yyyymmddhhmin = yyyy + '' + mm + '' + dd + '-' + hh + '' + mi + '' + ss;</td>
	<td>timestamp</td>
</tr>
```
```html+cheetah:Basic認証
<tr>
	<td>open</td>
	<td>http://userid:password@url;</td>
	<td></td>
</tr>
```


```html+cheetah:waitForCondition
<tr>
	<td>waitForCondition</td>
	<td>var end = 
(new Date()).getTime() + 2000;
while (true) { if (end < (new Date()).getTime()) break; } true;</td>
	<td>1000000</td>
</tr>
```

```html+cheetah:aタグ名から要素を参照する
<tr>
	<td>getEval</td>
	<td>var test = document.getElementsByTagName('a');</td>
	<td></td>
</tr>
```
```html+cheetah:iconクラスから要素を参照する
<tr>
	<td>getEval</td>
	<td>var test = document.getElementsByClassName('icon');</td>
	<td></td>
</tr>
```
```html+cheetah:XPath要素を参照する
<tr>
	<td>getEval</td>
	<td>var test = document.evaluate('id("test")//li', document, null, 7, null);</td>
	<td></td>
</tr>
```
```html+cheetah:入力emailアラートを表示する
<tr>
	<td>store</td>
	<td>javascript{prompt("emailを入力してください","XXXX@yahoo.co.jp")}</td>
	<td>email</td>
</tr>
```
```html+cheetah:入力パスワードアラートを表示する。黒丸でパスワードが見えない。
<tr>
	<td>store</td>
	<td>javascript{var p={value:""};PROMPT = Components.classes['@mozilla.org/embedcomp/prompt-service;1'].getService(Components.interfaces.nsIPromptService);PROMPT.promptPassword(window, "Enter Password", "パスワードを入力してください。", p, null, {}); p.value;}</td>
	<td>password</td>
</tr>
```
```html+cheetah:指定したIDに枠をつける
<tr>
　　<td>getEval</td>	
　　<td>var elem = window.document.getElementById("title"); elem.style.border = "10px #4c4 solid";
　　</td>
　　<td></td>
</tr>
```
```html+cheetah:特定のXpathをつかむことができるまで待つ
<tr>
　　<td>waitForElementPresent</td>	
　　<td>xpath=//body/div[1]/div/div/div/h1</td>
　　<td>100000</td>
</tr>
```
```html+cheetah:特定のXpathをつかむことができるまで待つ
<tr>
　　<td>waitForElementPresent</td>	
　　<td>xpath=//body/div[1]/div/div/div/h1</td>
　　<td>100000</td>
</tr>
```
```html+cheetah:特定のURLを保存し変数で使いまわす。
<tr>
　　<td>store</td>
　　<td>https://XXXXXXXXX/</td>
　　<td>url</td>
</tr>
```
```html+cheetah:Emailを保存
<tr>
　　<td>store</td>
　　<td>junjun@yahoo.co.jp</td>
　　<td>mail</td>
</tr>
```
```html+cheetah:Emailを設定する
<tr>
　　<td>type</td>
　　<td>id=mail</td>
　　<td>${mail}</td>
</tr>
```
```html+cheetah:値を表示
<tr>
　　<td>echo</td>	
　　<td>${mail}</td>
　　<td></td>
</tr>
```

```html+cheetah:先程のURLを使う。
<tr>
　　<td>open</td>
　　<td>${url}</td>
　　<td></td>
</tr>
```
```html+cheetah:期待値と実測の比較を行う。指定したパスのinnerHTMLの値と同じであれば「OK」を返し、異なっていれば「NG」を返す。
<tr>
<td>getEval</td>
<td>var aa = selenium.browserbot.findElement("//div/div[6]/div[2]/div/div/div[3]/div/a");
    var bb  = aa.innerHTML;
    if(bb=="正しい期待値です。"){
       var dd ="Y";
    }else{dd ="N";}
       alert(dd);★一度アラートで確認する。開発時
</td>
<td></td>
</tr>
```
```html+cheetah:50回まわします。まずは、sideflow.jsを指定してください。
※sideflow.jsは、ループ処理等を行う為の拡張スクリプトになります。
ダウンロードは下からお願いします。

<tr>
　　<td>store</td>
　　<td>50</td>
　　<td>i</td>
</tr>
<tr>
　　<td>while</td>
　　<td>${i}</td>
<td></td>
</tr>
<tr>
　　<td>endWhile</td>
　　<td></td>
　　<td></td>
</tr>
```
[sideflowのダウンロード](https://github.com/73rhodes/sideflow)

SelBlocksの場合

```html+cheetah:ループ処理
<tr>
　　<td>for</td>
　　<td>i=1; i<= 100; i++</td>
　　<td>i</td>
</tr>

このあたりに繰り返したい処理を入れます。

<tr>
　　<td>endFor</td>
　　<td></td>
　　<td></td>
</tr>
```
[SelBlocksのダウンロード](https://addons.mozilla.org/ja/firefox/addon/selenium-ide-sel-blocks/)


[ログイン処理回避：flow-control](https://addons.mozilla.org/ja/firefox/addon/flow-control/)

```html+cheetah:ログイン処理がある、ない場合の回避方法

<tr>
　　<td>getEval</td>
　　<td>win=this.page().getCurrentWindow();</td>
　　<td></td>
</tr>
<tr>
　　<td>gotoIf</td>
　　<td>win.location.href.match(/index/)</td>
　　<td>logged_test</td>
</tr>
<tr>
　　<td>type</td>
　　<td>id=settings_email</td>
　　<td>${email}</td>
</tr>
<tr>
　　<td>type</td>
　　<td>id=settings_user_password</td>
　　<td>${password}</td>
</tr>
<tr>
　　<td>label</td>
　　<td>logged_test</td>
　　<td></td>
</tr>
```
File Logging
ログをファイルに出力してくれるアドオンです。
https://addons.mozilla.org/ja/firefox/addon/file-logging-selenium-ide/

Screenshot on fail
テストの実行が失敗した時のブラウザの画面キャプチャを自動で取得
https://addons.mozilla.org/ja/firefox/addon/screenshot-on-fail-selenium/

Test Results
テストの実行結果をHTML形式で出力
https://addons.mozilla.org/ja/firefox/addon/test-results-selenium-ide/



# jsファイルを読み込ませ、指定関数を実行　


```html+cheetah:user-extensions.js
/**
* ページ内の対象idに枠をつける：Selenium IDE拡張スクリプトのパス
*/
function test() {
 var win = selenium.page().getCurrentWindow(); //現在のページウィンドウを取得
 var test = window.document.getElementById("title"); test.style.border = "10px #4c4 solid";
 var te = test.length;
 for (var i=0; i<te; i++) {
 test[i].style.border = "10px #4c4 solid";
 }
}
```
![テスト.jpg](https://qiita-image-store.s3.amazonaws.com/0/55160/075035ad-1733-3a30-b9e1-be860e46b426.jpeg)


# 拡張機能でCSVファイル操作や、配列などが対象！
Project ICKX Selenium-IDE User Extension


CSVファイルから値を取得したい場合など、とても助かります。
例えば、CSVファイルにユーザーIDを入力しある時間に起動した場合など。
運用ベースで使えますね。

http://wkbd.ickx.jp/se/




# GitHubに登録
ヤフートップ画面に遷移し、キャプチャを取得するまで。
https://github.com/juntest2014/Selenium/blob/gh-pages/login.html
ヤフートップを何度もオープンするスクリプト(リロードテスト用)
https://github.com/juntest2014/Selenium/blob/gh-pages/while.html

# スケジュール機能

記録ボタンの左横に「時計のボタン」何だろうか？
時間を設定できる。Cron設定みたいなものかな。

![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/55160/0125ed83-9e64-1de3-9ff2-c29bdc089b6f.jpeg)

・一度設定したジョブの時間を更新しても、以前の設定のままであったり、なかなか更新がうまくいかない。
・設定したジョブは、JOBタブで確認。Activityタブで実行履歴を確認できる。で、ジョブが動いていないことが多い。
waiting for job to finishとか。


# 日本Seleniumユーザーコミュニティ
[日本SeleniumユーザーコミュニティHP](http://www.selenium.jp/)
[参加してみたいな。](https://groups.google.com/forum/?hl=en#!forum/seleniumjp
)