Selenium で最近ハマった3つのエラー
Seleniumを使用して、Webを3階層、再帰的にクローリングするプログラムを書いたのですが、3つぐらいハマった個所があったので、ブログに書きとめておきます。
現象1:ページを戻るとfind_elementしたelementがもうないよと言われる
エラーメッセージ:The element is no longer attached to the DOM.
原因:ページを戻ると、html内のinputタグのクラス名が動的に変わっていた。
対応方法:戻ったのち、変わったクラス名で新たにfind_element()を行う。
$driver->go->back()で戻ると、DOMが壊れるので新たに$driver->get_page_sourceから。。。
現象2:ページを戻って、send_keys()で文字を送信しても、inputタグのvalueの値が変更されない。
エラーメッセージ:なし
対応方法:$element->send_keys(文字列)で送信する前に該当のelementを
$element->clear()であらかじめ、クリアしておく。
現象3:3つの数字をsend_keys()で送信すると、2つの数字しか表示されず、ログに出力したget_value()では3つの数字が入っている
エラーメッセージ:入力できない文字があります。
原因:ブラウザー内で入力した文字列のバリデーションチェックで数字3桁であるかどうかチェックしています。で、エラーとなっているのですが、原因は保存したキャラクター形式が間違っていました。
対応方法:正しいフォーマットで入力ファイルを修正した
正しいデータのフォーマットはUTF(BOMなし)形式
間違ってたデータのフォーマットはUTF(BOMあり)形式
最初は、タイミングかなと思っていたのですが、set_implicit_wait_timeoutを使用しているし、成功している入力ファイルがあるので、タイミングでないことに気が付きました。
idは変わらないので、idでfindしてみましたが、取得できませんでした。
言い訳になるかもしれないですが、クラス名が似たような文字列で50文字ぐらいあるんです。
Selenium 使い方 ヒント集
Selenium::Remote::Driverを使って、週末の土日にコーディング&デバッグをしていて、あるエラーで躓いたときに見つけたサイトです。
Sumasriさんというシニアテストエンジニアを職業とする人が記述したサイトです。
www.softwaretestingmaterial.com
Seleniumのメソッドの使い方やそれぞれのメソッドの違い、コードのサンプル等だけではなく、エラーの対処方法やXPathとは何?といったことまで、書いてあります。
現時点で、114個のQ&Aが英語で書かれています。英語と言っても、それほど難しい単語や文法で書かれていないので、すんなり読んでいけると思います。
また、リンクを追えば、かなり詳しい情報も記載されていて、大変便利なサイトです。
これから、Seleniumを使いたい方は、のぞいてみる価値があるサイトです。
p.s.
冒頭で述べていたエラーは、なんとか自力でクリアできました。
エラーは「The element is no longer attached to the DOM.」なんですが、tableタグを1つ見落としていました。普通、tableタグ内で、テーブルヘッダ(th)タグとテーブルデータ(dt)タグが書かれていると思うのですが、
それぞれ個々にtableタグで書かれていたため、elementがないよと、エラーになっていました。orz
参照サイト:
Selenium WebDriverServerを立ち上げてみた
Selenium WebDriverは、クローリングも含めていろいろブラウザからWebの操作ができるテストツールです。WebDriverのクライアント側で対応する言語もJava,C#,Ruby,Python,Java Scriptが公式サイトから、PerlもSelenium::Remote::Driverとして、有志から発表されています。
対応するブラウザも、Firefox,Chrome,Edge,Opera,Safari,PhantomJSなどい様々なブラウザに対応しています。
今回、Selenium WebDriverを使用するのに先立ち、WebDriverServerを立ち上げてみた。
Selenium WebDriverServerのインストール&実行手順
1.Selenium Standalone Serverのダウンロード
参照サイト のSelenium Stadalone Serverのこうもくからdownload versionのVer.3.13.0(リンク)をクリックしてjarファイルをダウンロードする。
2.GeckoDriverのダウンロード
Firefox用のドライバであるGeckoDriverを参照サイトからダウンロードし、解凍する。
次に、解凍したgeckodriver.exeを実行できるパスにコピーする。
3.ファイアウォールの設定
Seleniumは、ServerとWebDriver間ではデフォルトでTCPポート:4444番号を使用するので、あらかじめ穴をあけておきます。
4.Selenium Standalone Serverの起動方法
1.のダウンロードしたjarファイルをどこかにコピーします。
2.コマンドプロンプトから、以下のコマンドを実行して、まずはハブ機能として起動します。
java -jar c:\temp\selenium-server-standalone-3.13.0.jar -role hub &
3.もう一つコマンドプロンプトを開き、以下のコマンドを実行して、ノード機能を実行します。
java -jar c:\temp\selenium-server-standalone-3.13.0.jar -role node -hub http://localhost:4444/grid/register &
実行すると、ハブ側の出力にRegistered a nodeと表示されます。
PerlでSelenium::Remote::Driverモジュールを使用したプログラムを実行したところ、簡単にServerとやりとりができました。
自動的にFirefoxが立ち上げってきました。でも、起動が10秒ぐらいかかりました。
今回のServerの立ち上げにはあまり関係ありませんが、今、読んでいる本が、「実践 Selenium WebDriver」です。
技術的にはライトな部分が多く、とっつきやすい本だと思います。ページ数は少ないですが、知っておかないと、結構、罠に引っ掛かりそうです。
参照サイト:
https://www.seleniumhq.org/download/
Releases · mozilla/geckodriver · GitHub
参考文献:
r
User32 イベントID:1074 調査してみた(暫定対策)
前回の続きで、観点を変えて、WindowsUpdateLogから追ってみることにした。
WindowsUpdateLogはC:\Windows直下にWindowsUpdate.logがある。
ファイルを開くと、https://go.microsoft.com/fwlink/?LinkId=518345このサイトを訪れなさいと、書かれてた。
リンクをクリックすると、参照サイトにリダイレクトされた。
見出しの「WindowsUpdate.logを生成します。」のGetWindowsUpdateLogをクリックすると、
内容を読むと、WindowUpdateのトレースファイルから、単一の読みやすいようにログファイルを生成してくれるようだ。
手順は、以下
・「ファイル名を指定して実行」「PowerShell」と入力し、PowerShellを立ち上げる。
・Get-WindowsUpdateLogと入力し、実行する。
・デスクトップに「WindowsUpdate.log」が生成される。
ログをエディタで開き、リブートした直前の時刻のログを確認すると、
Received power state changing notification: Old: <unknown>; New: AC.
Power state change from <unknown> to AC.
結局、原因として、電源周りに行き着いたので、今度は、対策の観点から考えてみた。
先ずは、電源オプションの設定をHIgh Performance(ASUSは独自にPowerWizという4種類の電源設定が行える)からWindows標準のバランス設定に変更した。
もう一つは、デバイスマネージャから使用しているネットワークアダプタを右クリックして、「プロパティ」「電源の管理」を以下のように変更した。
「電力節約のために、コンピューターでこのデバイスの電源をオフにできるようにする」のチェックを外した。
p.s.
WindowsUpdateログを見ると、結構、頻繁にダウンロードマネージャが動いています。それとデスクトップPC側ではFailedが頻発されてた。orz
参照サイト:
User32 イベントID:1074 調査してみた
今日、午後2時過ぎに、突然ノートPCが再起動した。暑いし、熱暴走でもしたのかなーと、流そうとしていたのだけれども、気になったので原因を調べてみた。
イベントログを確認すると、システムログにタイトルのログが出力されていました。
全般タブには
次の理由で、プロセス c:\windows\system32\svchost.exe (ASUSU24E) は、ユーザー NT AUTHORITY\SYSTEM の代わりに、コンピューター ASUSU24E の 再起動 を始めました: オペレーティング システム: Service pack (計画済)
理由コード: 0x80020010
直前のシステムログとアプリケーションログを確認しましたが、特に原因となるようなイベントは、なし。ちなみにWindowsUpdate(月例パッチ)は3日ほど前に手動で適用済み。
ネット上でイベントID 1074を検索しても、目ぼしい回答が見つからなかったので、観点を替えて、理由コード(0x80020010)で検索してみたところ、マイクロソフトのサイト(参照サイト)に理由コードのドキュメントがあったので、もう少し調査を進めてみた。
理由コード:0x80020010は、これ一つで1つの意味を表しているわけではなく、コンビネーションで複数の意味合いを持たせていた。
まずは、0x80000000 SHTDN_REASON_FLAG_PALNNED
Descriptionの記述を確認しても、英語で、シャットダウンは、計画済み。System State Data(SSD)ファイルにシステムの状態が書かれているとある。が、このファイルを生成するには、Windows Error Reportingの設定が必要とある。Windows Error Reporting(参照サイト)の設定には、レジストリを変更する必要があり、デフォルトは無効となっているようだ。
次に、0x00020000 SHTDN_REASON_MAJOR_OPERATINGSYSTEM
Operating system issue.の1行のみ。OSの問題としか書かれていない。
最後に、0x00000010 SHTDN_REASON_MINOR_SERVICEPACK
Sevice pack.の1行のみ。サービスパックの一言のみ。
結果として、電源供給のトラブルで再起動というところまでは判明しましたが、根本原因までは不明です。
User32 イベントID:1074 調査してみた(暫定対策) - gaggitのブログ
へ つづく
参照サイト:
System Shutdown Reason Codes | Microsoft Docs
Windows Error Reportを使ってプロセスがクラッシュした際のダンプファイルを取得できるようにする設定方法
Devel::NYTProfのプロファイラーを試しみた
3,4ヶ月前にPerlで200行ぐらいのコードを書いた。「Perlを最適化する
」サイトを参考にコードの最適化とスレッド化をして実行時間を短縮した。けれども、プロファイラーを使用してどこに時間がかかっているのか、知りたくなった。
先ず、Devel::FastProfというプロファイラーをインストール使用しようとしたが、失敗。cpanの公式サイトを見ると、BUGSの見出しの下にNo Windows! No threadsとあるので、Window版ではインストールできないようだ。半日かかった。orz
次に他のプロファイラに替わり、デファクトスタンドとなったDevel::NYTProfというNew York Timesの有志で作られたモジュールをインストール。
実行は、
perl.exe -d:NYTProf xxxxx.pl
実行結果は、オプションで指定しなければカレントフォルダにnytprof.outが作成される。これはDBファイルなので、そのまま見ることができず、
nytprofhtmlコマンドか、nyprofcsvコマンドを実行することによって、htmlファイルまたはcsvファイルが作成される。
どちらのコマンドも、カレントフォルダにnytprofというフォルダ内にモジュール単位にファイルが作成される。
フォルダ内にindex.htmlをブラウザで開くと、トップにグラフとその次にTop15のサブルーチン名称とコール回数や経過時間等が表形式で表示される。
最下段には、ソースファイル毎に経過時間とさらにそのソースファイルのリンクが表示される。
リンクをクリックすると、ここでも、サブルーチンごとの経過時間の表が上にあり、下段には、ソースコードの1行毎経過時間が表示される。
これは、すごい!!
p.s.
参照サイトの一番下段は、Devel::NYTProfの作成者が書いたこのプロファイラの紹介と最適化の方法が書かれています。
参照サイト:
Perl スクリプトで遅い場所を特定する方法 - Devel::Profiler / Devel::NYTProf - drk7jp
Devel::FastProf - "fast" perl per-line profiler - metacpan.org
Devel::NYTProf - Powerful feature-rich perl source code profiler - metacpan.org