自動ゲームラベルの作成(3)-スクリプトエラーの処理


0.本段階での構想


selenium exceptionでは、複数のスクリプトで発生する可能性のある例外が定義されているので、エラーを処理するために使用しましょう.😀

1.更新中に発生する可能性のある例外の参照


1) NoSuchElementException


存在しないロール名を検索中に発生したエラー.ロールチェックページではなく別のページにジャンプするため、検索する要素が存在しないため、Exceptionが発生します.または、Web構造が変更されると、その要素の変更も発生します.

2) unexpected alert open


後で、リクエストの再リフレッシュ、ロール名の変更、またはロールの削除によってリフレッシュできない場合は、Alertウィンドウが作成されます.予期せぬAlertウィンドウが作成されたため、Exceptionが起動します.

3) AttributeError


空の値を取得し、その値でメソッドを実行しようとしたときに発生したエラー.この値は空です.または、要素をロードする前に値を取得してエラーを発生させます.

2.Selenium exceptionの表示


selenium.common.異常には多くの異常があり、それらを利用して上記の異常を処理します.

1) NoSuchElementException



前に述べたNoSuchElementExceptionです.エラーが発生した場合は、ページ構造が変更されたか、ページロードが完了したかを確認します.
waitなども利用でき、次回のリリースで検討します.

2) UnexpectedAlertPresentException



これは前述した意外なalert openです.alertウィンドウを閉じて、次の操作を続行する必要があります.

3) WebDriverException



Selenium WebDriver異常の基本異常.「除外」セクションでは、この例外を使用してwebdriver exceptionを処理できます.
AttributeErrorはPython Errorなので議論しません.

3.try~exceptionブロックの作成

import gspread
import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, UnexpectedAlertPresentException, WebDriverException
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager


def main():
    ...
    
    for character in character_list:
        if character == '' or character in worlds:
            continue
        base_url = 'https://maple.gg/u/'
        url = base_url + character
        try:
            driver.get(url)  # 검색 결과 페이지로 이동
        except UnexpectedAlertPresentException:
            print("일시적인 오류이거나 캐릭터명이 변경 혹은 삭제되었습니다.")
            driver.get(url)
        except WebDriverException:
            print("웹 페이지 로딩 중 오류가 발생했습니다.")
            continue

        try:
            refresh = driver.find_element(by=By.XPATH, value='//*[@id="btn-sync"]')  # 갱신버튼 가져오기
        except NoSuchElementException:
            print("올바르지 않은 캐릭터명이거나 올바르지 않은 경로입니다.")
        else:
            try:
                refresh.click()  # 갱신버튼 클릭
            except AttributeError:
                print("웹 페이지 로딩이 완료되지 않았거나 일시적인 오류입니다.")
        time.sleep(15)  # 갱신 시간 기다림


if __name__ == '__main__':
    main()
  • driver.get():Web Driver Exceptionが異常です.Webページのロード中に複数のエラーが発生する可能性があります.アラートがまだ存在する場合、ページのロードに問題が発生した場合は、それをUnexpectedAlertPresentExceptionと見なします.
  • refresh = driver.find_element():更新ボタンの経路が正しくない場合は、NoSuchElementExceptionを使用して例外処理
  • refresh.click():更新ボタンが存在する場合は、をクリックします.alertウィンドウまたはattributeErrorが発生する可能性があるため、各ウィンドウで例外処理が行われます.
  • 4.次の悩み


    time.無計画にsleep()を待つよりもきれいに更新を待つ方法はありますか?🤔

    5. Reference


    Selenium 4.1.0 documentation