目次
前提
Webアプリケーションを自動化して使う3回シリーズの2回目です。
今回は何かをクリックする行為に関わる部分です。
Python3とSeleniumを使います。
今、かかわっているシステムで使われているため、一部でjQueryを使っています。
インストール環境設定はできている前提で話をすすめます。
まだの場合は、こちらでインストールと環境設定を行う必要があります。
記事は3回にわけて書いていきます
自分はSeleniumはよく使いますが、全面的な自動化は目指していません。
全面的な自動化は、自動化自体のテストや保守コストの負担が重いからです。
テストで何回も繰り返す面倒なところだけ部分的に素早く自動化する。
そのためのToolを作っていきます。
長くなるので、3回にわけます。
- 1回目:自動的に入力・選択する部品(今回)
- 2回目:自動的に何かをクリックする部品
- 3回目:自動的な値の参照や、スクロールなどの部品
今回は、2回目です。
自動的に何かをクリックする部品
ボタン・リンク・ラジオボタン・チェックボックスなどを自動的にクリックします。
部品1:Seleniumのclick()を使ったボタン
typeが「submit」であるボタンと、「button」であるボタンがあります。
<input type="submit" id="sname" class="sname" name="sname" value="サブミット"> <input type="button" id="bname" class="bname" name="bname" value="ボタン">
それをちゃんと区別して使うSeleniumっぽいやつです。
def click_submit(self, name): element = self.driver.find_element_by_xpath( "//input[@name='" + name + "'][@type='submit']") element.click() def click_button(self, name): self.driver.find_element_by_xpath( "//input[@type='button'][@name='" + name + "']").click()
上がSubmit、下がbuttonです。
Selenium共通の制約で、画面から隠れているボタンをclick()するとエラーになります。
部品2:onClick()のJavaScriptを直接実行
画面から隠れているボタンを押してもエラーにしたくない場合は、onClickで紐づいているJavaScriptを直接実行する方法が有効です。
def execute_script(self, scr): self.driver.execute_script(scr)
Seleniumのexcute_scriptを単純にラップしているだけですけど、便利です。
例えば。
<input type="button" onclick="script_test();">
みたいなものがあれば、
auto.execute_script("script_test();")
みたいに、クリックされたとみなして、JavaScriptを実行します。
部品3:チェックボックス・ラジオボタン(単純版)
typeがcheckboxになったり、radioになったりするだけです。
def click_checkbox(self, name): self.driver.find_element_by_xpath( "//input[@type='checkbox'][@name='" + name + "']").click() def click_radio(self, name): self.driver.find_element_by_xpath( "//input[@type='radio'][@name='" + name + "']").click()
でも。
こんなシンプルなケースは、ほとんどありません。
部品4:画像版チェックボックス・ラジオボタン
チェックボックスやラジオボタンそのものをCSSで「displey:none」にして、画像やlabelをかぶせているようなケースです。
例えばこんな感じ。
<label name="inner_chk">
<input type="checkbox" name="inner_chk">チェックする場所
</label>
こんな時は、上の<label>の部分をクリックする必要があります。
ところが、Seleniumの機能を使ってClick()しようとすると、labelがclickable(クリック可能)ではないなどとエラーがでてうまくいきません。
そんな時には、JavaScriptの機能で直接click()します。
def click_by_name(self, name): self.driver.execute_script( "document.getElementsByName('" + name + "')[0].click();")
これだと、labelもクリックできます。
部品5:グループ化チェックボックス・ラジオボタン
radioボタンをグループ化して、nameには同じ名前・・たとえば「radio_group_xxx」みたいな・・を設定している場合があります。
その場合は、同じ名前の複数のエレメントを取得して、その何番目(index)をクリックするという方を使います。
def click_by_names(self, name, index): self.driver.execute_script( "document.getElementsByName('" + name + "')[" + index + "].click();")
例えば。
ラジオボタンがグループされて、3つ並んでいる場合とかだと。
auto.click_by_names('radio_group_xxx', '1')
time.sleep(1)
auto.click_by_names('radio_group_xxx', '2')
time.sleep(1)
auto.click_by_names('radio_group_xxx', '3')
みたいにして、1秒おきに、上から順番にチェックする・・とかして、連動して表示が変わる部分の動作をテストで確認するみたいに使ってます。
部品6:テキスト表示のリンク
これはとてもシンプルです。
一番楽なのは、リンクのテキストで識別してクリックするもの。
def click_link_by_text(self, text): element = self.driver.find_element_by_link_text(text) element.click()
例えば、「auto.click_link_by_text("カヨコ")」みたいな感じです。
テキスト表示のリンクはこれでいけます。
部品7:画像に直接はられたリンク
テキストがなくて、画像に直接リンクをはったりしている場合もあるので、そういうときは、以下みたいにtitle属性に着目してみたり・・して、都度対応する必要があります。
def click_link_titled(self, name): element = self.driver.find_element_by_xpath("//a[@title='" + name + "']") element.click()
xpathの指定の仕方に慣れれば、たいてい対応できます。
部品8:識別方法がないリンク
どうしても、識別する方法が見つからない場合には、<a>タグを全部ひろって、何番目のリンクをクリックする・・みたいな手も使います。
def click_link_by_index(self, index): self.driver.execute_script("document.getElementsByTagName('a')[" + str(index) + "].click();")
これの使い方は。
auto.click_by_index(2)
とかして、HTMLの2番目のリンクをクリックします。
テキストなしに上部に画像を<a>タグで囲んだものが並んでいるアクションパネルもどきみたいなものがあるときには便利だったりします。
一回目・三回目へのリンク
今回は、クリックでした。
このテーマでは3回にわけてやっています。
1回目と3回目はこちらです。
1回目
3回目
seleniumのインストールやWEBドライバの取得等については、こちらの記事にまとめてます。
今回はこんなところで。
ではでは。