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

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

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

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

selenium

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

Q&A

解決済

1回答

5465閲覧

python seleniumでsend_keysに変数の値を入力したいです。

shiro55

総合スコア9

Python

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

selenium

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

0グッド

0クリップ

投稿2020/02/17 05:57

編集2020/02/17 09:58

仕事のルーティンを自動化するためにseleniumを勉強しています。
まだまだ初心者で拙い部分だらけですが、よろしくお願いします。

書いたソースコード

python

1 2# -*- coding: UTF-8 -*- 3 4import time 5from selenium import webdriver 6from selenium.webdriver.common.keys import Keys 7from selenium.webdriver.chrome.options import Options 8 9f = open(r"C:\Users\user\Desktop\testtext.txt", "r") # IDファイルを読み込み 10id = f.read() # ファイルの中身を変数IDへ 11f.close() # ファイルを閉じる 12 13 14def main(): 15 16 options = Options() 17 options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application/chrome.exe" # chromeもしくはchromiumの実行ファイルを指定 18 #options.add_argument('--headless') # ヘッドレスモード(ブラウザを表示させないで実行) 19 #options.add_argument("--window-size=800,800") # ブラウザの表示サイズ 20 21 # ブラウザ起動(executable_pathにはwebdriverの場所を指定) 22 driver = webdriver.Chrome(executable_path= r"C:\Users\user\Anaconda3\Lib\site-packages\chromedriver_binary\chromedriver.exe", chrome_options=options) 23 24 # URLオープン 25 driver.get('http://urlxxx.com/login/?url') 26 time.sleep(1) # 待ち時間 27 28 # IDの入力 29 id = driver.find_element_by_name("loginId") #ID入力の要素 30 id.send_keys("xyz") #ID入力 31 32 # passの入力 33 password = driver.find_element_by_name("password") #pass入力の要素 34 password.send_keys("0000") #pass入力 35 36 time.sleep(1) 37 38 39 # ログインクリック 40 login_button = driver.find_element_by_name("go") 41 login_button.click() 42 43 time.sleep(2) 44 45 # 同意する 46 accept_button = driver.find_element_by_name("accept") 47 accept_button.click() 48 49#HOME展開完了 50 time.sleep(2) 51 mframe = driver.find_element_by_name("menu_frame") 52 driver.switch_to.frame(mframe) #menuframeに切り替え 53 time.sleep(2) 54 kanri = driver.find_element_by_link_text("ユーザー管理") 55 kanri.send_keys(Keys.RETURN) 56 57#ユーザー検索へ移動 58 time.sleep(3) 59 driver.get("urlxxx.com/home/menu") 60 61 driver.get("urlxxx.com/home/menu/idcheck") 62 time.sleep(5) 63 64#検索開始 65 sysid = driver.find_element_by_name("systemIds") #システムID入力フォームの要素 66 sysid.send_keys(id) #システムID入力 67 kensaku = driver.find_element_by_name("first") 68 kensaku.click() 69 70 71 72 73if __name__ == '__main__': 74 main() 75

f = open(r"C:\Users\user\Desktop\testtext.txt", "r") # IDファイルを読み込み
id = f.read() # ファイルの中身を変数idへ
f.close() # ファイルを閉じる

にて外部に保存したテキストファイルを読み込み変数idへ格納したのち

sysid = driver.find_element_by_name("systemIds") #システムID入力フォームの要素
sysid.send_keys(id) #システムID入力

↑ここでkeys()にidへ格納した値を入力する方法をご教示いただけますでしょうか。

sysid = driver.find_element_by_name("systemIds")←入力フィールドの要素
この入力フィールドに対して外部のテキストファイルのデータを入力したいと考えており、send_keysを利用しています。
外部のテキストファイルのデータを変数idに取り込んでいますが、上記の通りで実行すると
TypeError: object of type 'WebElement' has no len()
というエラーが出てしまいます。
sysid.send_keys(id)のidの値を手動で入力すると問題なく実行できますが、手動での実行ではなく外部からデータを取り込む事も含め自動で実行出来ればと考えております。

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

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

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

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

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

t_obara

2020/02/17 07:05

keys() とは何を意味していますか? 「idへ格納した値を入力する方法」とは具体的にどのような処理をしたいと考えているのでしょうか?sysidで示されるエレメントにidの内容を設定したいという意図であれば、sysidがテキストを受け取れる要素であれば、send_keysで良いと思いますが。
shiro55

2020/02/17 07:43

ご回答ありがとうございます。 >keys() とは何を意味していますか? sysid = driver.find_element_by_name("systemIds")←入力フィールドの要素 この入力フィールドに対して外部のテキストファイルのデータを入力したいと考えており、send_keysを利用しています。 外部のテキストファイルのデータを変数idに取り込んでいますが、上記の通りで実行すると TypeError: object of type 'WebElement' has no len() というエラーが出てしまいます。 sysid.send_keys(id)のidの値を手動で入力すると問題なく実行できますが、手動での実行ではなく外部からデータを取り込む事も含め自動で実行出来ればと考えております。
t_obara

2020/02/17 08:44

> TypeError: object of type 'WebElement' has no len() というエラーが出てしまいます。 これは、sysidに対して、len(syid)などとしていませんか? また、上記ご提示された情報を質問を変更してご提示すると、回答が得られやすくなると思います。 > idの値を手動で入力すると問題なく実行 という場合、わたしが考えつくポイントは2つ。1)適切にWaitをしないために要素が見つからない。2) idの値がファイル読み込みでは正常に格納されていない。が思いつきますが、いずれも提示されたエラーは出ないと思いますので、もう少し調べる必要があるのですが、提示された情報だけではなんとも回答ができません。
shiro55

2020/02/17 09:38

ご指摘ありがとうございます。質問内容編集しました。 f = open(r"C:\Users\user\Desktop\testtext.txt", "r") # IDファイルを読み込み id = f.read() # ファイルの中身を変数idへ f.close() # ファイルを閉じる ここまでを単体で実行すると、testtext.txtの内容は正常に表示できています。 waitを追加しましたが変化はなく、idに格納した値が複数のため sysid = driver.find_elements_by_name("systemIds") に変更してみましたが、 AttributeError: 'list' object has no attribute 'send_keys'というエラーになりました。
t_obara

2020/02/17 11:00

find_elements_by_name の場合返却される要素はリストで返却されるので、そのままではエラーになります。(提示されたエラーメッセージの通りです)
shiro55

2020/02/17 11:49

ご回答ありがとうございます。 内容を参考にxpathにて要素を指定してみましたが、同じ結果でした。 もしかして、そもそもfind_elementsで取得した要素に対してsend_keys()で変数を送る事自体が不可能なのでしょうか? その場合、他の方法をご教示いただけると幸いです。
t_obara

2020/02/18 00:14

クロールするWebページやHTMLなどをご提示された方が適切な回答を得られやすいかと。
shiro55

2020/02/18 01:54

HTMLは <textarea name="systemIds" cols="25" rows="4" id="systemIds"></textarea> となります。 この入力フィールドに外部から読み込んだテキストファイルの内容を入力したいです。 webページそのものを出すと回答をいただきやすいとは思いますが、社内データのためオープンにする事は出来ず、申し訳なく思います。
guest

回答1

0

ベストアンサー

find_elementsじゃなくてfind_elementです。
sをつけると該当する全ての要素がリストで返ります。
リストにはsend_keysというメソッドはないのでAttributeErrorが返ったというオチです。

投稿2020/02/17 16:14

shirai

総合スコア1290

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

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

shiro55

2020/02/18 02:06

ご回答ありがとうございます。 エラーの内容からfind_elementsでは取得した要素は全てリストになるとの事で、 sysid [id]としてみましたが、その場合未入力のまま進んでしまうという事になり結果駄目でした。 改めてsend_keysのメソッドを調べてみましたが、固定の文字列を入力と特殊キーの入力しか対応してないのでは?と思えてきました。
shirai

2020/02/18 02:55

sysid = driver.find_element_by_name("systemIds") sysid.send_keys(id) で未入力扱いになるということでしょうか? それでしたら以下を確認していただけますか。 1 ファイルから受け取った文字列の変数名idをsearch_wordに変える これでうまく実行できるか確かめてみてください。 具体的には f = open(r"C:\Users\user\Desktop\testtext.txt", "r") # IDファイルを読み込み id = f.read() # ファイルの中身を変数IDへ f.close() を f = open(r"C:\Users\user\Desktop\testtext.txt", "r") # IDファイルを読み込み search_word = f.read() # ファイルの中身を変数IDへ f.close() に、 sysid = driver.find_element_by_name("systemIds") #システムID入力フォームの要素 sysid.send_keys(id) #システムID入力 を sysid = driver.find_element_by_name("systemIds") #システムID入力フォームの要素 sysid.send_keys(search_word) #システムID入力 に、です。 2 print(len(driver.find_elements_by_name("systemIds"))) これで何か数値が返ってくるので何だか教えてください。 3 print(type(search_word)) <class 'str'>と帰ってくるか確認してください。 4 print(len(search_word)) 検索欄に入れたい文字列の文字数と一致するか確認してください。 sの有無に注意してください。
shiro55

2020/02/18 03:10

二日ずっと詰まっていたところで進めてビックリしています!! 処理は問題なく実行されましたが、変数名にidを付けていた事で要素タグとして認識されてしまっていたのでしょうか? 2の回答:1 3の回答:<class 'str'> 4の回答:出力結果11 検索欄に入れたい文字列 39 40 41 42 4の出力結果は異なりましたが、ブラウザでの自動処理では39 40 41 42が入力され正常に処理出来ました!! ありがとうございます。
shirai

2020/02/18 03:55

> 処理は問題なく実行されましたが、変数名にidを付けていた事で要素タグとして認識されてしまっていたのでしょうか? 私も詳しくpythonの仕様を知らないので断言はできないですが、 「id」という2文字がpythonの予約語だったのでうまく動作していなかったか、 「id」という名前の変数に文字列を入れた後、ログインidのエレメントで内容を上書いていたために誤作動が起こった のどちらかのはずです。
shiro55

2020/02/18 05:48

なるほど!!そうだったんですね。 変数名に全然気がいってなく気付きませんでした。 おかげで順調に進める事が出来ています。 本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問