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

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

詳細はこちら
Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python 3.x

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

selenium

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

Q&A

解決済

2回答

3512閲覧

seleniumで飛んだ先のサイトにあるタブ(or画像)が押せなくて困っています

mini1988

総合スコア56

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python 3.x

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

selenium

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

0グッド

0クリップ

投稿2019/09/01 06:24

編集2019/09/01 07:51

困っていること

google chromeとseleniumを使って、あるサイトをスクレイピングをしようとしています。そのサイトにログインして、飛んだ先でタブ(or画像みたいなもの?)をクリックしようとしたのですが、xpathをcopyしても、押して欲しいタグを押すような動作をしてくれません。

私がトライしたこと、考えたこと

他のボタンやタブは以下のような命令でクリックしてくれるのですが。
driver.find_element_by_xpath('...').click()

良くサイトを見ると、分割されており、私が押したいタブはログインして飛んだ先とは違うエリアに設置されており、それが原因かなとも思っています。

教えていたただきたいこと

もしこれが原因だとすれば、ログインして飛んだ先とは違うエリアに設置されているようなタブはどうすれば自動でクリックできるようになるのでしょうか?

どなたか詳しい方がいらっしゃいましたら、教えてください。

サイトの外観

イメージ説明

実行時に返ってきたエラー

タブ(or画像)みたいなものを押せずに数十秒待っていると以下のようなエラーが返ってきます。

Traceback (most recent call last): File "<ipython-input-483-91c479708b82>", line 16, in <module> driver.find_element_by_xpath("/html/body/table/tbody/tr/td/table/tbody/tr/td[9]/a").click() File "C:\Users...\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath return self.find_element(by=By.XPATH, value=xpath) File "C:\Users...\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element 'value': value})['value'] File "C:\Users...\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute self.error_handler.check_response(response) File "C:\Users...\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/table/tbody/tr/td/table/tbody/tr/td[9]/a"} (Session info: chrome=76.0.3809.132)

私が押したいタブ(or画像)の開発コード

ちなみに、chrome上で開発コードを覗くと、私が押したいタブ(or画像)の部分のコードは以下のようなものになっていました。

<a class="globalmenu" href="/ITS/frame/FraOpOrder.jsp;jgieww01=FVJ5drvDJPMpSQVXsBKwh3Jb6WCYS2gyDQbLbTYHMQhcX0y1cLtn!2113853286" target="_top" onclick="return linkCheck()"><b>項目A</b></a>

もし他に情報が必要であれば追記したいと思います。

厚かましいお願いですが、どうぞよろしくお願い致します。

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

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

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

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

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

shirai

2019/09/01 06:31

エラーを載せてください。
mini1988

2019/09/01 06:41

ご指摘いただき、ありがとうございます。追記してみました。
shirai

2019/09/01 07:01

driver.find_element_by_xpath("/html/body/table/tbody/tr/td/table/tbody/tr/td[9]/a").click()で NoSuchElementExceptionが出ていますね。 > 良くサイトを見ると、分割されており、私が押したいタブはログインして飛んだ先とは違うエリアに設置されており、それが原因かなとも思っています。 違うエリアとはどういうことでしょうか。
meg_

2019/09/01 07:32

click()する前に要素が取得できているか確認してください。そのエラーですと、要素が取得できていないように見えます。 画面遷移のときに待機処理は入れていますか?
mini1988

2019/09/01 07:36

要素自体、取れていないです。その要素をどう取ればいいのか、分からずにいます。また、待機処理は1分ほど入れても、結果は変わらないです。
guest

回答2

0

対象サイトが不明のため、違うかもしれませんがフレームの切り替えが必要かと思います。

Python

1driver.switch_to_frame(driver.find_element_by_tag_name("iframe"))

投稿2019/09/01 07:56

meg_

総合スコア10742

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

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

mini1988

2019/09/01 07:58

ご回答いただきまして、ありがとうございます。element,id,nameなどがあるはずで、できなければxpathって書けばいいやくらいに甘く思っていました。早速試したいと思います。ありがとうございます。
mini1988

2019/09/01 08:46

おかげさまで解決することができました。ありがとうございました。
guest

0

ベストアンサー

これはframeで切られている可能性が高いですね。

開発者ツールで見てDOMにframeタグが3つありませんか?
そのうち目的の画像があるframe自体のタグをdriver.find_element_by_class_nameなどで取れるなら簡単です。
ログイン後のプログラムは以下になります。

python

1driver.switch_to.frame(driver.find_element_by_class_name('画像のあるフレーム')) 2driver.find_element_by_class_name('globalmenu').click() 3driver.switch_to.default_content()

個人的な経験則でものを言いますがこのようなサイトは
どこまで遷移してもフレームですべての処理が書かれている可能性が高いです。
switch_toでそのフレームに遷移して、
別のフレームのDOMを操作したかったり、
画面自体が遷移した場合は、その都度
default_contentで手前に戻り、
またswitch_toしてください。

分かりやすく状況をつかみたいのなら。
ログイン直後に以下を打ち込んでみてください。
frame配下がごっそり抜けてるはずです。

python

1print(driver.page_source)

これがNoSuchElementException=DOMにそれが見つからないと
エラーが出ていた原因になります。

投稿2019/09/01 07:54

shirai

総合スコア1290

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

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

mini1988

2019/09/01 07:57

ご丁寧に回答していただき、ありがとうございます。今日一日ずっと分からずに苦戦していました。感謝です。アドバイスを元に、早速トライしてみます。
mini1988

2019/09/01 08:44

frame name というものが3つあり、マウスオーバーすると画面上で表示されている各エリアが反応したので、これだと思いました。それで、アドバイスいただいたようにフレームをスイッチして、デフォルトにし、画像部分をxpathで抜いてクリックすると、うまく動作できました。ありがとうございました。 driver.switch_to.frame("XXXXX") driver.switch_to.default_content driver.find_element_by_xpath("/html/YYYYYY").click() 本当にありがとうございました。アドバイスのおかげで今日一日がようやくほっとして終われそうです。 ただ、フレームをスイッチしてクリックして次の画面に遷移するまでに15秒くらい掛かっています。このようなものでしょうか?
shirai

2019/09/01 10:07

私は普段かかっても5秒くらいなので、 極端にサーバかクライアントのスペックが低いか、 あるいは何度もpythonを実行して、 Seleniumでエラーを出し続けて、 メモリにガベージがたまってる可能性があります。 PCを再起動してみてください。
mini1988

2019/09/01 21:29

ありがとうございます。再起動すると動作が早くなりました。そういうことも気にしないといけないのですね。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問