"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

自動的に何かをクリックする/WebアプリケーションRPA/python3

f:id:arakan_no_boku:20190914133925j:plain

Webアプリケーションを自動化して使う3回シリーズの2回目です。

今回は何かをクリックする行為に関わる部分です。

目次

記事の前提:今回はクリックです

Python3とSeleniumを使います。

インストール環境設定はできている前提で話をすすめます。

まだの場合は、こちらでインストールと環境設定を行う必要があります。

arakan-pgm-ai.hatenablog.com

記事は3回にわけて書いていきます

自分はSeleniumはよく使いますが、全面的な自動化などはしていません。

全面的な自動化を目指すと、自動化自体のテストや保守コストの負担が重いからです。

テストで何回も繰り返す面倒なところだけ部分的に自動化してテストが終われば使わなくなる使い捨てツール的に使って便利な部分だけ記事に書くスタンスです。

長くなるので、3回にわけます。

  • 1回目:入力したり、選択したりのTipsあれこれ(今回)
  • 2回目:何かをクリックする場合のTipsあれこれ(9/24火曜日公開予定)
  • 3回目:Webアプリの値を参照したり、スクロールしたり他Tips(9/26木曜日公開予定)

今回は、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の指定の仕方に慣れれば、たいてい対応できます。

kurozumi.github.io

部品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回目

arakan-pgm-ai.hatenablog.com

3回目

arakan-pgm-ai.hatenablog.com

seleniumのインストールやWEBドライバの取得等については、こちらの記事にまとめてます。

arakan-pgm-ai.hatenablog.com

今回はこんなところで。

ではでは。

#python