da202308051601
@da202308051601

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

HTMLのtd要素への手動入力をpythonを使って自動化したいです。

前提

  • Python 3.8.20
  • Chromeバージョン: 130.0.6723.92(Official Build) (x86_64)
  • chromedriverバージョン: Chromeと同じ
  • 対象サイト: とある企業の勤怠入力システム

解決したいこと

HTMLのtd要素への手動入力をpythonを使って自動化したいです。
その方法として、seleniumのwebdriverを使って、以下のtd要素のinnerTextに文字列を入力しようとしています。

<td data-x="9" data-y="34" class="inputtable p-0 pl-1 font-color-black highlight-selected highlight highlight-top highlight-bottom highlight-left highlight-right" style="text-align: center; padding: 2px;"></td>

手動入力した場合はtd要素に入力した文字列をダブルクリックすると、
編集モードとなり入力した文字列を編集できます。
そして該当するソースコードを実行すると、見た目的には文字列は入ってくれます。
スクリーンショット 2024-11-03 22.44.15.png
開発者ツールで確認したPythonで入力した要素は以下のようになっています。
HTML的には手動入力したものと同じにできています。

<td data-x="9" data-y="35" class="inputtable p-0 pl-1 font-color-black highlight-selected highlight highlight-top highlight-bottom highlight-left highlight-right" style="text-align: center; padding: 2px;">09:00</td>

しかしpythonで入力した文字列はダブルクリックした際に編集できず、非表示になっていしまいます。
以下は「09:00」をダブルクリックした画像です。
スクリーンショット 2024-11-03 22.46.06.png

以下は手動入力した文字列をダブルクリックした画像です。
入力した文字列を編集できます。
スクリーンショット 2024-11-03 22.49.10.png

該当するソースコード

以下が実際のソースコードです。

def set_time_in_row(row, times):
    time_row_index = [9, 10, 16, 17]
    for i, time in enumerate(times):
        input_element = row.find_element(By.XPATH, f'.//td[@data-x="{time_row_index[i]}"]')
        driver.execute_script(f"arguments[0].innerText = '{time}';", input_element)

自分で試したこと

以下のようにも修正してみましたが、
ダブルクリックされるだけでテキストは入力されません。
他にもsend_keysも試してみましたが、input要素ではないためかエラーが起きて使えませんでした。

def set_time_in_row(row, times):
    time_row_index = [9, 10, 16, 17]
    actions = ActionChains(driver)
    for i, time in enumerate(times):
        input_element = row.find_element(By.XPATH, f'.//td[@data-x="{time_row_index[i]}"]')
        # セルをダブルクリックして編集モードに入れる
        actions.double_click(input_element).perform()
        
        # 編集モードに入るのを待つ
        sleep(0.5)
        
        # JavaScriptで値を設定
        driver.execute_script("arguments[0].innerText = arguments[1];", input_element, time)
        
        # 編集を完了させるためにblurイベントを発火
        driver.execute_script("arguments[0].dispatchEvent(new Event('blur'));", input_element)

手動入力の方法としてはもう一つ、入力したいtd要素をシングルクリックして。そのまま「09:00」と入力すると勝手に編集モードになってくれます。
これを利用して上記ソースのdouble_clickをclickにもしてみましたが、結果は変わらずでした。
このtd要素にはjava scriptが何か動いていて、そもそも自動化は難しいとかでしょうか。

補足

  • 対象サイトの時刻入力以外の動作(プルダウンリストやボタンのクリック)は自動化できています。
0

3Answer

本来の質問とは外れてしまうかもしれませんが、PowerAutomateDesktopで対応するのはいかがでしょうか。
Pythonではありませんが、ロジックもある程度対応できると思いますので、内容にもよりますが実現できるのではないかと想像しています。

2Like

Comments

  1. @da202308051601

    Questioner

    コメントありがとうございます。
    結果が出るまで時間がかかりそうですが、試してみます。

HTMLのtd要素への手動入力をpythonを使って自動化したいです。

ユーザーがブラウザに表示された画面を見て直接何らかの操作を行うのは許されていても、その「自動化」はスクレイピングと同様な話でしょうから許されてないかもしれません。

スクレイピングは、サイトの管理者に許可を得ているとか、規約に従って専用の API にアクセスしているとかでなければ、迷惑行為になるかもしれないということは認識してますか?

クローラーを作って某図書館サイトにアクセスしたら業務妨害とかで逮捕された事例もありますので、甘く見ない方がいいと思います。

逮捕までいかなくても、被害が深刻な場合は損害賠償の訴訟を受けるかもしれません。

訴訟までいかなくても、アクセス遮断なら Web サーバーの設定で管理者だけの判断で容易に可能なので、多分に可能性はあると思います。帯域ごと遮断され、多数の利用者が巻き添えを喰らうことになるかもしれません。

1Like

Comments

  1. @da202308051601

    Questioner

    ご教授ありがとうございます。
    私の認識は甘かったかもしれないので、
    もっと慎重に使い方を判断しようと思います。

HTMLのtd要素への手動入力をpythonを使って自動化したいです。

このtd要素にはjava scriptが何か動いていて、そもそも自動化は難しいとかでしょうか。

前提がよく分からないのですが、そのHTMLというのは何者でしょうか?何かのサイトのとあるページなのでしょうか?
そしてそのHTMLへの自動入力は許可されているのでしょうか?

0Like

Comments

  1. @da202308051601

    Questioner

    情報が不足しており、申し訳ございません。
    質問を更新して、前提と補足を追加しました。
    対象サイトは、とある企業の勤怠入力システムになります。
    補足に書きましたが、対象サイトのプルダウンリストやボタンのクリックは自動化できているので、自動入力は禁止はされていないと思います。

  2. 補足に書きましたが、対象サイトのプルダウンリストやボタンのクリックは自動化できているので、自動入力は禁止はされていないと思います。

    できる=やっても良い(許可されている)ではないのでご注意ください。企業によっては原則禁止していたりします。

    しかしpythonで入力した文字列はダブルクリックした際に編集できず、非表示になっていしまいます。

    ダブルクリック操作をしなければ登録まで可能と理解して良いのでしょうか?
    自動入力が目的なのに自動入力後の手動編集もできることが要件なんですか?

  3. @da202308051601

    Questioner

    できる=やっても良い(許可されている)ではないのでご注意ください。企業によっては原則禁止していたりします。

    おっしゃる通りです。
    スリープ時間を長めに取るなどして、負担は最小限にしたいと思います。

    自動入力した文字列は見た目的には大丈夫なんですが、
    登録する際に入力してないというように見なされてバリデーションのエラーが発生します。
    なので手動入力との違いを完全に無くさないといけない=ダブルクリックしても編集できるようにする必要がありそうです。

  4. スリープ時間を長めに取るなどして、負担は最小限にしたいと思います。

    だから許されるということはないです。

    逆の立場になって考えてみましょう。あなたがサーバーの管理者だとして、どこの誰かもわからない人から「pythonを使って自動化したい」けどいいですかと聞かれて、OK です自由にやってくださいと言いますか?

    以前の質問で、マルチスレッドで無限ループでアクセスしているプロクラムを作っている人がいました。そんなことするわけないと言うかもしれませんが、あなたがサーバーの管理者だとして赤の他人の言うことを信用できますか?

  5. よく分かりませんが入力が確定されていないのかもしれませんね。input要素への入力しか経験ないので対策は分かりませんでした。

    社内システムへの自動入力化ということで、社内でOKが取れているとしてRPAでの実装が良いかもしれませんね。
    どちらにしても勤怠入力は間違えると上司・人事に迷惑をかけることになるので注意が必要ですね。

    自動化の動機が分かりませんがもし定時での始業・終業時間を一括入力したいであれば、その機能の実装を担当部署に要望するのも手だと思います。

  6. @da202308051601

    Questioner

    ありがとうございます。
    確認します。
    本質問は一旦クローズします。
    ご回答いただいたみなさん、ありがとうございました。

Your answer might help someone💌