Python UIテストができるselenium

Python学習【365日チャレンジ!】194日目のマスターU(@Udemy11)です。

日曜日というとやっぱり【半沢直樹】ですよね!

まいどまいど追い詰められまくる半沢直樹ですが、最後には必ず倍返しをすることがわかっているのにみてしまうんですよね。

ほんと予定調和の水戸黄門と同じく、勧善懲悪の物語ってめっちゃスッキリするので、結末がわかっているのに思わず力が入ってしまいます。

ドラマをみてから本を読むとより臨場感が感じられて楽しみが一層増しますよ。

それでは、今日もPython学習をはじめましょう。

昨日の復習

昨日はUIテストができるseleniumで、Python.orgを表示するテストをしてみました。

これまでのテストはメインのファイルがありましたが、テストファイルだけを作成しました。

seleniumはWebサイトのテストで、実際に存在するPython.orgをWebブラウザーで開いて閉じるだけの簡単なテストでした。

今日は、もう少し複雑なpython.orgを使った動作をselieniumでテストします。

test_ui.py

昨日に引き続き、テストファイルは、test_ui.pyです。

今日は、次のテストを実行してみたいと思います。

  • titleにPythonが含まれているか
  • Downloadメニューをクリックした先のページに指定した文字が入っているか
  • Documentationメニューをクリックした先のページに指定した文字が入っているか
  • 検索窓にPythonistaと入力した検索結果がNo results foundになっていないか

これら4つのテストを実行するコードを書いていきます。

import unittest

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait


class PythonOrgTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()

    def tearDown(self):
        self.driver.close()

    def test_python_org(self):
        self.driver.get('https://www.python.org')
        self.assertIn('Python', self.driver.title)

        self.driver.find_element_by_link_text('Downloads').click()

        element = WebDriverWait(self.driver, 10).until(
            EC.presence_of_element_located(
                (By.CLASS_NAME, 'widget-title')))
        self.assertEqual('Active Python Releases', element.text)

        self.driver.find_element_by_link_text('Documentation').click()

        element = WebDriverWait(self.driver, 10).until(
            EC.presence_of_element_located(
                (By.CLASS_NAME, 'call-to-action')))
        self.assertIn('Browse the docs online', element.text)

        element = self.driver.find_element_by_name('q')
        element.clear()
        element.send_keys('Pythonista')
        element.send_keys(Keys.RETURN)
        self.assertNotIn('No results found',self.driver.page_source)

1つ目のテストは、18行目19行目でtitleにPythonが含まれているかです。

21行目から26行目、28行目から33行目は、メニューをクリックした先のページに指定した文字列が入っているかをテストしていますが、違うのは、assertEqual(同じ)か、assertIn(含まれている)かです。

35行目から39行目が4つ目のテストで、検索窓を見つけてデフォルトで入っている文字をクリアしてからPythonistaを検索して、きちんと結果が表示される(No results foundが含まれていない)かどうかをテストしています。

コードが書けたら、実行してみましょう!

実行結果

デバッガを入れて実行すると実際の動きが見えてきますが、普通に実行すれば、あっという間に処理が完了します。

昨日同様、動画にしてみました。

コードの中にtime.sleepを入れていないので、あっという間にテストが終了しています。

試しにポイントポイントでtime.sleepを入れてみるとどのように動作しているかがわかるかと思いますので、ぜひ一度試してみてください。

見えないと不安

時間があるときにエクセルのVBAも一緒に学習しつつ、必要なマクロを作成したりしているのですが、なんと言っても処理がめちゃくちゃ早いです。

その分、動作が何をやっているか目に見えないので、ちょっと不安になりますが、そこはデバッガを使いながら、値などを確認すれば、動きも見えてくるかと思います。

処理が速いってのは非常に重要で、繰り返し行う作業などは、プログラムを組むのに時間がかかっても一度組んでしまえば、あっという間に時間を取り戻せるので、ほんとプログラムは最強です。

今は、テストでWebブラウザを操作していますが、やはりブラウザを使った自動化プログラムは利用シーンも多いので、seleniumの使い方をマスターできるよう、いろいろと試したいと思います。

それでは明日もGood Python!