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

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

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

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

Python

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

selenium

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

Q&A

解決済

3回答

3811閲覧

consoleからの結果を取得する

TruoG91

総合スコア7

JavaScript

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

Python

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

selenium

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

0グッド

0クリップ

投稿2020/10/03 15:50

こんにちわ!

私はブラウザーのコンソールをJavascript実行して結果を取得しますが、
その流れをPythonスクリプトで実装しようとしております。
ただし、どうしてもコンソールに出力する結果を取得できませんなので、
ブラウザーのコンソール結果をPython側で取得できるかを確認したいです。
試したのは以下のようになっています。ご参考・指摘などよろしくお願いいたします。

python

1from selenium import webdriver 2from webdriver_manager.chrome import ChromeDriverManager 3import time 4from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 5 6 7proxy = 'xxxx' 8 9options = webdriver.ChromeOptions() 10# options.add_argument('--headless') 11options.add_argument('--disable-gpu') 12options.add_argument('--proxy-server=socks5://' + proxy) 13options.add_argument('--args') 14# options.add_argument('--user-data-dir=custom-profile') 15options.add_argument('--disable-web-security') 16options.add_argument('--disable-site-isolation-trials') 17options.add_argument('--auto-open-devtools-for-tabs') 18d = DesiredCapabilities.CHROME 19 20d['loggingPrefs'] = { 'browser':'ALL' } 21driver = webdriver.Chrome(ChromeDriverManager().install( 22), options=options, desired_capabilities=d) 23url = 'xxxx' 24driver.get(url) 25time.sleep(5) 26results = driver.execute_script(''' 27function aaa() { 28 if (typeof (___grecaptcha_cfg) !== 'undefined') { 29 let cs = [] 30 for (let id in ___grecaptcha_cfg.clients) { 31 cs.push(id) 32 } 33 let res = cs.map(cid => { 34 for (let p in ___grecaptcha_cfg.clients[cid]) { 35 let c = {} 36 cid >= 10000 ? c.version = 'V3' : c.version = 'V2' 37 let path = "___grecaptcha_cfg.clients[" + cid + "]." + p 38 let pp = eval(path) 39 if (typeof pp === 'object') { 40 for (let s in pp) { 41 let subpath = "___grecaptcha_cfg.clients[" + cid + "]." + p + "." + s 42 let sp = eval(subpath) 43 if (sp && typeof sp === 'object' && sp.hasOwnProperty('sitekey') && sp.hasOwnProperty('size')) { 44 c.sitekey = eval(subpath + '.sitekey'); 45 let cb = eval(subpath + '.callback'); 46 if (cb == null) { 47 c.callback = null 48 c.function = null 49 } 50 else { 51 c.callback = subpath + '.callback' 52 cb != c.callback ? c.function = cb : c.function = null 53 } 54 }; 55 }; 56 }; 57 return c 58 }; 59 }); 60 return (res[0].callback) 61 } else { 62 return (null) 63 } 64}; 65''') 66# 上記のJavascriptを取得しようとしておりますが、できますでしょうか。 67print(driver.execute_script('aaa()')) 68# こちらの結果出てこないんです。変数などに代入してもNoneになってしまいます。 69 70#このように試しましたが、期待していたものが表示されなかった。 71# for entry in driver.get_log('browser'): 72# print(entry) 73 74 75time.sleep(10000) 76driver.quit()

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

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

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

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

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

guest

回答3

0

ただし、どうしてもコンソールに出力する結果を取得できませんなので、

まず「chrome」と「デベロッパーツール」は別のソフトです。
JSの[console.log]は「ブラウザ開発機能」の「コンソール画面」に表示しなさいと
「chrome」側から「デベロッパーツール」を通信した結果です。
通信しても相手がいない場合エラーとしていないので処理上問題なく動いている状態です。

この場合

javascript

1 window.onload = function(){ 2 let messagelog = document.createElement("span"); 3 messagelog.id = 'messagelog'; 4 messagelog.style.display = 'none'; 5 document.body.appendChild(messagelog); 6 7 window.console = (function(oldCons){ 8 return { 9 log: function(text){ 10 oldCons.log(text); 11 messagelog.innerHTML += 'log:' + text + '<br>'; 12 }, 13 info: function (text) { 14 oldCons.info(text); 15 messagelog.innerHTML += 'info:' + text + '<br>'; 16 }, 17 warn: function (text) { 18 oldCons.warn(text); 19 messagelog.innerHTML += 'warn:' + text + '<br>'; 20 }, 21 error: function (text) { 22 oldCons.error(text); 23 messagelog.innerHTML += 'error:' + text + '<br>'; 24 } 25 }; 26 }(window.console)); 27 }

とコンソールログのイベントをハッキングしログを保存

ログがほしいなら

javascript

1 function getlog() { 2 return messagelog.innerText; 3 }

とでもして下さい。

追記
seleniumでロード前の取得が設定ができない場合

javascript

1function init(){ 2... 3} 4init();

とでもしてURLロード後に設定して下さい
(当然ロード前のconsoleは取れませんが)

投稿2020/10/04 01:01

編集2020/10/04 02:03
kuma_kuma_

総合スコア2506

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

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

TruoG91

2020/10/04 04:19

ご回答ありがとうございます。試し致します。
guest

0

ベストアンサー

確実に言えそうなこと

execute_scriptの実行返り値を取るには、returnが必要みたいです。

diff

1-print(driver.execute_script('aaa()')) 2+print(driver.execute_script('return aaa()'))

参考:Selenium自体のテストコードでの使われ方
※テストコード内でexecute_scriptの結果チェックをするテストで returnが使われています

気になったこと

※ここからは、↑の回答の過程で回答要素になりそうな気になった箇所

自環境だと、execute_scriptの実行ごとに独立しているのか、execute_script("function aaa() {...}")後にexecute_script("aaa()")をしても関数未定義になるケースがありました。
定義と実行は、1回のexecute_scriptで行ったほうが良いのかもしれません。

results = driver.execute_script(''' function aaa() { // 説明用なので元の中身は省略 }; return aaa(); ''')

投稿2020/10/04 04:28

編集2020/10/04 04:39
attakei

総合スコア2740

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

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

TruoG91

2020/10/04 04:42 編集

回答ありがとうございます。 ーーーーーーーーーーー results = driver.execute_script(''' function aaa() { // 略 }; return aaa(); ''') ーーーーーーーーー ↑のように試して、そして、「results」関数が値を渡しました。
guest

0

※本回答はPythonがサーバサイドスクリプトとして動作している前提で回答しましたが、質問の意図とは異なる事が分かりましたので、流してください

「クライアントサイドスクリプト」と「サーバサイドスクリプト」

JavaScriptはブラウザにエンジンが内臓されていますが、Pythonはサーバで動きます。
次節で簡易説明しますが、下記キーワードを元にGoogle検索して、動きの詳細を把握してください。

  • HTTP
  • レスポンス
  • クライアントサイドスクリプト
  • サーバサイドスクリプト

Pythonでブラウザのコンソール出力値を取得する

ブラウザーのコンソール結果をPython側で取得できるかを確認したいです。

サーバがブラウザに対して出来るのは、ブラウザの通信リクエストにレスポンスを返すことだけです。
Python側でコンソールの出力結果を得るには、ブラウザに出力されたJavaScriptでコンソール結果を取得し、サーバ側に送り返す必要があります。

(1) Pythonがブラウザにレスポンスを返す
(2) JavaScriptでPythonにコンソール結果を返す
(3) Pythonで受け取る

(1) と (3) で動くPythonスクリプトは別スレッドで動きますので、注意が必要です。
(2) を行うには、console.log の関数をユーザ定義関数に書き換えて、出力後に、Fetch API等でPythonにHTTPリクエストを返すように処理を書き換える必要があります。

Re: TruoG91 さん

投稿2020/10/04 01:53

編集2020/10/04 04:39
think49

総合スコア18189

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

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

think49

2020/10/04 03:25

ああ、PythonをクライアントPCにインストールして、Google Chromeを操作しようとしているのでしょうか。 その場合はこの回答は流してください。
TruoG91

2020/10/04 04:18

細かい回答ありがとうございます。Google Chromeを操作しようということです。これは参考としてありがとうございます。
think49

2020/10/04 04:42

失礼しました。 親記事に質問の意図とは異なる旨の注釈を入れました。 TruoG91さんの高評価は打ち消し票でしょうか。フォローありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問