🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

3回答

2223閲覧

selenium ページングの終了方法について

john_doe_

総合スコア354

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

1グッド

0クリップ

投稿2019/11/12 12:58

編集2019/11/13 10:57

seleniumを利用して、複数あるページを最後まで呼び出して、
最後まで行ったら終了する、プログラミングを検討しています。

例)
http://hoge.com/

ページ数が異なる場合もあるので、format()関数は利用せずに、
「次へ」のボタンをクリックさせることで遷移させたいと思い下記のコードで試してみました。

while True: try: next_btn = driver.find_element_by_class_name('gt_bt') next_btn.click() except NoSuchElementException: driver.quit() break

ページ送りは最後の92ページ目まで問題なくできるのですが、
ブラウザ終了の処理が上手くいきません。
おそらく、「次へ」のボタンが最後のページにも存在するためエラーとなるようです。

このような事例ではどのような対処方法がありますでしょうか?
ご教示いただけましたら幸甚です。何卒よろしくお願い申し上げます。

shirai👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/11/12 13:23

ブラウザで手動でどうやるのかをそのままプログラミングすればいいのでは? ブラウザで手動でどうやるのでしょうか?
john_doe_

2019/11/12 13:36

質問の仕方が悪かったようなので修正します。
otn

2019/11/12 13:55

ブラウザで手動でどうやるのかをそのままプログラミングすればいいのでは? ブラウザで手動でどうやるのでしょうか?
john_doe_

2019/11/12 13:56

手動ではやりません。
otn

2019/11/12 13:57

やらないと先に進みませんよ。
john_doe_

2019/11/12 13:59

申し訳ございませんが、質問の意味が理解出来ませんので、ご放念くださいますようお願い致します。
otn

2019/11/12 14:06

手動でやる場合、何らかの表示で最終ページであることを知ると思いますが、そういう表示を探しましょう。 という表現ならわかりますでしょうか?
john_doe_

2019/11/12 14:09

ご丁寧にありがとうございます。理解できました。 最後のページであることの表示を見つけられずにおります。。。
otn

2019/11/12 14:17

なるほど。 そうすると、 > 「次へ」のボタンが最後のページにも存在するためエラーとなるようです。 ということなので、そのエラーがPythonの例外ということなら、 except NoSuchElementException: に追加すればいいと思いますが、そうではないのでしょうか? どういうエラーですか?
john_doe_

2019/11/13 07:57

下記のエラーが発生いたしました。 WebDriverException: Message: disconnected: Unable to receive message from renderer (Session info: chrome=78.0.3904.97)
guest

回答3

0

ベストアンサー

NoSuchElementExceptionは起こりません。
なぜなら最終ページでもDOM上にはclass属性がgt_btの要素が存在するからです。

最終ページで次へを押そうとしたときに起こるエラーメッセージを見てください。
ものによって異なりますが、おおよそ以下の3つのどれかだと思います。
・ElementClickInterceptedException
・ElementNotInteractableException
・StaleElementReferenceException

それをexceptの条件に書いてやれば動くはずです。

python

1from selenium.common.exceptions import 3つのうちどれか 2 3while True: 4 try: 5 next_btn = driver.find_element_by_class_name('gt_bt') 6 next_btn.click() 7 except 3つのうちどれか: 8 driver.quit() 9 break

投稿2019/11/13 03:22

shirai

総合スコア1290

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

john_doe_

2019/11/13 07:56

ご丁寧にご教示いたただきまして誠にありがとうございます。 ページング時のエラー処理のパターンが理解できて大変助かります。 今回は下記エラーメッセージが出ました。 WebDriverException: Message: disconnected: Unable to receive message from renderer (Session info: chrome=78.0.3904.97)
shirai

2019/11/13 08:10

そのエラーでそのままググってみました。 検索結果上位3つのページは北米版teratailのようなサイトでした。 英語で書かれていましたが、どうやらいずれのサイトでも バージョンの違いに起因して起こる問題だと指摘があるようです。 英語が詳しく読めないので良く分からないですが、 seleniumのバージョン関連でよくあるエラーは 1. chromedriverとchromeのバージョン互換に問題がある 2. chromeのバージョン自体が古く(もしくは新しすぎて)  スクレイピング対象サイトでは対応していない が挙げられます。 かなりしんどい作業ですが色々とバージョンを変えて 試すほかありません。
john_doe_

2019/11/13 09:03

ご親切にお調べまでいただき大変恐縮です。 再度、プログラムを回してみて、同じエラーが出るか試してみたいと思います。 ありがとうございました。
john_doe_

2019/11/13 10:11

DOM上にclass属性がgt_btの要素が存在するので、無限ループになってしまっていました。 総ページ数を確認して、format()関数を利用することで対処したいと思います。 num = driver.find_element_by_class_name('total').text num = int(num) for i in range(1,num+1) : driver.get('http://hoge/{}'.format(i))
guest

0

  1. URLでページを指定できる場合、ページが存在するかどうかで判断できます(例:teratail)
  2. 最終ページに到達しても何一つ変化しない場合は、そのページを処理したことがあるかどうかで判断できます。

投稿2019/11/12 14:22

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

john_doe_

2019/11/13 10:33

ご親切にご教示いたただきましてありがとうございます。 1.のやり方については大変参考になりましたので、活用させていただきます。
guest

0

DOM上にclass属性がgt_btの要素が存在するので、無限ループになってしまっていました。
総ページ数を確認して、format()関数を利用することで対処しました。

num = driver.find_element_by_class_name('total').text
num = int(num)
for i in range(1,num+1) :
driver.get('http://hoge/{}'.format(i))

やり方としてはスマートではないかと思います。。。

投稿2019/11/13 10:35

john_doe_

総合スコア354

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問