質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.31%
onclick

onclickとはユーザーのクリック処理を指します。これは"onmousedown"(押下)と"onmouseup"(押上)の二つの事象の組み合わせです

Python 3.x

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

selenium

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

Q&A

解決済

1回答

1777閲覧

Python:seleniumによるjavascript:void(0)のクリック方法

d-hayahsi

総合スコア17

onclick

onclickとはユーザーのクリック処理を指します。これは"onmousedown"(押下)と"onmouseup"(押上)の二つの事象の組み合わせです

Python 3.x

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

selenium

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

0グッド

0クリップ

投稿2023/02/09 08:19

編集2023/02/13 04:18

前提・実現したいこと

某Web系企業が運営する販売管理アプリをスクレイピングしたいのですが、
下記のHTMLのhref属性がhttps://~ではない為、Xpathを指定してクリックしようとしたのですが
エラーになってしまいます。

スクレイピングしたいサイトとのHTML

HTML

1<a id="link_menu_box" class="fw-btn jq-popup-open" href="javascript:void(0);"> 2 <i class="fa fa-bars"></i> 3 </a>

発生している問題・エラーメッセージ

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="link_menu_box"]"}

該当のソースコード

Python

1from selenium import webdriver 2driver = webdriver.Chrome() 3driver.get("URL") 4 5driver.find_element(By.XPATH, '//*[@id="link_menu_box"]').click()

試したこと

WebDriverWaitやtime.sleep()で時間を置いてみた。

補足情報(FW/ツールのバージョンなど)

windows 11 64bit
python 3.10.8
jupyterlab:3.5.2
selenium:4.7.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

no such element

なので、該当要素が無いと言うことです。
十分時間をおいても駄目で、タイプミスや見間違いが無いとすると、
過去質問でよくあったパターンとしては、要素が iframe の中にあるというケース。別HTMLなので検索できません。
その場合は、iframe要素を取得して、そこにswitch_to.frameすれば、それ以降はそのiframeの中が検索対象になります。

投稿2023/02/09 08:38

otn

総合スコア86293

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

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

d-hayahsi

2023/02/10 00:11

ご回答ありがとうございます。 iframe要素はページ内にあるのですが、私がクリックしたい要素には使われていないように見えます。 質問の「スクレイピングしたいサイトとのHTML」にFirefoxのウェブ開発ツールから取得した画像を追加させて頂きました。 これを見ると、いくつかのjavascriptにより動作していると思うのですが、このよう場合はどうすれば宜しいのでしょうか。 よろしくお願いいたします。
otn

2023/02/10 01:11

クリックできるかどうかはともかく、要素が見つかるかどうかに、 > いくつかのjavascriptにより動作していると思うのですが は、おそらく関係ないと思いますが、 > いくつかのjavascriptにより動作していると思うのですが とは具体的に何のことを言ってるのか不明なのでなんとも。
d-hayahsi

2023/02/10 01:46

私の勉強不足で上手く伝えられず申し訳ございません。 iframe要素を見つけるためにChromeのデベロッパーツールを用いて検索したのですが、他にどのような探し方があるのでしょうか。 また、iframe要素を使っていない場合は、他にどのような方法でクリックできるのでしょうか。 宜しくお願い致します。
otn

2023/02/10 01:55

> iframe要素を見つけるためにChromeのデベロッパーツールを用いて検索したのですが、他にどのような探し方があるのでしょうか。 具体的に何をやったのか不明なので、なんとも。デベロッパーツールで、目的ノードから親を順番に見ていけば、途中にiframeがあるかどうかわかると思うのですが。 > また、iframe要素を使っていない場合は、他にどのような方法でクリックできるのでしょうか。 iframeの中で無いのであれば、その時点で要素が存在してれば、XPath等を正しく指定すれば検索できます。 今は検索できてないので、クリックできるかはその次の話です。
d-hayahsi

2023/02/10 04:36

>具体的に何をやったのか不明なので、なんとも。デベロッパーツールで、目的ノードから親を順番に見ていけば、途中にiframeがあるかどうかわかると思うのですが。 デベロッパーツールを開き、Ctrl + Fキーで「iframe」と検索して探しました。iframeは見つかりましたが、そこにポインタを合わせると違う所がハイライトされる為、iframe要素は私が検索したい要素では使われていないのかと思いました。 >iframeの中で無いのであれば、その時点で要素が存在してれば、XPath等を正しく指定すれば検索できます。 今は検索できてないので、クリックできるかはその次の話です。 検索とはどういうことでしょうか。 宜しくお願い致します。
otn

2023/02/10 05:35

> 検索とはどういうことでしょうか。 find_elementで結果がno such element: Unable to locate elementにならずにちゃんと該当要素が返るかどうかです。
d-hayahsi

2023/02/10 05:44

>find_elementで結果がno such element: Unable to locate elementにならずにちゃんと該当要素が返るかどうかです。 そこに関しては、href属性がjavascript:void(0)となっていることが原因ではないのでしょうか。 宜しくお願い致します。
otn

2023/02/10 06:39

> そこに関しては、href属性がjavascript:void(0)となっていることが原因ではないのでしょうか。 id属性で探しているので、関係ないです。
otn

2023/02/10 06:48 編集

私ならこうするですが、 for a in driver.find_elements(By.TAG_NAME,"a"): print(f"id={a.get_attribute('id')} href={a.get_attribute('href')}") で、目的のタグは表示されますか?
d-hayahsi

2023/02/10 06:50

>id属性で探しているので、関係ないです。 そうだったのですね。。。 どうすれば要素が返ってくるのでしょうか。 宜しくお願い致します。
d-hayahsi

2023/02/10 06:53

>for a in driver.find_elements(By.TAG_NAME,"a"): print(f"id={a.get_attribute('id')} href={a.get_attribute('href')}") で、目的のタグは表示されますか? コピペして試してみたのですが、何も返ってきませんでした。 宜しくお願い致します。
otn

2023/02/10 09:17

ではそのページにはaタグは1つも無いと言うことです。 過去質問では、全く別のページを見ているとかのオチもありますね。 ブラウザで見ながら実行していますか? 見ながらというのは、具体的には、 driver.find_element(By.XPATH, '//*[@id="link_menu_box"]').click() の直前で、デバッガーで止めるとか、デバッガーが使えないなら、この行の前に input("続行して良いですか?") と書くとかして、一度実行を止めて、その時点でブラウザ画面を見て内容を確認する。
otn

2023/02/10 09:19

あるいは、今時無いと思って書いてませんでしたが、古いページだとiframeタグでなくframesetとframeタグを使っている場合もあり、その場合もiframeと同様です。
d-hayahsi

2023/02/13 00:59

お世話になっております。 driver.find_element(By.XPATH, '//*[@id="link_menu_box"]').click() の前に input("続行して良いですか?") でいったん止めてみたのですが、やはり出力はなにもありませんでした。 HTMLをよく見ると取得したい要素のかなり上部に下記のiframeタグを発見しました。 <iframe src="/h5k9tpa/main/header" name="bar" id="bar" scrolling="no"></iframe> そこで下記のようなコードを実行してみたのですが何も変化ありませんでした。 driver.switch_to.frame('main') #mainはid名です。 id="link_menu_box"をクリックするにはどうすれば良いのでしょうか。 宜しくお願い致します。
d-hayahsi

2023/02/13 02:53

お世話になっております。 driver.switch_to.frame('main') driver.find_element(By.XPATH, '//*[@id="link_menu_box"]').click() 上記のコードで検索することができました。 長い間ご返信いただき誠にありがとうございました。
otn

2023/02/13 03:03

解決して良かったです。iframeの見落としてですか。 > デベロッパーツールで、目的ノードから親を順番に見ていけば、途中にiframeがあるかどうかわかると思うのですが。 をやっていれば、その時点で解決したかも知れません。 > でいったん止めてみたのですが、やはり出力はなにもありませんでした。 止めるかどうかで出力が変わるはずありません。 確認するのは、止めた時点のブラウザのHTMLを開発者ツールで見ることです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問