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

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

新規登録して質問してみよう
ただいま回答率
85.50%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

ドロップダウンメニュー

GUIを操作するユーザーインターフェイスで、リストボックスに似ており、ユーザーがリストから値を選べるようにするものです。ドロップダウンのリストが非アクティブの場合は、単体の値を表示します。アクティブ化されると、ユーザーが選択可能な値のリスト一覧を表示(ドロップダウン)します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

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

Q&A

解決済

2回答

5909閲覧

Pythonでドロップダウンを選択したい(BUYMA,javascript)

UUUU

総合スコア5

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

ドロップダウンメニュー

GUIを操作するユーザーインターフェイスで、リストボックスに似ており、ユーザーがリストから値を選べるようにするものです。ドロップダウンのリストが非アクティブの場合は、単体の値を表示します。アクティブ化されると、ユーザーが選択可能な値のリスト一覧を表示(ドロップダウン)します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

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

0グッド

0クリップ

投稿2021/08/03 15:47

前提・実現したいこと

BUYMAというECサイトのWeb操作を自動化するツールを作成したい。

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

Python/seleniumにて新規出品画面のカテゴリ(ドロップダウン)を選択できなくて困っています。
マウスの位置やドロップダウンの選択肢により、動的にhtmlが変わってしまう場合
Pythonでどのように要素を取得し、ドロップダウンを選択すればよいのでしょうか。

該当のソースコード

対象画面のソース(ドロップダウン選択なし)

html <div class="bmm-l-col bmm-l-col-4 sell-category__item"> <div class="Select bmm-c-custom-select sell-category-select Select--single"> <div class="Select-control"><span class="Select-multi-value-wrapper" id="react-select-2--value"> <div class="Select-placeholder">選択してください</div> <div aria-expanded="false" aria-owns="" aria-activedescendant="react-select-2--value" aria-disabled="false" class="Select-input" role="combobox" tabindex="0" style="border: 0px; width: 1px; display: inline-block;"></div></span> <span class="Select-arrow-zone"><span class="Select-arrow"></span></span></div></div></div>

対象画面のソース(ドロップダウン選択あり)
試しに手動でドロップダウンを選択すると、htmlが以下のように変化します。

html <div class="bmm-l-col bmm-l-col-4 sell-category__item"> <div class="Select bmm-c-custom-select sell-category-select has-value Select--single"> <div class="Select-control"><span class="Select-multi-value-wrapper" id="react-select-2--value"> <div class="Select-value"> <span class="Select-value-label" role="option" aria-selected="true" id="react-select-2--value-item">レディースファッション</span></div> <div aria-expanded="false" aria-owns="" aria-activedescendant="react-select-2--value" aria-disabled="false" class="Select-input" role="combobox" tabindex="0" style="border: 0px; width: 1px; display: inline-block;"></div></span> <span class="Select-arrow-zone"><span class="Select-arrow"></span></span></div></div></div> <div aria-expanded="false" aria-owns="" aria-activedescendant="react-select-2--value" aria-disabled="false" class="Select-input" role="combobox" tabindex="0" style="border: 0px; width: 1px; display: inline-block;"></div>

試したこと

・driver.find_elements_by_~~ (class_name/id/name/css/xpath)
・time.sleep()
・driver.find_element_by_xpath("//*[@id='gh-shipto-click']/div/button/span").click()

等色々とググってみて、出てきたものは大方試しましたがダメでした。
phantomjs や javascript(動的なwebページ)といったキーワードも出てきましたが、
知見がなくどのように進めればいいか手詰まりになってしまいましたので、質問させていただきました。

具体的にどのように対応すればよいか、ご教示いただけますと幸いです。
(提示する情報が不足しておりましたらお知らせください。)

よろしくお願いいたします。

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

Python3
selenium

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

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

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

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

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

guest

回答2

0

ベストアンサー

あまり参考にならないかも知れませんが、コードを貼っておきます。
これは、カテゴリではなく、モデルの部分です。

python

1 def input_model( self, data_model ): 2 if not data_model in "------NO MODEL------": 3 #input( "model ok?") 4 model = self.driver.find_element_by_xpath( '/html/body/div[3]/div[3]/div[1]/div/div[1]/div/div/div/div[2]/form/div[3]/div[3]/div/div[2]/div/div/div/div/div/div/div/span[1]/div[1]' ) 5 model.click() 6 sleep( 1 ) 7 selector = self.driver.find_elements_by_xpath( '/html/body/div[3]/div[3]/div[1]/div/div[1]/div/div/div/div[2]/form/div[3]/div[3]/div/div[2]/div/div/div/div/div/div/div[2]' ) 8 list_ = selector[0].find_elements_by_class_name( "Select-option" ) 9 for item in list_: 10 if( item.get_attribute( "aria-label" ) == data_model ): 11 item.click() 12 break 13 else: 14 print( "no model" )

これは最初の方に作ったので、先程の手順と少し違いますが、同じような感じです。

カテゴリは一番上にあるので大丈夫なのですが、
xpathで指定する場合、サイト全体のプルダウンを入力する順番が大事なので、気を付けて。

投稿2021/08/04 07:26

編集2021/08/04 07:27
t-_.

総合スコア55

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

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

t-_.

2021/08/04 07:26

二つ投稿しちゃったw てへぺろ
UUUU

2021/08/04 13:05

ご丁寧に、ソースコードのサンプルまで共有いただきありがとうございます。 引数のselfとは何でしょうか? data_modelは選択したい値でしょうか?
t-_.

2021/08/04 13:19

>引数のselfとは何でしょうか? pythonのclassで出てくる引数です。 消してもらって大丈夫です。 >data_modelは選択したい値でしょうか? そうです。モデルなんで、"MONOGRAM"とかが入ってます。
UUUU

2021/08/04 13:59

いただいたソースコードからselfを削除し、実行したところ以下のエラーが出てしまいます。。 【エラー】 model.click()で発生 ElementClickInterceptedException: Message: element click intercepted: 【ソースコード】 ※引数は「EQT」を指定 def inputmodel(data_model ): #input( "model ok?") model = driver.find_element_by_xpath( '/html/body/div[3]/div[3]/div[1]/div/div[1]/div/div/div/div[2]/form/div[3]/div[3]/div/div[2]/div/div/div/div/div/div/div/span[1]/div[1]' ) print(model) model.click() time.sleep( 1 ) selector = driver.find_elements_by_xpath( '/html/body/div[3]/div[3]/div[1]/div/div[1]/div/div/div/div[2]/form/div[3]/div[3]/div/div[2]/div/div/div/div/div/div/div[2]' ) list_ = selector[0].find_elements_by_class_name( "Select-option" ) for item in list_: if( item.get_attribute( "aria-label" ) == data_model ): item.click() break time.sleep( 10 )
UUUU

2021/08/05 00:50

できました! clickした後、pyautoguiでテキストを直接入力する形にしました。 色々とご教示いただきありがとうございました。 大変助かりました。
t-_.

2021/08/05 08:28

やり方は一つじゃないですからね。 出来て良かったです。 タグとかめっっちゃ多いと面倒ですよねw 全て自動で出来るようがんばってください!
guest

0

私も同じ所で詰まってました。

これが最善かはわかりませんが参考までに。


プルダウンを括っているdiv要素をxpathで指定します。
それから、プルダウンを.click()で中身を展開します。

プルダウン項目に[Select-option]というclass属性があります。
find_elements_by_class...?で複数取得にして取得します。
それをforで回して、get_attributeで[aria-label]を取得します。
[aria-label]には、「レディース...」や「メンズ...」が入ってるので、
それと一致したのもを、.click()で選択しました。


私はこの方法で出品すべてを自動化することができました。
(応用は必要ですが。。)
ブラウザの開発者ツールを使って、ブレイクポイントとかを使いながらやると、
めちゃくちゃ捗りますよ^^

頑張って見てください。

##追記

python

1def input_catagory(): 2 first = driver.find_element_by_xpath( "/html/body/div[3]/div[3]/div[1]/div/div[1]/div/div/div/div[2]/form/div[3]/div[1]/div/div[2]/div/div/div/div/div/div/div/span[1]/div[1]" ) 3 first.click() 4 #↑↑プルダウンのクリック 5 sleep( 1 )#表示されるまでの時間稼ぎ 6 selecter = driver.find_element_by_xpath( "/html/body/div[3]/div[3]/div[1]/div/div[1]/div/div/div/div[2]/form/div[3]/div[1]/div/div[2]/div/div/div/div/div/div/div[2]" ) 7 #↑↑2での取得部分(画像参照 8 list_ = selecter.find_elements_by_class_name( "Select-option" ) 9 #↑↑3での複数取得部分(画像参照 10 for item in list_: 11 if( item.get_attribute( "aria-label" ) == "レディースファッション" ): 12 item.click() 13 break 14 #↑↑レディースファッションとかと比べて同じならクリックしてbreak 15 sleep( 1 )次に行くまでの時間稼ぎ

投稿2021/08/04 07:19

編集2021/08/05 09:22
t-_.

総合スコア55

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

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

UUUU

2021/08/04 13:06

こちらもコメントありがとうございます。試してみます。
UUUU

2021/08/05 02:51

カテゴリの方ですが、やはりできません・・ プルダウンを.click()まではいったのですが、 プルダウン項目に[Select-option]というclass属性が見つけられません。 ※aria-activedescendantは取得できましたが、react-select-2--option-1等の値が入っておりました。 お手数をおかけしますが、どのようにすればよいかご教示いただけますでしょうか。
t-_.

2021/08/05 09:22

コードを追記したので、確認してみてください。 私が教えられるのはこのくらいです。。。
t-_.

2021/08/05 09:24

buymeのサイトは、react-select-2--option-1とかの値が変化するので、xpathで大枠を指定してからがお勧めです。 buymeでxpathで指定する場合、入力する順番を注意してください。 しょっちゅうHTMLが変化するのでw
t-_.

2021/08/05 09:26

ほかのプルダウンもこれの応用でやりました。 もっと他にいい方法が分かったら教えてくださいorz
UUUU

2021/08/05 13:06

ご丁寧にスクリーンショットでご説明いただきありがとうございます。 Select-menu-outerが隠れていいたのですね・・ 無事カテゴリの3つのドロップダウンを選択することができました。 色々とご教示いただき、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問