🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SELinux

SELinuxmとは、セキュリティに関するLinuxカーネルの制御機能。Linuxディストリビューションではありません。強制アクセス制御機能を付け加えるモジュールの名称で、米国家安全保障局 (NSA)が中心となり開発しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

JavaScript

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

Q&A

解決済

1回答

228閲覧

execute_scriptとXpathを組み合わせた文字入力の方法を知りたい

hanasaburou

総合スコア5

SELinux

SELinuxmとは、セキュリティに関するLinuxカーネルの制御機能。Linuxディストリビューションではありません。強制アクセス制御機能を付け加えるモジュールの名称で、米国家安全保障局 (NSA)が中心となり開発しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

JavaScript

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

0グッド

1クリップ

投稿2024/07/08 03:46

実現したいこと

Xpathでしか指定できないテキストエリアにexecute_scriptを利用して文字入力をしたいです。
send.keysでの文字入力はできますがとてもとても遅くて実用的ではありません。
また社内データベースを利用しているのでHTMLを書き換えることはできません。

発生している問題・分からないこと

send.keysでは成功しています
driver.find_element(By.XPATH, f'//TD[contains(text(),"ポニーテール")]/following-sibling::TD/textarea[@name="備考"]').send_keys("馬の尻尾")

これをexecute_scriptで書きたいです。
色々調べて、

BOX=driver.find_element(By.XPATH, f'//TD[contains(text(),"ポニーテール")]/following-sibling::TD/textarea[@name="備考"]') driver.execute_script(f'document.write("馬の尻尾")',BOX)

としてみましたが、馬の尻尾という文字がブラウザに表示されて壊したんじゃないかと驚きました。

どうぞよろしくお願いします。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

情報が少なく困っています。

補足

特になし

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python

1BOX = ~~~ 2driver.execute_script("arguments[0].value='ABCDEFG'",BOX)

で、textarea内にABCDEFGが書かれると思います。
JavaScript中のarguments[0]は、第二引数のBOXが表す要素です。

send.keysでの文字入力はできますがとてもとても遅くて実用的ではありません。

実用的じゃないほど遅いというのは普通はないと思うので、1文字入力毎にイベントハンドラーが動いているのでは?
もしそうだとすると、上記のようにvalue=で書き換えちゃうとイベントハンドラーが起動しない気がするのでまずいかも知れません。

前に社内システムの半自動化をtampermonkeyでした時に、inputvalueをJavaScriptで直接書き換えちゃうと、イベントハンドラーが起動せず関連項目が自動変更されないため、value代入後にハンドラーを起動するコードを追加した気がします。

投稿2024/07/09 11:47

otn

総合スコア85893

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

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

hanasaburou

2024/07/10 02:54

できました! send.keysが遅いのはseleniumのバージョンを上げてからで、IEモードでウェブドライバが64bitだと遅くなるとかいう現象です。 driver.execute_script('document.getElementById("銘柄").value="%s";' % meigara) という方法はやっていて、xpathをどこに持ってきたらいいのか解らなかったのですが、おかげさまで解決です。 driver.execute_script("arguments[0].value='ABCDEFG'",BOX) これを変数化する方法が解らなかったのですが、先の "%s";' % meigara を参考にしてやってみたらできました。「%sが変数に置き換える」 「後の%がその変数」という意味なんだろうなと捉えています。 クリップボードにいったん入れて、send.keysで貼り付ける方法をとっていたのですが、やはりdriver.execute_scriptを使ったほうがスマートでいいですね。 この度は大変ありがとうございました!!
otn

2024/07/10 03:19

> send.keysが遅いのはseleniumのバージョンを上げてからで、IEモードでウェブドライバが64bitだと遅くなるとかいう現象です。 ほう。IEは使わないので、知りませんでした。今がIEが32bitドライバが64bitの場合と言うことであれば、IEを64bitにしてみる手もあると思います。それで治まるのかどうか分かりませんが。 > "%s";' % meigara を参考にして の % は、基本的な演算子(本来は数値演算用だが文字列に対して拡張された)です。 文字列に変数を埋め込む方法はいろいろありますが、この方法は公式リファレンスにも https://docs.python.org/ja/3/library/stdtypes.html#old-string-formatting > タプルや辞書を正しく表示するのに失敗するなどのよくある多くの問題を引き起こす、様々な欠陥が出現します。 と、「正しく使えば問題ないけど、正しく使うのが難しい」という意味の記述があります。 今は「フォーマット済み文字列リテラル」f"~~~~" を使うケースが多いようです。 素朴に、"arguments[0].value='"+meigara+"'" でもいいですけど。これはPython入門途中の人でも書けるはずです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問