seleniumのブラウザ自動化ツール、seleniumですがC#で製作したモバオク自動再出品ツールが、クリック一つで動作するのが気に入ってずっと使ってたのが急に先日動作しなくなりました。
これはモバオク自動再出品ツールに限らず、C#でseleniumでウェブスクレイピングをしてる人たち全体に該当するのでは、と思ってブログにしてみます。
結論から
結局2日ほどみっちり調べて修正を試みてたのですが、wait.untilというスクレイピング中に要素を確実に取得するものがうまく動かず、そこだけ課題として残って、あんまり時間をかけすぎるより他の言語で動作はしないか?という方向に向かって、rubyやpython、perlなどでも同じツールを作っていたのでrubyのソースコードを改良して、しっかりと動作するものを作り直ししました。
C#版はruby版が動作することから余暇で手を入れていって動いたらまた使う、といった感じにしていきます。
(おかげさまでブログを書いている途中で突然ひらめいて直したらC#版も動くようになりました。)
なんで急に動かなくなったのか
アップデートも何もしてません。chromedriverは頻繁に更新されて、バージョンを合わせないと動作しなくなるのは日常だったのでそれは無関係でしょう。
久々にVisual Studio.NET community Editionで開いてみると、netcoreapp3.0が古いから、のような記載がありました。
元々動作していて急に動かなくなったC#のソースコード
動かなくなる前まではこれで動いていた状態です。
原因はなんなのかというと、netcoreapp3.0が古いから3.1を使いなさい、とビルドしてみたら出てきました。これは簡単です。新しいプロジェクトを生成してnetcoreapp3.1を使う、としてまったく同じソースコードでビルドすればいいだけだからです。
それと赤い下線~~~~~~~~~~~が引かれてる部分があります。ここがなんかおかしいよっていう部分なのですが。ここも原因でした。検索してるとExpectedConditionsが廃止されたので使えなくなった、と1件だけ出てきました。
ぶっちゃけここでまる2日悩んで検索とビルドの繰り返しをしてたのですが、ExpectedConditions.ElementIsVisible。これがusing OpenQA.Selenium.Support.UIで呼び出していて、
OpenQA.Selenium.Support.UI.ExpectedConditions.ElementIsVisible
と関数を呼び出していた部分が廃止されて使えなくなっていた。
とわかりました。
こちらがまる2日悩んで発見した新たに動作するソースコードです。
using SeleniumExtras.WaitHelpers;
を追加。
廃止された ExpectedConditions.ElementIsVisible を
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible
に変更。
これで動作するようになりました。
NuGetには
DotNetSeleniumExtras.WaitHelpers
を新たにインストールします。
動作しなくなった古い方のNuGetの構成はSelenium.Supportをインストールしてましたが、廃止されたので代わりにDotNetSeleniumExtras.WaitHelpersになったようです。