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

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

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

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

Q&A

解決済

2回答

5622閲覧

python seleniumでボタンを押したいです

kakini

総合スコア40

Python 3.x

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

0グッド

0クリップ

投稿2020/01/09 17:02

ネットの記事でseleniumの紹介があったのでそのサイトのコードを少し変えて
下記の様なコードを作りました

python

1from selenium import webdriver 2 3driver = webdriver.Chrome("c:/driver/chromedriver.exe") 4driver.get("http://www.yahoo.co.jp") 5 6elem_search_word=driver.find_element_by_name("p") 7elem_search_word.send_keys("ランク") 8 9elem_search_btn = driver.find_element_by_class_name("sc-dqBHgY jxoJYO") 10elem_search_btn.click() 11

試した所検索ボックスに文字を入れるとこまでは出来ましたが
最後の検索ボタンを押してくれる作業をしてくれません

yahooのhtmlのソースを表示させてそこから「検索ボタン」と思わしきクラス名を総当りで試してみましたが
全て下記の様なエラーメッセージが出てきます

Traceback (most recent call last):
File "C:\Users\user\AppData\Local\Programs\Python\Python36-32\スクレイピング\chrome.py", line 9, in <module>
elem_search_btn = driver.find_element_by_class_name("sc-dqBHgY jxoJYO")
File "C:\Users\user\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 564, in find_element_by_class_name
return self.find_element(by=By.CLASS_NAME, value=name)
File "C:\Users\user\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
'value': value})['value']
File "C:\Users\user\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Users\user\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".sc-dqBHgY jxoJYO"}
(Session info: chrome=79.0.3945.117)

翻訳した内容を要約するとそんなクラス名はありませんとの事です
クラス名自体は「検証」でhtmlソースをコピペして貼り付けてるので無いわけがないのですがこの様なエラー表示が出てきます

「検証」でhtmlソースを表示させる事自体まだ慣れてないので、調べた方法も
「検索」のボタンにカーソルを合わせてそこから画面の右側に表示されたクラス名を全て試しただけです
ちなみに試したクラス名は
・sc-gxMtzJ dDohKU
・sc-dqBHgY jxoJYO
・sc-kTUwUJ ihWmBH
・rapid-noclick-resp sc-jtRfpW gdgGoT   ←個人的にこれが一番正解だと思ったのですがこれでもダメでした

何がいけないのでしょうか?

もう一つ別のサイトでの事なんですが
https://jbbs.shitaraba.net/bbs/subject.cgi/game/45148/
このサイトの方でも上記と似たようなpythonのコードを書きました

python

1from selenium import webdriver 2 3driver = webdriver.Chrome("c:/driver/chromedriver.exe") 4driver.get("https://jbbs.shitaraba.net/bbs/subject.cgi/game/45148/") 5 6elem_search_word=driver.find_element_by_name("q") 7elem_search_word.send_keys("ランク") 8 9elem_search_btn = driver.find_element_by_name("q") 10elem_search_btn.click()

上記と同じ様に検索ボックスに文字を入れるとこまではしますが
検索のボタンを押してくれません
ただこちらの場合はエラーが出ずにただ単に全ての処理が終わって(まだ検索ボタン押してないのに)終了しましたみたいな感じの挙動になっています

このサイトのhtmlを調べると

<form action="./" method="GET"> <input type="text" name="q" placeholder="スレッドのタイトルを入力" value=""> <input type="submit" value="検索"> </form>

この内容なのでボタンのネームはq以外にありえないはずですが何故か押されていません

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下のコードで押せますので、お試しください
from selenium import webdriver

driver = webdriver.Chrome("c:/driver/chromedriver.exe")
driver.get("http://www.yahoo.co.jp")

elem_search_word=driver.find_element_by_name("p")
elem_search_word.send_keys("ランク")
elem_search_btn = driver.find_element_by_class_name("rapid-noclick-resp")
elem_search_btn.click()

投稿2020/01/10 02:07

harinezumi.py

総合スコア282

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

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

kakini

2020/01/10 08:26

こんにちは、ありがとうございます。 両方ともきちんと動くようになりました。 差し支えなければ3つ程質問させて頂きたい事があるのですがよろしいでしょうか? お手数かけるようでしたらこのコメントはスルーして頂いて大丈夫です
kakini

2020/01/10 09:15

ありがとうございます。 htmlに関しては簡単な本を読んだだけなのでほとんど理解していないのでおかしな事をいうかもしれません 一つ目はyahooの検索ボタンのクラス名なのですが htmlソースを見る限りクラス名は" "で囲われてる”rapid-noclick-resp「 sc-jtRfpW gdgGoT」” だと思ったんですが、実際は「」内を省略してボタンを押しているのですがこれは何故省略しないと動かなかったんでしょうか?
kakini

2020/01/10 09:21

※XMLに関してはhtml以上にほぼ何も知りません 二つ目はしたらばのサイトの検索ボタンの押し方についてなのですが このサイトはyahooの時と違って検索のボタンがid・name・classがどれにも設定されてないから elem_search_btn = driver.find_element_by_name("q") これで動かなかったのでしょうか? その場合教えて頂いた下記の elem_search_btn = driver.find_element_by_xpath("//input[@type='submit']") 命令を使いましたが 自分もこの命令を使おうと思いましたがxpathはXMLで記述されたソースに対してしか使えないかと思っていたのでhtmlのこのサイトには関係ないかと思いますが driver.find_element_by_xpath こちらが使えるのはどうしてなのでしょうか
harinezumi.py

2020/01/10 09:26

これに関しては、 [sc-jtRfpW gdgGoT]は独立する二つのclassである、だけど、同じdomにタグに貼られているという意味になります、よって、seleniumは認識できませんでした
harinezumi.py

2020/01/10 09:35

二つ目の問題点ですが、以下のコードあくまで、submitボタンの親クラスを指定しています、ボタン自身がしてされなければ、押すことができません。 ``` elem_search_btn = driver.find_element_by_name("q") ``` htmlとxml は同じマークアップ言語になりますのでxpathはどちらでも適応します
kakini

2020/01/10 09:52

>>一つ目の質問 「sc-jtRfpW gdgGoT」はrapid-noclick-respとは独立していて 二つのクラス名があるという事でしょうか? クラスの書き方は大抵 class="○○○・・・・・・" この様に書かれてますが この書き方でクラス名が二つ以上ある場合の見分け方とかはあるんでしょうか?
kakini

2020/01/10 09:54

三つ目はボタンその物に関する事なのですが 色々なサイトで「検索」以外にも色々なボタンがありますが 今回のyahooの様に検証でhtmlソースを表示させて検索ボタンのclass(もしくはid・name)名を 表示させてもその「たった一つ検索ボタン」にマウスのカーソルの置き方次第では複数のhtmlソースが 表示されて複数のクラス名が表示されてしまいましたが 自分の様な素人にはどれが目的としてるclass(id・name)かうまく判別できません ボタンに関するclass(id・name)を簡単に見つける分かりやすいコツの様なものがあれば教えていただけないでしょうか
harinezumi.py

2020/01/10 10:03 編集

>> 一つ目の質問の返答 以下のコードブラウザで実行するとわかりやすいと思います ``` <html> <head> <style> .a1{ color: red; } .a2{ font-size: 50px; } </style> </head> <body> <div class="a1 a2">hi</div> <div class="a1">world</div> </body> </html> ```
harinezumi.py

2020/01/10 10:09

>> 三つ目 よくあるパタンは <input type="submit" value="buttonです"> <button>ボタンです</button> でも 「ボタン」というものはマウスフォーカスする際に何らかの変化あって、クリックする際に、また押したというアニメーション効果がつけられてるもの、ボタンとして認識されれば、何でもボタンです、ややこしくてすみません
kakini

2020/01/10 10:21

長時間お付き合い頂き色々教えてもらい大変参考になりました。 本当にありがとうございました
guest

0

二番目の質問はこれで解決します
from selenium import webdriver

driver = webdriver.Chrome("c:/driver/chromedriver.exe")
driver.get("https://jbbs.shitaraba.net/bbs/subject.cgi/game/45148/")

elem_search_word=driver.find_element_by_name("q")
elem_search_word.send_keys("ランク")
elem_search_btn = driver.find_element_by_xpath("//input[@type='submit']")
elem_search_btn.click()

投稿2020/01/10 02:13

harinezumi.py

総合スコア282

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問