walnuts1018 / Vaccine_reservation_for_V-yoyaku

1 stars 0 forks source link

#自分用メモ カレンダーを閉じれない #4

Open walnuts1018 opened 3 years ago

walnuts1018 commented 3 years ago

・カレンダーの閉じるボタンにおいて、要素がクリックできないというエラーが出る。

・time.sleepすると、閉じるボタンを押すところではエラーが出なくなるが、その後の処理で上に要素があって押せないというエラーが出ていることからカレンダーがちゃんと閉じられてないと予想される。 GUIモードで動かすときちんと動いている。

???

argki commented 3 years ago

ヘッドレスモードで複数会場を検索した際、同じような現象が再現されました。

随所にあるこのようなコードは、ヘッドレスモードのためにあるものだと思っていますが、必要な理由は理解できていません。 https://github.com/Jug1018/Vaccine_reservation_for_V-yoyaku/blob/8f7162027f2df33c9ba8fa489eac1bb5c2d8d320/reservation.py#L358

こちらを削除するとうまく動作するようですが、関係ありますか?

walnuts1018 commented 3 years ago

なるほど。

そのコードはウィンドウより外にあり表示しきれていないボタンを押すためにスクロールするコードです。

例えばログイン画面においてはテキストボックスがだいぶ下にあるのでスクロールして押下出来るようにしています。

今回そこにそのコードを入れたのは、その直後にあるボタン押下処理で、「Element is not clickable at point」というエラーが出たために、待機処理と併せて入れてみたものです。

スクロール処理がなくても正常に動くようであれば削除しても問題はありません。

こちらの環境でもその行を削除してテストしてみましたが、閉じる処理は上手く行きましたが、やはり"#btn_Search_Medical > font").click()においてElement is not clickable at pointが出てしまいます......

多分ですがこのエラーはWindowsSizeに依存する可能性があります。

argki commented 3 years ago

ご教示ありがとうございます。 確かに、レスポンシブデザインになっているのでスクロールすべき量はWindowsSizeに依存するかもしれませんね。 ヘッドレスモードのオプションでで固定化できると嬉しいんですが...

walnuts1018 commented 3 years ago

調べてみるとヘッドレスモードだと800,600に固定されているようです。これが原因でヘッドレスモードとGUIモードでの挙動の差が生まれることがあるそうです。

driver.set_window_size(a,b)で固定できるようですが..... 環境のスクリーンサイズよりも大きな値に出来ないという情報もあるようで、これがヘッドレスモードにも適用されるのかは不明です。

ちなみに最初の閉じれないエラーもGUIモードにすると正常に動くんですよね。(指摘のスクロール処理はそのまま)

ヘッドレスモードにするとOther element would receive the clickとなります。

閉じる処理においてはエラーが出ていないのに閉じれていない事が不思議です......

walnuts1018 commented 3 years ago

一応画面サイズを固定してみたのとスクロール処理を微調整するとこちらの環境では動くようになりました。他の環境でも動作するかは不明です。 https://github.com/Jug1018/Vaccine_reservation_for_V-yoyaku/commit/2e7bdbeaf3fbb48f92cc35e5020ac3d1155ce08c

walnuts1018 commented 3 years ago

しばらく放置しているとやはりエラーが出てしまいました。 Element <button type="button" class="close btn-modal-calendar-close" aria-label="閉じる" id="btn_calender_modal_close">...</button> is not clickable at point (924, 49). Other element would receive the click: <div class="loadingMsg">...</div>

loadingMsg.....?カレンダーの読み込み画面でしょうか?

読み込みが完了していなくても閉じるボタンはその下に存在するので、要素が存在するまでwaitする処理https://github.com/Jug1018/Vaccine_reservation_for_V-yoyaku/blob/2e7bdbeaf3fbb48f92cc35e5020ac3d1155ce08c/reservation.py#L349 が正しく機能しませんね......どうしたものか.....

argki commented 3 years ago

とりあえず https://github.com/Jug1018/Vaccine_reservation_for_V-yoyaku/commit/2e7bdbeaf3fbb48f92cc35e5020ac3d1155ce08c で問題なく動くことは確認しました。 私も、WebDriverWaitが機能するときとしない時があって気になっていました。 おそらくもう少し待ってあげれば例外発生することはないんでしょうけれど。 try:で囲んでリトライするとかですかね。 すべての箇所に記載するのは煩わしいのでまずは https://github.com/Jug1018/Vaccine_reservation_for_V-yoyaku/commit/8beebedaa9f57cdb9bbc6dfe8d57a46bfeeaeee7 で関数化しました。

walnuts1018 commented 3 years ago

クリック書rまで合わせて関数化し、waitしていなかった所もきちんとwaitするようにしていただけたのですね。ありがとうございます。

https://github.com/Jug1018/Vaccine_reservation_for_V-yoyaku/commit/875beddb167033199cae7b5afa0839140f0213ad でwait処理の基準を最後に読み込まれる○×によって判断するようにしてみました。 これでうまく行くといいのですが...

argki commented 3 years ago

モーダルウィンドウ内の情報を取得し終えるまでは他の処理を受け付けないようになっているかもしれないので、効果あるかもしれませんね。

あと、timeモジュールではwaitでなくsleepですね。引数も必須だと思います。

walnuts1018 commented 3 years ago

あ、完全にミスしました。ご指摘ありがとうございます。