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

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

新規登録して質問してみよう
ただいま回答率
85.35%
パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

Python

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

selenium

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

Q&A

解決済

1回答

2313閲覧

Python + Selenium サブミットによる認証後のJavaScript認証でエラーになります。

gkan

総合スコア3

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

Python

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

selenium

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

0グッド

0クリップ

投稿2020/07/22 09:43

編集2020/07/28 07:05

前提・実現したいこと

Python+Seleniumを活用して社内システムの操作自動化を検討しています。
その中で、WEBページ(社外パッケージ品)内にユーザーID、パスワード用のテキストボックスがあるページはsubmitによる認証、
その認証が通った後のページがBasic認証(もしくはjavascriptを使ったパスワード入力)でパスワードを要求してくるため、
Seleniumでの操作でパスワードを入力するよう言われ、エラーになります。

同じような事例があるか調べましたが、見つかりませんでした。
解決策などありましたら、ご教授いただければ幸いです。

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

例外が発生しました: UnexpectedAlertPresentException Alert Text: パスワードをいれてください! Message: unexpected alert open: {Alert text : パスワードをいれてください!} (Session info: chrome=84.0.4147.89) File "C:***\test.py", line 43, in <module> driver.get('https://***/menu.php3?type=xxxxxx&pass=&ip_addr= ')

該当のソースコード

Python

1import os 2os.system('cls') 3os.chdir('\\xxxxxx') 4 5from selenium import webdriver 6from selenium.webdriver.common.by import By 7from selenium.webdriver.common.keys import Keys 8from selenium.webdriver.support import expected_conditions as EC 9from selenium.webdriver.support.ui import WebDriverWait 10from selenium.webdriver.common.alert import Alert 11 12driver = webdriver.Chrome() 13driver.get('http://xxxx/login.php3') 14 15# ID, PW 16login_id = 'xxxxxx' 17login_pw = 'xxxxxx' 18 19button_login = driver.find_element_by_xpath("//input[@type='submit']") #Chromeの場合のみ確認画面があるので必要 20button_login.click() #Chromeの場合のみ確認画面があるので必要 21 22input_id = driver.find_element_by_name('id') 23input_password = driver.find_element_by_name('pass') 24 25input_id.send_keys(login_id) 26input_password.send_keys(login_pw) 27 28button_login = driver.find_element_by_xpath("//input[@type='submit']") 29button_login.click() 30driver.get('https://パスワードをここに入れる@xxxx/menu.php3?type=xxxxxx&pass=&ip_addr= ')

試したこと

・表記したソースはChromeDriverですが、IEDriverでも試しましたが同じ結果です。
・Basic認証画面はID入力欄がないので、ソース上はhttps://パスワード@xxxx/x.php3となっていますが、
submit認証画面(1画面目)で入力するIDを埋め込んで、https://ID:パスワード@xxxx/x.php3としてもダメです。

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

Google Chrome バージョン: 84.0.4147.89(64bit)
Internet Explorer11 バージョン:11.959.18362.0
Python バージョン:3.7.4
ChromeDriver バージョン:84.0.4147.30
IEDriver バージョン:3.150.1.0

1画面目のログイン画面
1画面目のログイン画面

ここでログインボタンを押した後、下記のパスワード要求画面に遷移します。

2画面目のパスワード要求
パスワード要求

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

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

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

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

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

shirai

2020/07/22 15:11

javascriptを使ったパスワード入力とはどのような画面ですか?Basic認証を通す代わりに無理やりJSをぶっこむやり方があるのではないかと考えています。
gkan

2020/07/23 04:38

ご意見、ありがとうございます。 補足に画面イメージを追加しました。 Basic認証ではなく、javascriptな気がします・・・。 2画面目でパスワードを入れて表示したフレーム分割ページでソース表示しても、参考となりそうなスクリプトが見当たりませんでした。 1画面目でサブミット後に何かあると思うのですが。
shirai

2020/07/23 06:25

この2画面目が表示された直後のDOMにはこの画面の構成要素と思われるDOMは存在しますか? 例えば開発者ツールに「パスワードをいれてください!」という文字列はありますか?
gkan

2020/07/23 07:02

フレーム分けされたページの片側に、下記javascriptによる記述を発見しました。Basic認証ではなかったですね・・・。 ※知識不足で、フレーム分けされページのソースを見る方法を間違えておりました。申し訳ありません。 if (pass.value=="") { var strAns; //入力された文字列 strAns = prompt("パスワードをいれてください!",""); document.Main.pass.value=strAns; submit(); } 1画面目(login.php)のサブミット認証が通れば、たとえばindex.phpというページに遷移してそこからa.htm、b.htmが表示されており、a.htmの方に上記のスクリプトがあるようなイメージです。
guest

回答1

0

ベストアンサー

ではindex.phpに遷移したのち、
frameをa.htmに移して、
そこでそのJSを実行してやるといいのではないでしょうか。

python

1# driver.find_element_by_hogehoge('fugafuga') でa.htmのframeタグを指定する 2driver.switch_to.frame(driver.find_element_by_hogehoge('fugafuga')) 3 4driver.execute_script('document.Main.pass.value="パスワード";submit();')

コメントを受けて追記

かなり難易度が高そうですね。。。

思いつくことは後2つあります。

1つ目は
1画面目を開いた後、従業員コード等を入力する前に、
JSで無理やりリクエストを投げる方法です。
詳しく紐解いて行かないと分からないですがおそらくpostリクエストだと思います。
画像を見る限りvueやangulerは使ってなさそうなシステムなので、
生JSでおそらくぶっこめると思います。

python

1driver.execute_script(''' 2function send_post_request() { 3 const form = document.createElement('form'); 4 form.method = 'post'; 5 form.action = 'パスワードをここに入れる@xxxx/menu.php3?'; 6 7 const id_Field = document.createElement('input'); 8 id_Field.type = 'hidden'; 9 id_Field.name = 'id'; 10 id_Field.value = 'hogehoge'; 11 form.appendChild(id_Field); 12 13 const pass_Field = document.createElement('input'); 14 pass_Field.type = 'hidden'; 15 pass_Field.name = 'pass'; 16 pass_Field.value = 'fugafuga'; 17 form.appendChild(pass_Field); 18 19 document.body.appendChild(form); 20 form.submit(); 21} 22send_post_request(); 23''')

おおよそこんなイメージでしょうか。 cf


2つ目は
pyautoguiという別のモジュールと組み合わせることです。
こちらは別途調べていただければと思いますが、
1つ目よりはシンプルだと思います。

投稿2020/07/23 08:33

編集2020/07/27 12:28
shirai

総合スコア1290

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

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

gkan

2020/07/23 09:39

理解が足りず申し訳ありません。 1画面目でサブミットされた後に呼び出されるindex.phpで出力されるhtmlは <HTML><HEAD><TITLE>メニュー</TITLE> <META content="text/html; charset=x-euc-jp" http-equiv=Content-Type> </HEAD> <FRAMESET cols=220,*> <FRAME noResize border=0 src="a.php3?type=[ここにユーザーIDが入る]&amp;pass=&amp;ip_addr= FRAMEBORDER=" borderColor=black 1?> <FRAME src="" frameBorder=0 name=frmain><NOFRAMES></NOFRAMES></FRAMESET></HTML> となっており、frameタグの指定をどうするのかがわかりませんでした。 ※<FRAME noResize border=0 src="a.php3?type=[ここにユーザーIDが入る]&amp;pass=&amp;ip_addr= FRAMEBORDER=" borderColor=black 1?> の側が問題のa.phpで呼び出される時に <SCRIPT language=javascript> <!-- /* 初期入力プロンプト */ with (document.Main) { if (pass.value=="") { var strAnswer; //ここに入力された文字列がはいります strAnswer = prompt("パスワードをいれてください!",""); document.Main.pass.value=strAnswer; submit(); } } // --> </SCRIPT> でパスワード入力が強制されています。
shirai

2020/07/23 14:52

driver.switch_to.frame(driver.find_element_by_xpath('//frame[@src="a.php3"]')) でいけると思います。 ただ、その分だとJSが前に出ててframeのswitchができないとエラーが出る可能性があるので、 その場合はswitchせず直にJSを打ち込んでみてはいかがでしょうか。 driver.execute_script('document.Main.pass.value="' + 'パスワード' + '";submit();') でも大丈夫です。
gkan

2020/07/27 05:45

返信が遅くなり申し訳ございません。 login画面でサブミットされた後に呼び出された画面の初期表示でJavascriptが前に出てしまうため、 driver.switch_to.frame(driver.find_element_by_xpath('//frame[@src="a.php3"]')) も driver.execute_script('document.Main.pass.value="' + 'パスワード' + '";submit();') も実行しようとすると、パスワードを入力してください、とエラーになっていまいます。 ※JavaScriptパスワード入力よりも優先させることができません。try exceptで、パスワード入力エラーの後にexcept側でjavascriptを実行した場合は、「Message: Error from JavaScript: 未定義または NULL 参照のプロパティ 'pass' は取得できません」 と別のエラーになってしまいます。
shirai

2020/07/27 12:28

追記しました
gkan

2020/07/28 06:26

回答、ありがとうございます。 教えていただいた方法を組み合わせながら色々と確認していった結果、以下の方法でクリアできました。 try: ※ここはエラーを起こすため、なんでもOK。 webdriver.ActionChains(driver).send_keys(Keys.ESCAPE).perform() except: driver.switch_to.frame(driver.find_element_by_xpath('//frame[1]')) driver.execute_script('document.Main.pass.value="パスワードを入れる";') driver.execute_script('document.Main.submit();') 最初のjavascript認証はブラウザに対してのキー操作よりも優先されてしまうので、メッセージをキャンセルすることも出来ず、一度エラーを発生させなければいけないという所は気になりますが、これで問題なく後続の操作が出来るようになりました。 様々な方法をご提示いただき、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問