※この記事は、個人技術ブログ CodeArchPedia.com の技術メモ(要約)です。
Seleniumを使ってWebスクレイピングやE2Eテストを書いていたら、急に AttributeError: 'WebDriver' object has no attribute 'find_el' に遭遇しました。最初は単純なタイプミスだろうと軽視したのですが、現代的なSeleniumの書き方への移行と絡めて、コードの堅牢性を上げる良い機会だと捉え、調査とリファクタリングを行いました。
何が起きたか(課題)
このエラーが発生した際の主な問題点は以下の通りです。
-
find_elという存在しないメソッドを呼び出していた。 - 古いバージョンのショートカットメソッド(
find_element_by_idなど)を使っていた、もしくはそれらを混ぜて使っていた。 - エラー自体はタイプミスだが、実際の自動化コードの失敗原因の多くは要素のロード遅延に起因する
NoSuchElementExceptionである。
どう解決したか(概要)
解決の核は、メソッド名の修正と、Selenium 4以降で推奨される統一された検索戦略への移行です。
- タイプミスを修正し、
driver.find_elementを使用する。 - 検索戦略を
Byクラスで明示的に指定する形式に統一しました。例えば、IDで探す場合はdriver.find_element(By.ID, "username")と記述します。これにより、コードの意図が明確になります。 - さらに、Webアプリケーションのロードの不確実性に対応するため、
WebDriverWaitを導入しました。これは要素がDOM上に現れるのを最大N秒間待機する仕組みです。
例えば、安全に要素を見つけてテキストを入力する関数を独自に作成し、この待機処理を組み込みました。
効果(Before/After)
この修正により、タイプミスによるクラッシュがゼロになっただけでなく、自動化スクリプトの実行安定性が大幅に向上しました。手動で time.sleep() を入れていた部分をすべて WebDriverWait に置き換えた結果、テスト実行時間が最適化され、不安定な要素ロードによるテスト失敗が減少しました。
| 項目 | 修正前(タイプミスあり/固定待機) | 修正後(モダンAPI/明示的待機) |
|---|---|---|
| エラー発生率 | 高(タイプミスとロード遅延) | ほぼゼロ |
| コード可読性 | 低(ショートカットが混在) | 高(Byクラスによる統一) |
| 実行安定性 | 不安定 | 非常に安定 |
🚀 詳細な設定とコードはこちら
具体的なWAFのルール設定や、より詳細なログ解析データは元のブログで公開しています。