同じプログラムを動かしても、正しく動いたり動かなかったりして、パソコンの画面に悪態を何度もついたのですが、原因の特定に成功したのでメモ。
以下、コード。
このプログラムは、ある電子書籍サイトに、input関数で入力したタイトルの漫画があるかを調べるためのプログラムの製作過程です。
chromedriverを保存する場所は、.pyファイルの保存場所と同じにすると使いやすいです。そうでない場合は、chromedriverのファイルが保存されている場所にpathを通す必要があるようです。
(上の画像のように保存場所を同じにするのが分かりやすい)
“””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
import time
from selenium import webdriver
from bs4 import BeautifulSoup
title = input(‘title?’)
driver = webdriver.Chrome()
driver.get(‘https://video.unext.jp/book/genre/comic’)
driver.find_element_by_css_selector(“button.searchButton-hIvADS.dkIwmH”).click()
time.sleep(3)
driver.find_element_by_css_selector(“input.searchTextInput-ieLiJd”).send_keys(title)
“””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
以下のエラーの解決に時間がかかりました。
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {“method”:”css selector”,”selector”:”input.searchTextInput-ieLiJd”}
デバッグ中に不思議だったのはこのエラーが出たり出なかったりしたことです。
全く同じプログラムを動かしているのに、エラーが出たりでなかったりしたのです。
原因は、読み込み時間ですね。
コードの下から2行目にtime.sleep(3)という行を足し、画面が切り替わるのを待つ時間をとったら、エラーが出なくなりました。
コードの下から3行目のdriver.find_element_by_css_selector(“button.searchButton-hIvADS.dkIwmH”).click()のコードでボタンをクリックした後、
コードの一番最後の行で指定している“input.searchTextInput-ieLiJd”(inputタグの、searchTextInput-ieLiJdというクラス、検索したい単語を入力する欄)が現れる構造です。
そのため、読み込みの時間によっては、クリックして検索欄が現れる前に、プログラムが検索欄に当たるinputタグを探してしまい、エラーが出てしまいました。
ちゃんと読み込みの時間を確保してからは、前述のエラーは出なくなり、意図したとおりにプログラムは動きました。
同じプログラムを動かして、動くときと動かない時があるなんて、異常なので、不確定要素がある部分(今回は読み込みの時間)を速やかに疑うべきでした。反省。
まだ、目標の半分も出来ていないが、ちょっと前進しました。
もともと、sikuli以外の自動化方法を知らなかったので。
chromedriverとseleniumとpythonによるスクレイピングは楽しいので、これからも遊んでいこうと思います。
Qiitaと公式リファレンスが参考になりました。
Udemyの動画も参考にしました。
Udemyについては、こちらの記事も参照。