🐥

Seleniumの使い方 第3回 webdriverについて(python×Microsoft Edge)

に公開

こんにちは、星杜なぎさです

1. はじめに

  • Seleniumは、Webブラウザの操作を自動化するためのツール
  • オープンソースなので、無料で利用可能
  • WebスクレイピングやRPA(Robotic Process Automation)などに活用できる

1.1 この記事について

  • SeleniumのWebDriverについて、情報が散見しているため、まとめた
  • 実際に動かして、コードのどの部分がどの動作に対応しているか確認しやすくした

1.2 対象読者

  • プログラム言語(特にpython)が多少読める、書ける
  • PCの基本操作(Drag and Dropなど)を知っている
  • Webブラウザの基本操作を知っている

1.3 動作環境

  • PC
    • OS:Windows 11 Home
  • python : 3.12.5
    • selenium : 4.31.0

2. とりあえず動かしてみるサンプルコード

まずは動かしてみよう

test_webdriver.py
from time import sleep
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By

"""
事前にEdgeのWebDriverを入手しておくこと
"""
SERVICE = Service("./edgedriver_win64/msedgedriver.exe")  # exeのPATH
TARGET_URL = "https://www.selenium.dev/selenium/web/web-form.html"

try:
    driver = webdriver.Edge(service=SERVICE)

    # 細かい待機時間の設定
    driver.set_page_load_timeout(1)  # ページ読み込みのタイムアウトの秒数を指定
    driver.set_script_timeout(2)  # スクリプトのタイムアウト秒数を指定
    driver.implicitly_wait(3)  # 要素を見つける制限時間を設定
    timeout_class = driver.timeouts
    print("Timeout設定\n"
          "implicit_wait : ", timeout_class.implicit_wait, "\n",
          "script : ", timeout_class.script, "\n",
          "class.page_load : ", timeout_class.page_load, "\n"
          )

    # URLを開く
    driver.get(TARGET_URL)  # URLへアクセスする
    sleep(1)

    # 属性
    print("driver.current_url : ", driver.current_url, "\n",  # 現在開いているURL
          "driver.title : ", driver.title, "\n",  # タブに表示されているタイトル
          "driver.page_source : ", driver.page_source, "\n"  # ページのhtmlソース
          )

    # ウィンドウ操作
    driver.set_window_rect(100, 200, 600, 400)  # windowの幅・高さ・xy座標を指定
    sleep(1)
    driver.fullscreen_window()  # フルスクリーンモードにする
    sleep(1)
    driver.minimize_window()  # windowを最小化する
    sleep(1)
    driver.maximize_window()  # windowを最大化する
    sleep(1)

    # 要素の指定
    element = driver.find_element(By.XPATH, '/html/body/main/div/form/div/div[2]/button')  # 要素を取得
    element.click()  # submitボタンを押す

    # 進む・戻る・更新
    driver.back()  # 戻る
    sleep(1)
    driver.forward()  # 進む
    sleep(1)
    driver.refresh()  # 更新
    sleep(1)

    # JavaScriptのコードを実行
    driver.execute_script("alert('Hello, World!!')")
    sleep(1)

    # alertを取得
    alert = driver.switch_to.alert  # alertオブジェクトが返る
    alert.accept()  # OKを押す
    sleep(1)

    # スクリーンショットをとる
    driver.get_screenshot_as_file('2_SC.png')  # スクショを保存
    # b64 = driver.get_screenshot_as_base64()  # base64で取得
    # print(type(b64), b64)  # 長いのでコメントアウト
    sleep(1)

    # 今のwindowにtabを開く
    driver.switch_to.new_window('tab')
    sleep(1)
    # 新規windowを開く
    driver.switch_to.new_window('window')
    sleep(1)

    # 新規タブ追加、新規ウィンドウの追加
    handle_list = driver.window_handles  # 現在開いてるhandleのlistを取得
    print("handle_list : ", handle_list, type(handle_list))  # handleは3つある
    for handle in handle_list:
        driver.switch_to.window(handle)
        sleep(1)

    driver.close()  # 今のwindowを1つ閉じる
    print("handle_list(.close後) : ", driver.window_handles)  # 1つhandleが減っている
    sleep(1)

finally:
    driver.quit()
    # 以降driverにアクセスすると、下記のエラーが発生する
    #   「ConnectionRefusedError: [WinError 10061] 対象のコンピューターによって拒否されたため、接続できませんでした。」

print("conplete run!!")

2.3 一覧表

今回使用したメソッドや属性について、カテゴリごとに分けて記載する

2.3.1 設定関連

属性/メソッド 説明
driver.set_page_load_timeout(seconds) ページロードのtimeout秒数を設定
driver.set_script_timeout(seconds) script実行時のtimeout秒数を設定
driver.implicitly_wait(seconds) 要素を見つける際のtimeout秒数を設定

2.3.2 URLへのアクセス

属性/メソッド 説明
driver.get(target_url) 指定されたURLにアクセスする
driver.current_url 現在のURLを取得
driver.title 現在のページタイトルを取得
driver.page_source 現在のページのソースコードを取得

2.3.3 ウィンドウの大きさなど

属性/メソッド 説明
driver.set_window_rect(x, y, width, height) 指定した矩形{x, y, width, height}にウィンドウの形を設定
driver.fullscreen_window() フルスクリーンモードにする
driver.minimize_window() ウィンドウを最小化
driver.maximize_window() ウィンドウを最大化

2.3.4 ウィンドウハンドルの操作

属性/メソッド 説明
driver.switch_to.new_window('tab') 新しいタブを開く
driver.switch_to.new_window('window') 新しいウィンドウを開く
driver.window_handles 現在のwindow_handleの一覧(list)を取得
driver.driver.switch_to.window(handle) 指定したhandleに移動する

2.3.5 ウィンドウを閉じる

属性/メソッド 説明
driver.close() 現在のウィンドウを閉じる
driver.quit() WebDriverのインスタンスを終了し、全てのウィンドウを閉じる

2.3.6 その他小技(JavaScriptの実行、alertの取得、スクショ保存)

属性/メソッド 説明
driver.execute_script(script) javascriptのコードを実行する
driver.switch_to.alert 現在表示されているalertを取得
driver.get_screenshot_as_file(filepath) 画面のスクリーンショットを保存する

3. まとめ

  • 動かして学ぶほうが理解が早いと感じた
  • 特に、handle周りの理解は文章だけではよくわからなかったため、
    実際に新規ウィンドウやタブを生成する動作を確認できて理解が深まった

参考URL

Discussion