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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Chrome

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

selenium

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

Q&A

解決済

2回答

7849閲覧

seleniumで右クリックメニューを操作する方法

SOU_2929831

総合スコア14

スクレイピング

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Chrome

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

selenium

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

0グッド

0クリップ

投稿2019/11/02 00:40

編集2019/11/02 12:06

前提・実現したいこと

selenium(headless chrome)で画像を取得するデモンストレーションを行っています。
対象のimg要素はfind_elementで取得できそうになかったので右クリックのコンテキストメニューから
”画像を新しいタブで開く(I)”を選択することができないか検討しています。
いろいろ方法を検索した結果、以下の様に書く方法にたどり着きましたが選択前ページから動いていないようです。
コンテクストメニューを選択する方法はないでしょうか。

該当のソースコード

ruby

1#selenium起動 2options = Selenium::WebDriver::Chrome::Options.new 3options.add_argument('--headless') 4driver = Selenium::WebDriver.for :chrome, options: options 5 6#該当ページへ移動 7driver.navigate.to 'http://sample.com/' 8 9#マウスを画像の座標へ移動(座標の値は例) 10driver.action.move_to_location(100, 100).perform() 11 12#右クリックでコンテキストメニューを表示、”画像を新しいタブで開く(I)”を選択 13driver.action.context_click().send_keys("I").send_keys(:enter).perform()

試したこと

ruby

1#右クリックでコンテキストメニューを表示、”画像を新しいタブで開く(I)”を選択 2driver.action.context_click().send_keys("I").send_keys(:enter).perform()

の代わりに

ruby

1driver.action.send_keys(:arrow_down).send_keys(:arrow_down).send_keys(:arrow_down).send_keys(:arrow_down).send_keys(:arrow_down).send_keys(:enter).perform()

のように矢印キーの入力も試しましたがページが下にスクロールするだけで別タブで画像を開けませんでした。

また、座標をclick().perform()すると画像のリンク先を得られたので座標の間違いはないと思われます。

補足情報

AWSのクラウドを用いているので結果確認はスクリーンショットとタブのカウントで行いました。

〇取得しようとしていた画像
取得しようとしていた要素はGoogle検索の画像タブで表示される画像一覧の要素です。
一覧の画像をクリックすると画面右に出る大きな画像を取得しようとしていました。
class名 irc_miのimg要素です。
実際のコードではclick()で右の黒帯を表示するところまでは動作します...
”りんご”の画像検索結果

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

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

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

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

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

otn

2019/11/02 00:43

> AWSのクラウドを用いているので結果確認はスクリーンショットとタブのカウントで行いました。 回答ではないですが、ちゃんと動くまでは、ブラウザウィンドウを出した状態でローカルPCでテストを行うとよいと思います。
SOU_2929831

2019/11/02 00:47

そうですよね rails tutorialを終えたばかりの駆け出しなので、環境そのままで試しちゃいました。
shirai

2019/11/02 09:49

そのimgタグ含めた前後のDOMをもらえないでしょうか。 多少プログラムが汚くなるかもしれませんが取得できない要素は無いです。
SOU_2929831

2019/11/02 12:12

shirai さん コメントありがとうございます。DOMを正しく理解できなかったので取得しようとしていた要素について追記しました。よろしくお願いいたします。
guest

回答2

0

ベストアンサー

無理っぽいです。

右クリックで画像をひらくことはできないので、
View Imageを追加したユーザーデータを使って試してみましたが動作が安定しないです。
※ "View Image" は "画像を表示" ボタンを追加する拡張機能です。

投稿2019/11/02 17:10

編集2019/11/02 17:45
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SOU_2929831

2019/11/02 18:16

検証ありがとうございます。 拡張機能については自分も考えましたがアドオン導入の時点でつまづいておりました。
guest

0

すみませんこれrubyの質問だったんですね。。
てっきりpythonだと思って口出ししちゃいました。
hello worldも書いたことないので
ぐぐってみましたが以下でうまくいくでしょうか。。。

ruby

1elem_src = driver.find_element(:class, 'irc_mi').attribute('src') 2open('test.png', 'wb') do |file| 3 open(elem_src) do |data| 4 p file.write(data.read) 5 end 6end

このサイトを参考にしました。

投稿2019/11/02 12:58

shirai

総合スコア1289

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

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

SOU_2929831

2019/11/02 13:12

driver.find_element(:class, 'irc_mi')はどうもうまくいかないんですよね。 たぶんスクリプトで巧妙に隠されてるんだと思います。天下のGoogleさんですからね。
shirai

2019/11/02 13:17

elem_src = driver.find_elements(:class, 'irc_mi')[1].attribute('src')ならどうでしょうか。
SOU_2929831

2019/11/02 13:26

NoMethodError (undefined method `attribute' for nil:NilClass)と表示されているので、配列が空ということでしょうか。たぶん取得できてないと思われます。
shirai

2019/11/02 14:30

では、elem_src = driver.find_elements(:class => 'irc_mi')[1].attribute('src')ならどうでしょうか。
SOU_2929831

2019/11/02 15:13

同様ですね。ブラウザの開発者ツールからは見えるんですが、driver.page_sourceでソースコードを取得してもそこにはclass名irc_miの要素はないことから見てもfind_elementsでは取得できないと考えるべきかと...うーん
shirai

2019/11/02 15:40

page_sourceではどこまで表示されたでしょうか。どれかの画像をクリックして右側に黒い背景の画面を出現させるところまでは成功できていますか。
SOU_2929831

2019/11/02 16:13

意図を理解できていなかったらごめんさない。 page_sourceをとるとhtmlの中身がずらずらと得られるので、メモ帳に張り付けて拡張子を".html"に変えてやると確かにページは表示されますが、画像をクリックしても黒い背景の画面は表示できないですね。
shirai

2019/11/02 18:55

page_sourceはpythonにも全く同じ関数があるので使い慣れています。 私もuser1さんと同じページかと思い検証をしていましたが、 となるとそもそも元の画像一覧から黒背景で拡大表示する 1枚を選んでクリックする時点でプログラムに間違いがあるようですね。
SOU_2929831

2019/11/02 19:21

page_sourceは検証でちょっと打ってみただけで黒背景を出すのには使っていません。 黒背景を出すまではclickだけでできることはスクショをとって確認済みです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問