![見出し画像](https://assets.st-note.com/production/uploads/images/117700860/rectangle_large_type_2_f000e5507989ebd70715cf3cf372c712.png?width=1200)
ゆるプロ!番外編「Seleniumによる自動化、JavaScriptの実行について」
ゆるいプログラミング講座、略して「ゆるプロ!」
これは気軽に気楽に試せるゆるーいプログラミング学習コンテンツである。今回のお題は「Seleniumによる自動化、JavaScriptの実行について」
概略
なぜ、JavaScriptを実行したいのか
Webスクレイピングといえば、Beautiful Soupを使えばいいと思うがJavaScriptの実行はできなかった。SeleniumであればWebサイトに訪れて、JavaScriptを実行できるため、クライアントの操作を自動化をすることでいつもしていることに労力を割かなくてよくなると思い取り組み始めた
Seleniumによる自動化、JavaScriptの実行について
今回はサンプルとしてのプログラムなので、実行するときは必要に応じて書き換えてほしい、処理の流れについてはフローを示す。だいたいこんな感じ。
![](https://assets.st-note.com/img/1697710649485-T3LGWkKgkz.png)
例)実行プログラム
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
import time
options = webdriver.ChromeOptions()
#options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
#暗黙的な待機時間を設定する
driver.implicitly_wait(10)
# ログインページを呼び出す
URL="" #ログインのURLを入力する
driver.get(URL)
# ログイン情報
USERNAME = "" #ログインIDを入力する
PASSWORD = "" #ログインパスワード
# ログインフォームの表示を待つ
username_input = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "")) #ID入力に対応する要素のidを入力する
)
password_input = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "")) #パスワード入力に対応する要素のidを入力する
)
# テキストボックスに入力
username_input.send_keys(USERNAME)
password_input.send_keys(PASSWORD)
# ログインボタンの表示を待つ
login_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.CLASS_NAME, "")) #ログインボタンに対応する要素のidを入力する
)
# ログインボタンをクリックする
login_button.click()
# ログイン後の遷移先URLが読み込まれるのを待つ
time.sleep(5)
# Javascriptを実行したい先のURLに遷移する
driver.get("") # URLを入力する
# 遷移先のURLが読み込まれるのを待つ
time.sleep(5)
# スクリプトを実行する
script="" #実行したいスクリプトを入力する
driver.execute_script(script)
# 5秒間待つ
time.sleep(5)
driver.quit()
実行時の注意点
ログインIDとログインパスワードについてベタ打ちでコードを書いているが、こちらが実行しやすいので書いているだけであり、chatgptからも指摘は受けたのだが、ベタ打ちは万が一、個人情報が掲載されているソースコードを掲載した場合、大きなリスクがあるので代替手段を検討しよう。気になる人はchatgptに聞いてみよう。クライアントベースのプログラムだからかもしれないが、環境変数にIDとパスワードを入れては?という提案を受けた。こちらの知識がなく環境変数に入れる手段があるというのは何というか新鮮だった
また、time.sleepはSeleniumにおいては推奨されない行為であるが、自分の場合はログイン後の最後に読み込まれる要素等を識別できなかったための記述となった
まとめ
自分にとってしたかったことは実行できたのでOKとする。今回もChatgptをベースに話を聞きながらコードを構築していったが、バグは出るしコードが正しいとは限らないので、Google検索して似たような事例に取り組んでいる人の記事を参考にして裏取りをした。はじめはコードのコピペになってはしまうのだが、提案されたコードの意味が理解できないと挙動を理解できないので、実行したコードが思った挙動でないときに対処できなくなる。結果、ChatGPTやwebサイトなどを通じて、コードの理解をすることになるので、ある程度は理解が進み、自分で書き直すことになる。
余談だが、Google Bardってのが使えるようだ、ChatGPT3.5では解決できなかった話、学習期間(2021年9月までの学習)から見て未来の出来事からは参照できないことによる提案不可が、解決できるのではないかと期待している。もちろん、ChatGPTも4.5にすれば学習範囲が広がるのだろうけど、金銭的なコストを投じるかはもう少し検討したい
オープンソースを活用したプロダクトもライセンスにより売り物にしてもよいので状況によって否定はしないが、オープンソースで出来ることはオープンソースで出来る限りは進めたい。それは無償でフリーな文化は続けていくことで、基礎的な学習機会の提供になりうるからだ
※【追記】Google Bardを使ってみたが、クオリティは低いのでオススメはできない。平気でウソを提示する確率が高い。これならばChatGPT3.5の方がマシである。問題点:URLの提示に課題あり、確認はしてほしい。実行していないコードを実行したとウソを付く(かなり問題)実際に聞いてもいないのにユーザーから回答を得たと創作で作り出す。結構、課題あり。結果的に情報の信用度は低い。
参考
暗黙的な待機
visibility_of_element_located
Send keys
element_to_be_clickable
click
Execute Script
参考にしたブログ
最終手段はwaitを使った
そういえば、HTMLの属性、idとclassって別物だよねって思い出した記事、idが1回で、classが複数回使用可って忘れていた
おわり!