1. アクションシナリオとそのシーケンス
自動化シナリオを計画し始めるとき、重要なのは簡単なことからだんだんと複雑なことに進むということを理解することだよ。 スクリプトを、ウェブサイトのページを旅する英雄だと想像してみて。 一歩一歩が計画的で注意深く設定されてるから、間違った道に行かないようにできるよ。
自動化のステップバイステップシナリオ作成
最初に計画を立てることから始めよう。 何を達成したい? ページを読み込む? フォームを記入する? ボタンをクリックする? こんな言葉があるじゃない:「計画しない人は、失敗を計画している」。失敗はしたくないよね。だから推定のステップをリストアップしよう!
from selenium import webdriver
from selenium.webdriver.common.by import By
# ドライバーのインスタンスを作成。ブラウザに合ったドライバーを使おう。
driver = webdriver.Chrome()
# ページを開く
driver.get('https://example.com/login')
# ユーザー名を入力
driver.find_element(By.NAME, 'username').send_keys('my_username')
# パスワードを入力
driver.find_element(By.NAME, 'password').send_keys('my_secure_password')
# ログインボタンをクリック
driver.find_element(By.ID, 'login-button').click()
こうしてスクリプトのダンスのリズムを整えていくんだ。それぞれのシナリオステップが順番に実行され、スクリプトがサイトをスムーズに移動できる。
実行ステップのログ記録
自尊心のある英雄のように、スクリプトもどこに行ったか何をしたかを記録すべき。 ログ記録はスクリプトの日記みたいなもの。それにより、ステップの実行を追跡したり、何か問題が起こったときにミスを特定できる。
import logging
# ログを設定する
logging.basicConfig(level=logging.INFO)
# アクションログの例
logging.info("ログインページを開く")
driver.get('https://example.com/login')
ログ記録はデバッグに役立つだけでなく、スクリプトが適切に各ステップを実行している安心感を与えるよ。 何かがおかしくなった場合でも、その瞬間に何が間違ったのか追跡確認できるよ。
2. 読みやすさとコードの変更のための構造化
シナリオがより複雑になると、コードを整理することが重要になる。 例えば、大規模な祝賀会で多くのゲストと料理がある状況を想像してみてよ。 もし全てのものが適切な場所になかったら、カオスになるでしょ。 コードでも同じことが言えるんだ。
コード構造の設定
コードを最小限の努力で変更するには、よく組織化された状態である必要がある。 ソックスを整理するように、すべてを秩序立てるべきだよ。 繰り返されるアクションは関数を使って独立したブロックに分けよう。
def login_to_site(driver, username, password):
logging.info("ログインを入力")
driver.find_element(By.NAME, 'username').send_keys(username)
logging.info("パスワードを入力")
driver.find_element(By.NAME, 'password').send_keys(password)
logging.info("ログインボタンをクリック")
driver.find_element(By.ID, 'login-button').click()
# サイトにログインするための関数を使用
login_to_site(driver, 'my_username', 'my_secure_password')
関数を使用することでコードがさらにすっきりし、例えばログインボタンのID
が変更された場合でも、
コード全体を修正する代わりに、1つの関数内で修正するだけで済むから便利。
3. 例: ウェブサイトでの購入プロセスの自動化
ウェブサイトでの購入プロセスを自動化するのに必要な以下のステップを設定すると仮定しよう:
- ウェブサイトを開いてアカウントにログインする。
- 商品カタログに移動して商品をカートに追加する。
- カートに行って購入を完了する。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# ドライバーを設定する初期化関数
def initialize_driver():
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 暗黙的な待機
return driver
# アカウントにログインする関数
def login(driver, username, password):
driver.get("https://example.com")
driver.find_element_by_id("username").send_keys(username)
driver.find_element_by_id("password").send_keys(password)
driver.find_element_by_id("login_button").click()
# 商品カタログに移動しカートに追加する関数
def add_product_to_cart(driver):
driver.get("https://example.com/catalog")
product = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "product_item"))
)
product.click()
add_to_cart_button = driver.find_element_by_id("add_to_cart")
add_to_cart_button.click()
# カートに移動して購入を完了する関数
def checkout(driver):
driver.get("https://example.com/cart")
checkout_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "checkout"))
)
checkout_button.click()
# ドライバーを終了する関数
def close_driver(driver):
driver.quit()
# 行動シーケンスを実行するためのメインスクリプト
def main():
# データ設定
username = "myusername"
password = "mypassword"
# ドライバー初期化
driver = initialize_driver()
try:
# サイトログイン
login(driver, username, password)
# カタログ移動とカートへの商品追加
add_product_to_cart(driver)
# カートへ移動し購入
checkout(driver)
finally:
# ドライバー終了
close_driver(driver)
# メインスクリプトを実行
main()
関数の説明
-
initialize_driver()
— ウェブドライバーを初期化する関数。 すべての要素に対する暗黙的な待機を設定し、ドライバーオブジェクトを返す。 -
login()
— サイトログインを実行する関数。username
とpassword
を入力し、ログインボタンを押すアクションを行う。 -
add_product_to_cart()
— カタログに移動し、商品を選択してカートに追加する関数。 -
checkout()
— カートに移動し、購入を完了する関数。 -
close_driver()
— ドライバーの使用を終了する関数。 -
main()
— すべての行動を制御するメイン関数。 ログイン時のデータの指定、各ステップの呼び出しを行う。
このアプローチの利点
-
読みやすさ
— 各ステップが独自の関数として記述されているため、コードの理解がしやすい。 -
再利用可能性
— 個々の関数を独立して使用し、特定のアクションのみを実行可能。 -
テストの容易さ
— 各ステップを独立してテストし、正しく動作するか確認できる。 -
柔軟性
— 他の関数を簡単に追加したり、main()
内でアクションの順序を変更できる。
GO TO FULL VERSION