スリ飯屋Malankaのフリーエンジニアな日々

IT実務未経験から約1年、東京でフリーランスのRuby on Railsエンジニアに転職。約2年半、大阪中崎町でスリランカカレーの間借りしてました。フリーランスエンジニアになるためのノウハウ、スリランカの事を発信していきます。

【Ruby Selenium】wait.untilブロックでTimeoutしたら外側にraiseされる

【Selenium】wait.untilブロックでTimeoutしたら、waitの外側にraiseされる

こんにちは、mahです。

このブログでは、僕がIT未経験から約1年でフリーランスエンジニアになるまでの過程、ノウハウなどを書いていきます。


今回は、

  • Seleniumの、wait.untilブロックでTimeoutしたら、waitの外側にraiseされる

についてです。


Seleniumリファレンス


Seleniumクイックリファレンス


概要


Seleniumは、

find_element(s) というメソッドで要素を検索し、

要素が見つからなければエラーが発生します。


Seleniumのブラウザ処理は高速なので、

ページ上に要素が現れていない状態でも、

次々にクリックやページ遷移をしていきます。


ただそれだとエラーになるので、

  • 「特定の要素がページに表示されるまで、一定時間待機する」

という処理を加えて、

エラーを防止するのが定石です。


その待機時間を過ぎた場合は、

Selenium::WebDriver::Error::TimeoutError

が発生します。


このタイムアウトエラーの例外処理でハマりました。


コードで説明します。

ダメだったコードの例


def sample
  driver = Selenium::WebDriver.for :chrome

  # タイムアウトまでの時間
  wait = Selenium::WebDriver::Wait.new(timeout: 60)

  wait.until do
    driver.find_element(:id, 'search-result')&.displayed?
  rescue Selenium::WebDriver::Error::TimeoutError => e
    raise Selenium::WebDriver::Error::NoSuchElementError
  rescue Selenium::WebDriver::Error::NoSuchElementError => e
    Rails.logger.error <<~EOS
      エラー
      #{e}
    EOS
    nil
  end
end


上記のコード、wait.untilブロックの中の

driver.find_element(:id, 'search-result')&.displayed?

で、find_elementで要素が見つからなかった場合、

Selenium::WebDriver::Error::TimeoutError が発生します。


発生したSelenium::WebDriver::Error::TimeoutErrorは、

  • 直下のrescueで補足される

と思っていたが、そうではなかった。


これに気づくのにめちゃくちゃ時間がかかりました笑


調べていくと、

  • wait.untilブロックの外側

にraiseされていました...


なので、下記のようにすれば捕捉出来ました。


修正したコード


def sample
  driver = Selenium::WebDriver.for :chrome

  # タイムアウトまでの時間
  wait = Selenium::WebDriver::Wait.new(timeout: 60)

  wait.until do
    driver.find_element(:id, 'search-result')&.displayed? # ここで例外が発生しても直下のrescueでは捕捉出来ない
  rescue Selenium::WebDriver::Error::TimeoutError => e
    raise Selenium::WebDriver::Error::NoSuchElementError
  rescue Selenium::WebDriver::Error::NoSuchElementError => e
    Rails.logger.error <<~EOS
      エラー
    EOS
    nil
  end

# 外側にrescueを追加。wait.untilブロック内で発生した例外は、ここにraiseされるのでここで捕捉出来る
rescue Selenium::WebDriver::Error::TimeoutError => e
    Rails.logger.error <<~EOS
      waitブロックでのエラー
      #{e}
    EOS
  nil
end


これでタイムアウトした場合も、

スクレイピングがエラーで止まってしまわないよう、

処理を継続するように出来ます。


例外処理は、

  • どこで発生しているのか

  • どこに投げられる(raiseされる)のか

  • どこで捕捉(rescue)出来るのか


これらを意識するのが大事ですね。




以上、

  • Seleniumの、wait.untilブロックでTimeoutしたら、waitの外側にraiseされる

についてでした。


少しでも同じ問題で困っている方の参考になれば幸いです。


そもそも、

  • 「RubyやRailsってよくわからない」

という方は、

udemyというオンライン動画学習サービスを使って、学ぶことをオススメします★

はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう

はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう


フリーランスエンジニアとして、RubyやRuby on Railsの案件を獲得する方法


最後に、

  • フリーランスエンジニアとして、RubyやRuby on Railsの案件を獲得する方法

を紹介します。


4つあります。


  1. 知人の繋がりで紹介してもらう

  2. Web上やSNSなどで直営業をかける

  3. 自分でWebサービスを立ち上げる

  4. フリーランス専門エージェントに紹介してもらう


色々ありますが、一番手っ取り早いのは、


  • 4. フリーランス専門エージェントに紹介してもらう

ですね。


登録しておくだけで、

自分にマッチした、RubyやRuby on Railsの案件を紹介してくれます。


さらに、エージェントを複数使っておけば、より多くの案件を紹介してもらえるので、

これを利用しない手はありません。


僕が今使っているのは、



です。


中でもおすすめは下記の2つ。


1. エミリーエンジニア

  • 「常駐5日でしっかり稼ぎたい」

  • 「はじめてのフリーランスで不安」

という方の案件探しにぴったりのエージェント★

>> エミリーエンジニアに話を聞いてみる <<


2. フォスターフリーランス

  • 業界20年の超老舗で、常時5000件以上の案件を保有

>> 業界20年の超老舗、フォスターフリーランスに話を聞いてみる <<

www.malanka.tech



他の各エージェントさんについては、

下記の記事で詳しく解説しています。


www.malanka.tech


www.malanka.tech


www.malanka.tech


www.malanka.tech


参考までにエージェントさんの比較表を貼っておきますね。

エージェントの比較表

*横にスライド可

エージェント名 支払いサイト(報酬振込日) 案件保有数 案件の種類 特徴 マージンの公開
❶ギークスジョブ 25日(月末締め翌15日支払い) 非公開 常駐週5メイン
  • レンタルサーバーやクラウドサービスの割引
  • スキルアップの学習支援
  • セミナーの優先招待
  • 人間ドッグの受診割引など
  • 非公開
    ❷エミリーエンジニア 30日(月末締め翌月末日支払い) 非公開 常駐メイン
  • 利用者の4人に1人が、はじめてのフリーランス
  • 利用者の5人に1人が、年収1000万以上
  • 平均年収819万円
  • フリーランスでも利用出来る福利厚生(補償制度や健康診断など)
  • 非公開
    ❸レバテックフリーランス 30日(月末締め翌月末日支払い) 常時1100件以上 常駐メイン
  • 業界最大手
  • ベンチャー案件が豊富
  • エンジニア勉強会の開催
  • Lineでのスムーズなやりとり
  • 非公開
    ❹フォスターフリーランス 30日(月末締め翌月末日支払い) 5000件以上(非公開案件含む) 常駐週5メイン
  • 業界20年の老舗
  • 15,000人以上のフリーランスITエンジニアが登録中
  • 常時5000件以上の案件保有
  • ITエンジニアのためのセミナーやイベント開催
  • 非公開
    ❺Midworks 20日(月末締め翌20日支払い) 非公開 週5に加え、週3やリモートも豊富
  • 業界屈指の低マージン(10〜15%)
  • マージンを公開してくれるという安心感
  • 正社員同等の福利厚生
  • 交通費や書籍代の支給有
  • 10〜15%(公開)




    このブログでは、

    僕がIT未経験から約1年でフリーランスエンジニアになるまでの過程、

    ノウハウなどを書いています。




    初めての方は下記のオススメ記事もどうぞ


    www.malanka.tech


    www.malanka.tech


    www.malanka.tech


    www.malanka.tech


    www.malanka.tech




    最後までお読み頂きありがとうございました★


    もしよかったらTwiiterのフォローもお願いします★