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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

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

selenium

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

Q&A

解決済

3回答

2104閲覧

Python Selenium を使ったプルダウンメニューの中身のひとつをクリックしたいが、方法が分からずに困っています

mini1988

総合スコア56

Python 3.x

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

selenium

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

0グッド

0クリップ

投稿2021/09/16 18:54

編集2021/09/17 03:15

困っていること

pythonのseleniumを使って、プルダウンメニューの中身のひとつをクリックしたいのですが、やり方が分からずに困っています。

具体的には、以下の画像の中で、薄い青色でハイライトした部分「コンテンツのエクスポート」というメニューをクリックしたいのですが、そのやり方が分からずに困っている状況です。

どなかた詳しい方、ご教示お願い致します。お手数ですがよろしくお願いします。

試したこと

「コンテンツのエクスポート」に対応した箇所の開発コードをチェックし、
Copy Xpath で要素?を確認して、例えば以下のように設定して動作させました。

driver.find_element_by_xpath("/html/body/div[8]/a[1]").click()

ただ、なんどか実行していると、エラーが出るときがあります。
調べてみると、その時々で取得できるXpathの様子が異なるようです。

/html/body/div[3]/a[1]
/html/body/div[8]/a[1]
/html/body/div[7]/a[1]

これらブラウザの大きさによってdiv[XXX]のXXXの数値部分が変わるようです。
どう対応すればいいか教えていただけないでしょうか?

該当のHTML

コードをコピーできず、画像で張り付けてあります。
イメージ説明

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

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

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

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

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

guest

回答3

0

ベストアンサー

調べてみると、その時々で取得できるXpathの様子が異なるようです。

「何番目」みたいな不確実な指定を止めて、一意に特定できる方法でやりましょう。
人間がブラウザ上でクリックするときに、「8番目のdivだからこれをクリック」とはしてないはずで、
人間の判断と同じロジックでやれば良いでしょう。

仮に、「リンクテキストが"コンテンツのエクスポート"」であるなら、

Xpath

1"//a[text()='コンテンツのエクスポート']"

ですね。
画像を見ると3つあるようですが、そのうちの「これ」と決めたのはどういう基準でしょうか?その基準をコードにすればいいかと思います。

投稿2021/09/17 04:09

otn

総合スコア85901

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

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

mini1988

2021/09/17 04:47

メッセージいただき、ありがとうございます。 driver.find_element_by_xpath("//a[text()='コンテンツのエクスポート']").click() を試したところ、以下のようなエラーメッセージが出ました。 ElementNotInteractableException: Message: element not interactable (Session info: chrome=93.0.4577.82) それと、htmlのコードには「コンテンツのエクスポート」なるものが3つ見えてますが、特別選択したわけではなく、サイト内の「コンテンツのエクスポート」(画像の左にかろうじて映っている表示の部分)にカーソルを合わせるとhtml内の3番目が対応してハイライト化されるように見えます。
otn

2021/09/17 04:53

なるほど。 HTML上で3つあるけど、表示しているのはそのうちの1つで、他はdisplay:none等で隠れていると言うことですね。 find_element_by_xpathだと1つめを選択するので、1つめが非表示なのでクリックがエラーになるのでしょう(非表示だとクリックできない)。 find_element_by_xpath でなく find_elements_by_xpath で全部取得して、 そのうちで、is_displayed() と is_enabled() が真である物を選べば良いかと思います。
mini1988

2021/09/17 04:55

コメントありがとうございます、早速トライしてみます!
mini1988

2021/09/17 05:48

いろいろとありがとうございます。 アドバイス通り追加して実行しようとしています。 export1=driver.find_elements_by_xpath("//a[text()='コンテンツのエクスポート']") for i in range(len(export1)): if export1[i].is_displayed()==True and export1[i].is_enabled()==True: print(print(export1[i])) driver.find_elements_by_xpath(export1[i]).click() <============ココ time.sleep(5) <============ココ で示した行(clickするところ)は、どのような記述をすればよいのでしょうか? 上記のように書くと、エラーが出ました。 ちなみに、is_displayed(),is_enabled()ともにTrueだったexport1は以下の通りです。 <selenium.webdriver.remote.webelement.WebElement (session="6680b06c1662ce423ed9730281cfe639", element="d7965287-37f2-4482-ab2a-1c12f48c0564")> アドバイスをいただけますと幸いです。
otn

2021/09/17 09:07

export1[i].click() ですね。 export1[i].is_displayed() が書けて、export1[i].click() が書けないとは不思議です。
otn

2021/09/17 09:10

なお、普通の for の書き方は、 for i in export1: if i.is_displayed() and i.is_enabled(): print(i) i.click()
mini1988

2021/09/17 09:14

不慣れな私に、いろいろとアドバイスいただきありがとうございます。 おかげさまで、すべてが解決できました。ありがとうございました!!
guest

0

xpathの場合は
Copy→Copy XPathで取得した要素を
***に入れます

投稿2021/09/17 01:58

blacksanta

総合スコア23

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

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

mini1988

2021/09/17 02:06

早速回答をいただき、ありがとうございます。 driver.find_element_by_xpath("/html/body/div[8]/a[1]").click() みたいな感じでやってみました。 ただ、なんどか実行していると、エラーが出るときがあります。 調べてみると、その時々で取得できるXpathの様子が異なるようです。 /html/body/div[8]/a[1] /html/body/div[7]/a[1] これらに対してどう対応すればいいか教えていただけないでしょうか?
blacksanta

2021/09/17 02:26

表示のメニューが動的に変わっているということでしょうか?
mini1988

2021/09/17 02:34

そうですね、メニューが動的に変わるというよりは、ブラウザの大きさを変えると変わるようです。
blacksanta

2021/09/17 02:36

ブラウザの大きさを固定しておくのは難しいのでしょうか?
mini1988

2021/09/17 02:40

いろんな環境で使うので、難しい状況です。
guest

0

Developerツールの薄い青色のハイライトした部分の上で
右クリックCopy→Copy JS pathを選択するとその部分の要素を取得できるので
取得した要素.click()

投稿2021/09/17 01:21

blacksanta

総合スコア23

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

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

mini1988

2021/09/17 01:55

回答いただきありがとうございます。 Copy JS path を選択すると、以下の情報が得られました。 document.querySelector("body > div:nth-child(8) > a.im-qz-drop-down-item.hoverable.export") driver.find_element_by_xpath(***).click() みたいに実行するには、*** にどう記載すればいいか教えていただけないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問