python selenium error・警告集
1. 目次
1.1. ModuleNotFoundError
“ModuleNotFoundError: No module named ‘selenium'”というエラーはseleniumだけとは限りませんが、このエラーが発生する場合は、Seleniumが正しくインストールされていない可能性があります。pipを使用してSeleniumのインストールを試してください。
pip install selenium
1.2. WebDriverException
“WebDriverException: ‘chromedriver’ executable needs to be in PATH.”というエラーが発生する場合は、ChromeDriverのPATHが正しく設定されていない可能性があります。zipファイルを解凍していない可能性もあるため、このエラーが発生した場合は、ファイルを確認してください。また、パスの設定をするのがめんどくさい場合は、webdriver_managerを利用することをお勧めします。
1.3. NoSuchElementException
要素が見つからない場合に発生します要素が存在しないか、ページがまだ読み込まれていない可能性があります。time.sleep()やWebDriverWait()を使用して、要素が完全に読み込まれるのを待つことができます。例えば、次のようにコードを記述します。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//button[@id='myButton']")))
element.click()
1.4. StaleElementReferenceException
“StaleElementReferenceException: stale element reference: element is not attached to the page document”というエラーが発生する場合は、要素が既に変更または削除されている可能性があります。forループを用いて、リンクごとにbrowser.get()を行おうとすると発生する可能があります。以下のように修正すればエラーをなくすことができます。
links=[i.get_attribute("href") for i in driver.find_elements(By.TAG_NAME,"a")]
for link in links:
browser.get(link)
#その後の処理
1.5. find_elements_by_* commands are deprecated. Please use find_elements() instead
find_elements_by_* commands are deprecated. Please use find_elements() insteadという警告が発生することがあります。警告が発生する理由はseleeniumが3から4にバージョンを更新したときに、要素を探すときには find_elements_by_*()ではなく、find_elements()が標準になったためです。
1.6. AttributeError: ‘list’ object has no attribute ‘xxxxx’
AttributeError: ‘list’ object has no attribute ‘xxxxx’のエラーのxxxxxにはclickやsend_keysなどが入いります。このエラーの原因は、find_elements_by_*またはfind_elementsを使って複数の要素を探索して、リストが格納されているためです。エラーを回避する場合は、forループを用いるか、インデックス番号を指定するという方法があります。以下に例を示します。
for i in driver.find_elements(By.TAG_NAME,"a"):
if i.get_attribute("href") in "不等式":
i.click("a")
#その後の処理
break
aタグのリンクに不等式という単語が含まれているときにクリックする処理になっています。
driver.find_elements(By.TAG_NAME,"a")[0].click()
探索した要素のインデックス番号が0の要素をクリックする処理になっています。