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

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

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

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

selenium

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

Q&A

解決済

1回答

1034閲覧

Google Colabでselenium使用時、『send_keys』がエラーになってしまう件

tottey1226

総合スコア19

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

selenium

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

0グッド

0クリップ

投稿2023/03/21 09:33

編集2023/03/22 00:43

実現したいこと

Google Colabを使用して、あるWEBサイトにログインし、操作して、情報を取得したいです

前提

(1)対象のWEBサイト:ログイン後、WEB操作が必要
(2)PCのローカルで作成したPythonでは(ヘッドレスモードは使用しない記述)問題なくWEBサイトからの情報を取得できている
(3)契約上情報の取得の問題はなし
WEBサイトの顧客なのですが、毎日その数値を取得しスプレットシートに転記して
ほかのメンバーに共有する
(4)『Colab の Selenium use chrome が予期せず終了しました』のエラーは下記URLの
コードを今回のスクリプト実行前に実行することで回避できております。
https://github.com/kaliiiiiiiiii/Selenium-Profiles/issues/10

 google colaboratoryで、あるWEBサイトにログイン後、操作、情報を取得・・としたかったのですが、ログイン時にエラーとなってしまいました。。。

 問題点
① ログインの箇所で、IDを入力させるためのコードの部分『send_keys』の箇所がエラーになる
② ID,PASSのログイン部分をコメントアウトし、ログインボタンを押すコードから実行させたがそれもエラー(ブラウザにID、PASSを記憶させているせいかと思ったので)

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

①ログインの箇所で、IDを入力させるためのコードの部分『send_keys』の箇所がエラー

ElementNotInteractableException Traceback (most recent call last) <ipython-input-33-a9c55d67b36d> in <module> 45 46 name='eclogin' ---> 47 d.find_element(By.NAME,value=name).send_keys('IDを設定') 48 sleep(3) 49 3 frames /usr/local/lib/python3.9/dist-packages/selenium/webdriver/remote/errorhandler.py in check_response(self, response) 243 alert_text = value["alert"].get("text") 244 raise exception_class(message, screen, stacktrace, alert_text) # type: ignore[call-arg] # mypy is not smart enough here --> 245 raise exception_class(message, screen, stacktrace) ElementNotInteractableException: Message: element not interactable (Session info: headless chrome=90.0.4430.212)

② ID,PASSのログイン部分をコメントアウトし、ログインボタンを押すコードから実行させたがそれもエラー

ElementNotInteractableException Traceback (most recent call last) <ipython-input-37-46bbf5b34699> in <module> 54 55 #ログインボタンを押す ---> 56 d.find_element(By.NAME, 'login_ec_btn').click() 57 sleep(2) 58 3 frames /usr/local/lib/python3.9/dist-packages/selenium/webdriver/remote/errorhandler.py in check_response(self, response) 243 alert_text = value["alert"].get("text") 244 raise exception_class(message, screen, stacktrace, alert_text) # type: ignore[call-arg] # mypy is not smart enough here --> 245 raise exception_class(message, screen, stacktrace) ElementNotInteractableException: Message: element not interactable (Session info: headless chrome=90.0.4430.212) Stacktrace: #0 0x5562edb457f9 <unknown>

該当のソースコード

#ライブラリをインポート from selenium import webdriver import time import datetime import sys #if文でreturnで中止するときに必要 import os #ユーザーのプロファイルパスを取得するときに必要 '''----------------------- そのほか使うライブラリ --------------------------''' from time import sleep from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import Select from datetime import timedelta from tkinter import messagebox #--------------------------------------------------------------------------------------- # 処理開始 #--------------------------------------------------------------------------------------- # ブラウザをheadlessモード実行 # オプション定義 options = webdriver.ChromeOptions() options.add_experimental_option('excludeSwitches', ['enable-logging']) options.use_chromium = True #ChromeDriverを自動更新するライブラリ # from webdriver_manager.chrome import ChromeDriverManager print("\nブラウザを設定") options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') d = webdriver.Chrome('chromedriver',options=options) d.implicitly_wait(10) # サイトにアクセス print("サイトにアクセス開始") d.get("アクセスしたいURL") sleep(2) print(d.title) sleep(2) print(d.title) name='eclogin' d.find_element(By.NAME,value=name).send_keys('ログインID') sleep(3) # password入力 pw='ecpasswd' d.find_element(By.NAME,value=pw).send_keys('パスワード') sleep(3) #ログインボタンを押す d.find_element(By.NAME, 'login_ec_btn').click() sleep(2) #『レポート』を選択する d.find_element(By.CLASS_NAME,'drop').click() sleep(2) ・ ・ ・

試したこと

先に記載した内容と重複しますが
・ ID,PASSのログイン部分をコメントアウトし、ログインボタンを押すコードから実行させた(ブラウザにID、PASSを記憶させているせいかと思ったので)

 ・インストールするドライバーのバージョンの指定
前提の(4) のhttps://github.com/kaliiiiiiiiii/Selenium-Profiles/issues/10に、
apt-get install chromium chromium-driver という箇所があるのですが、1つ
バージョンを下げたものをインストールするようの記述してみました(結果:変わらず)
pip install chromedriver-binary==108.0.5359.71

  

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

そもそもの話になってしまうのですが、
headlessモードを使用している場合は、Send_Keysは使えないのでしょうか。

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

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

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

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

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

meg_

2023/03/21 12:24

質問タグ「Pythonista」は本質問とどのように関係していますか?
tottey1226

2023/03/21 12:48

大変申し訳ございません!タグの選択を間違えてしまいました。修正いたしました
meg_

2023/03/21 15:57 編集

> (2)PCのローカルで作成したPythonでは問題なくWEBサイトからの情報を取得できている ヘッドレスモードでの話ですか?
tottey1226

2023/03/22 00:37

(説明が不足しておりました) PCのローカルではヘッドレスモードは使用しておりません。 Google Colabで、ローカルで実行しているコードをそのまま使用できなかったため、ネットで調べるとヘッドレスモードで書かれている方が多かったため、同様にコードを記述した次第です。
guest

回答1

0

ベストアンサー

headlessモードを使用している場合は、Send_Keysは使えないのでしょうか。

そのようなことは無いと思います。GoogleColaboratoryを使って確認してみましたが質問のエラー(ElementNotInteractableException)は発生しませんでした。

d.find_element(By.NAME,value=name)で取得している要素が目的の要素になっているか確認されてはどうでしょうか?(send_keysが使える要素かどうかの確認)

投稿2023/03/21 16:15

meg_

総合スコア10753

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

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

tottey1226

2023/03/22 00:43 編集

ご返信ありがとうございます! d.find_element(By.NAME,value=name)ですが、send_keysが使える要素のようです。 ローカルでヘッドレスモードを使用せず実行するコードの方では、ログインできます。(説明を修正いたしました)
meg_

2023/03/22 00:53

ローカルPCでヘッドレスモードで実行した場合はどうなりますか?サイトによってはヘッドレスモードで実行した際に異なるレスポンスが返ってくる場合があります。「ローカルでヘッドレスモードを使用せず実行するコードの方」ではなく、実際にエラーが発生している環境で確認する必要があるのでは?との意見です。
tottey1226

2023/03/23 02:31

なるほど!ヘッドレスモードによってレスポンスが変わることがあるんですね。情報をありがとうございます。試してみます。結果をまたこちらに記載いたします
tottey1226

2023/03/25 08:35

meg_様 ローカルで動いていたPythonファイルのコードを、ヘッドレスモードにして (※options.add_argument('--headless')を追記)実行いたしましたところ、 47 d.find_element(By.NAME,value=name).send_keys('IDを設定') の箇所でエラーとなりました。 エラー:Message: element not interactable  この要素は、ヘッドレスモードでは入力できないということになりますでしょうか。
meg_

2023/03/25 09:48

> この要素は、ヘッドレスモードでは入力できないということになりますでしょうか。 その要素がキー入力を受け付けない要素なのではないでしょうか?
tottey1226

2023/03/27 08:33

ご返信ありがとうございます! >その要素がキー入力を受け付けない要素なのではないでしょうか? ローカルの方のPythonファイルではキー入力を受け付けており、以下でID,PASSともに入力してくれるのです。 ーーーーーーーーーーーーーーーーーーーーーーーーーーー ライブラリ等の設定の箇所に以下を追記いたしましたが、 options.add_argument('--headless') '''---------------------- ブラウザ操作 --------------------------''' driver_path = "C:/ChromeDriver/chromedriver.exe" service = Service(executable_path=driver_path) # 2) executable_pathを指定 d = webdriver.Chrome(service=service, options=options) d.get("https:/xxxxxxxxxx") sleep(2) print(d.title) name='eclogin' d.find_element(By.NAME,value=name).send_keys('ログインID') sleep(1) # password入力 pw='ecpasswd' d.find_element(By.NAME,value=pw).send_keys('パスワード') sleep(1)
meg_

2023/03/27 11:16

> ローカルの方のPythonファイルではキー入力を受け付けており、以下でID,PASSともに入力してくれるのです。 それはブラウザを表示して操作した場合ですよね? ヘッドレスモードで実行した場合に「ElementNotInteractableException」が発生するということはその要素はsend_keysが使えない要素という事になります。(ヘッドレスなので目で見て確認はできませんが)
tottey1226

2023/03/27 14:35

meg_様 >ブラウザを表示して操作した場合ですよね? はい、その通りです。 >ヘッドレスモードで実行した場合に「ElementNotInteractableException」が発生するということはその要素はsend_keysが使えない要素という事になります。 そういう意味だったんですね。ご説明頂きありがとうございます!大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問