Seleniumを試用 (FirefoxをPythonコードで操作試行) 結果:成功

# Seleniumを用いて、FirefoxをPythonコードから操作する試行コード

## 導入が必要なもの

**1. seleniumをpipからインストール**
　pip install selenium

**2. geckodriver.exeのダウンロードと配置**
　geckodriver.exeのダウンロードは、
https://github.com/mozilla/geckodriver/releases/tag/v0.30.0
からgeckodriver-v0.30.0-win64.zipをダウンロード、geckodriver.exeが同梱されており、当スクリプトファイルと同じ場所に配置。

## Seleniumを用いる試行コード

以下のコードは、Webサイトを表示して、HTMLのDOM要素を取得する(`browser.find_element(By.ID, ～)`)サンプルコード(test__main1)と、Firefoxウィンドウを非表示で同じ処理を操作するサンプルコード(test__main2)になります。

```python:試行コード.py
# Seleniumの試用 (Firefoxをコードで操作試行) 結果:成功

# assume: 以下、導入が必要
# ・pip install selenium
# ・geckodriver.exeのダウンロード
#     https://github.com/mozilla/geckodriver/releases/tag/v0.30.0
#     からgeckodriver-v0.30.0-win64.zipをダウンロード、geckodriver.exeが同梱、当スクリプトファイルと同じ場所に配置

# ref: Selenium を Firefox で使用する方法:
# https://qiita.com/Nw3965/items/81c29ee4e6bbf94b6e98
#
# ref: Selenium 4で「DeprecationWarning」が出る場合の対策:
# https://self-development.info/selenium-4%E3%81%A7%E3%80%8Cdeprecationwarning%E3%80%8D%E3%81%8C%E5%87%BA%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E7%AD%96/
#
# ref: Firefoxウィンドウを非表示で操作
# https://stackovergo.com/ja/q/1285949/how-to-hide-firefox-window-selenium-webdriver

import selenium
import selenium.webdriver # これも読込が必要

# sec: main

def main(): # 実行切替用
    test__main1()
    test__main2()

# Webサイトを表示・HTML DOM要素を取得
def test__main1():
    # 結果: 取得成功
    
    print("\n" + "-" * 40)
    print("selenium version:", selenium.__version__, "\n") # '4.1.0'

    # sec: driver取得 "geckodriver.exe"(Firefoxドライバ)を指定

    path_driver = r"./geckodriver.exe" # 当スクリプトファイルと同じ場所に"geckodriver.exe"を配置

    service = selenium.webdriver.firefox.service.Service(executable_path=path_driver) # "geckodriver.exe"(Firefoxドライバ)がある場所を指定
    browser = selenium.webdriver.Firefox(service=service)

    # sec: Webサイトを表示

    browser.get("https://www.yahoo.co.jp/")
    # 結果: Firefox(既定プロファイル)のウィンドウが開いて、Webサイトが表示され、成功。

    By = selenium.webdriver.common.by.By
    elem = browser.find_element(By.ID, "Today")
    print("DEBUG:", "id=Todayの要素:\n", elem, "\n")
    # 結果: <selenium.webdriver.remote.webelement.WebElement (session="2b5ab6d7-3b50-4f45-97a4-ce33917c5a65", element="399cdc72-646b-44a2-8ec8-6f734136b626")>
    print("DEBUG:", "要素のtext:\n", elem.text, "\n")
    # 結果: '本日の天気、運行情報\n2021年12月11日(土)\n今日明日の天気\n ... お知らせ\n新着があります'
    
    input("待機中。ブラウザを閉じる(Enter): ")
    
    browser.close()

# Firefoxウィンドウを非表示で操作
def test__main2():
    # 結果: 非表示成功

    import os
    os.environ['MOZ_HEADLESS'] = '1' # Firefox56以降の新機能

    test__main1()
    

# sec: entry

if __name__ == "__main__": main()
```

## 当コードで起動したFirefoxのウィンドウ外観
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/e559e236-c931-930c-8f2c-d2af3873105f.png)

## 当コード実行時のコンソール出力

Firefoxウィンドウを表示して操作(既定)、続けて、Firefoxウィンドウを非表示で操作した際の、コンソール出力例。session、elementの値だけ両者で異なり、その他は(Firefoxウィンドウが非表示でも)同じ出力になっています。

```
----------------------------------------
selenium version: 4.1.0

DEBUG: id=Todayの要素:
 <selenium.webdriver.remote.webelement.WebElement (session="c9c2b544-62b5-44f1-b556-5cddb4c6670b", element="8e192b10-c6f6-47e8-bb39-ab054b08a91e")>

DEBUG: 要素のtext:
 本日の天気、運行情報
2021年12月12日(日)
(...中略...)
お知らせ
新着があります

待機中。ブラウザを閉じる(Enter):

----------------------------------------
selenium version: 4.1.0

DEBUG: id=Todayの要素:
 <selenium.webdriver.remote.webelement.WebElement (session="a8dfea7f-777f-48b5-b2ed-2a3e90ec6985", element="c8a47710-44a1-4c7d-939a-31431cd6ea98")>

DEBUG: 要素のtext:
 本日の天気、運行情報
2021年12月12日(日)
(...中略...)
お知らせ
新着があります

待機中。ブラウザを閉じる(Enter):
続行するには何かキーを押してください . . .
```

## 参照

Selenium を Firefox で使用する方法:
https://qiita.com/Nw3965/items/81c29ee4e6bbf94b6e98

Selenium 4で「DeprecationWarning」が出る場合の対策:
https://self-development.info/selenium-4%E3%81%A7%E3%80%8Cdeprecationwarning%E3%80%8D%E3%81%8C%E5%87%BA%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E7%AD%96/

Firefoxウィンドウを非表示で操作
https://stackovergo.com/ja/q/1285949/how-to-hide-firefox-window-selenium-webdriver