Seleniumでスクレイピングをしている際に、今まではブラウザを起動して実行されてるの見てましたが、
プログラムも正常に動くようになってきたので、
もうそろブラウザ起動せずに実行できるようにしようと思い、headlessモードに切り替えましたが、
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element
が出てきてしまったので、その対処方法をまとめます。
原因
まず、ブラウザ起動するのと、headlessで実行するでは、処理時間がheadlessの方が早いです。
基本的な原因は対象要素がまだ出てきてないのに実行されてしまっているのが原因と考えられます。
対策
暗黙的な待機を入れることで要素が表示されるまでの、待機時間を入れることで対処できるようになります。
以下例です。
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
url = "接続したサイトのURL"
browser.get(url)
browser.find_element(By.CLASS_NAME, "取得したいclass名")
ここで以下のようなエラーが出たとします
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".class名"}
ここでまだ取得したいclass名の要素が存在しないことがエラーメッセージから確認できます。
browser.get(url)を実行した際に、まだ要素が出てきていないのに次の処理が実行されてしまっていることが原因です。
以下のようにプログラムを修正します。
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
url = "接続したサイトのURL"
browser.get(url)
browser.implicitly_wait(3)
browser.find_element(By.CLASS_NAME, "取得したいclass名")
implicitly_wait(3)というのは、全ての要素が出てくるまで最大3秒待ちますという意味です。
これにより、取得したい要素が出てくるまで待つことができるので、
どこかのサイトに移った後に入れるのが良いかと思います。