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

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

新規登録して質問してみよう
ただいま回答率
85.40%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

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

selenium

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

Q&A

解決済

1回答

600閲覧

【スクレイピング】ダウンロードダイアログの扱い方が分からない

PON.chan

総合スコア5

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

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

selenium

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

0グッド

0クリップ

投稿2024/05/20 01:27

実現したいこと

PythonとSeleniumを使用してスクレイピングを業務のために実装しようとしています。
そこで、自動で操作している最中に画像のようなダウンロードダイアログが表示されるのですが、保存ボタンを押下して、先に進みたいです。

イメージ説明

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

スレッドを二つに分けて実行しているのですが、上手くいきません。
以下のコードはマウスを移動してクリックする操作を実装しようとしていますが、マウスは移動するもののクリックすることができません。
問題点やもっと確実な方法があれば教えて頂きたいです。

該当のソースコード

Main

1from selenium import webdriver 2from selenium.webdriver.common.keys import Keys 3from selenium.webdriver.common.by import By 4from selenium.webdriver.support.ui import WebDriverWait 5from selenium.webdriver.support import expected_conditions as EC 6import asyncio 7import time 8import input 9import buttonClick 10import pyautogui 11import nest_asyncio 12import threading 13 14def pushS(): 15    print("タイマー起動") 16    time.sleep(60) 17    pyautogui.click(814,551,button="right") 18    print("処理実行済み") 19 20def siteOperations(): 21    # WebDriverを作成(IE) 22    driver = webdriver.Ie() 23    # ウェブページを開く 24    driver.get("") 25 26    #ユーザー名の入力 27    input.inputID(driver,'NaviFrame',"UserName","") 28    # パスワードの入力 29    input.inputID(driver,'NaviFrame','PassWord',') 30    # ログインボタンをクリック 31    buttonClick.buttonClickID(driver,'NaviFrame','button1') 32 33 34    #契約データ抽出画面の表示 35    time.sleep(2) 36    driver.get("") 37 38 39    # [...]ボタンをクリック 40    buttonClick.buttonClickName(driver,'Rep5Main','select_code') 41    # [498]ボタンをクリック 42    buttonClick.buttonClickName(driver,'Rep5Sub','code386') 43    # [設定]ボタンをクリック 44    buttonClick.buttonClickName(driver,'Rep5Sub','set_btn_add') 45 46    #開始年の入力 47    input.inputName(driver,'Rep5Main',"start_year","2024") 48    #開始月の入力 49    input.inputName(driver,'Rep5Main',"start_month","1") 50    #終了年の入力 51    input.inputName(driver,'Rep5Main',"end_year","2024") 52    #終了月の入力 53    input.inputName(driver,'Rep5Main',"end_month","12") 54    55    # [出力]ボタンをクリック 56    driver.find_element(By.XPATH,"/html/body/center/form/input[1]").click() 57 58 59 60    # タブを閉じる 61    driver.close() 62    # WebDriverを終了する 63    driver.quit() 64 65if __name__ == "__main__": 66 67    #スレッドの作成 68    thread1 = threading.Thread(target=siteOperations) 69    thread2 = threading.Thread(target=pushS) 70 71    print("="*10,"スレッド1を開始","="*10) 72    thread1.start() 73    print("="*10,"スレッド2を開始","="*10) 74    thread2.start() 75 76    77    thread1.join() 78    thread2.join() 79    print("="*10,"スレッド終了","="*10)
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time def buttonClickID(driver,FrameName,ID):     #フレームの移動     time.sleep(2)     #親フレームに戻る     driver.switch_to.parent_frame()     driver.switch_to.frame(driver.find_element(By.NAME,FrameName))     # ボタンのクリック     form_button = WebDriverWait(driver, 10).until(         EC.presence_of_element_located((By.ID,ID))     )     form_button.click()     def buttonClickName(driver,FrameName,Name):     #フレームの移動     time.sleep(2)     #親フレームに戻る     driver.switch_to.parent_frame()     driver.switch_to.frame(driver.find_element(By.NAME,FrameName))     # ボタンのクリック     form_button = WebDriverWait(driver, 10).until(         EC.presence_of_element_located((By.NAME,Name))     )     form_button.click()     def buttonClickType(driver,FrameName,Type,content):     #フレームの移動     time.sleep(2)     #親フレームに戻る     driver.switch_to.parent_frame()     driver.switch_to.frame(driver.find_element(By.NAME,FrameName))     # ボタンのクリック     form_button = WebDriverWait(driver, 10).until(          EC.presence_of_element_located((By.CSS_SELECTOR, 'input[type="' + Type + '"][value="' + content + '"]'))                                             )     form_button.click()
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time from selenium.webdriver.common.keys import Keys def inputID(driver,FrameName,ID,content):     #フレームの移動     time.sleep(2)     #親フレームに戻る     driver.switch_to.parent_frame()     driver.switch_to.frame(driver.find_element(By.NAME,FrameName))     # 入力内容の入力     form_input = WebDriverWait(driver, 10).until(         EC.presence_of_element_located((By.ID,ID))     )     form_input.send_keys(content)     def inputName(driver,FrameName,Name,content):     #フレームの移動     time.sleep(2)     #親フレームに戻る     driver.switch_to.parent_frame()     driver.switch_to.frame(driver.find_element(By.NAME,FrameName))         #入力内容あればクリアにする     driver.find_element(By.NAME,Name).send_keys( Keys.CONTROL + "a" )     driver.find_element(By.NAME,Name).send_keys( Keys.DELETE )         #element = driver.find_element(By.NAME, Name)     #element.clear()     time.sleep(2)     # 入力内容の入力     form_input = WebDriverWait(driver, 10).until(         EC.presence_of_element_located((By.NAME,Name))     )     form_input.send_keys(content)

試したこと・調べたこと

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

キーボードから直接入力するようにしたのですが、効果がありませんでした。

補足

使用ツール
Python
Selenium
EdgeのIEモード

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

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

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

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

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

guest

回答1

0

ベストアンサー

そのダイアログは、Windowsの機能が直接管理しているので、Seleniumで操作不可でしょうね。

IEは今使ってないのですが、設定画面のダウンロードオプション設定で確認ダイアログを出すかどうかのオプションがあるはずなので、それをオフにします。

案0:デフォルト設定?
IEは今使ってないので確認できませんが、もしかすると他のブラウザのようにプロファイル単位じゃなくて、ユーザー単位でその設定が効くなら(そのユーザーがSelenium経由で起動したIEにも効くなら)、あらかじめ設定を変更しておく。

なんとなくそれで行けそうな気がしますが、
Chrome等だと、Seleniumから起動すると通常と別のプロファイルが使われて、通常状態であらかじめ設定しても効かないです。もしIEもそれと同じようにSeleniumで効かない場合は、下記のいずれかで。

案1:半自動
driver = webdriver.Ie()の次に、input("ブラウザの設定画面でダウンロードの確認ダイアログを出さない設定に変更後、Enterを押して下さい")を入れて、そのように操作する。

案2:自動その1
driver = webdriver.Ie()の前に、そのような設定をします。
IEについては調べる気がしないので、Chromeの例を書いておきますので、それに該当するコードに変更して下さい。
IEでの方法が不明なら、案1で。

Python

1from selenium.webdriver.chrome.options import Options 2~~~中略~~~ 3options = Options() 4options.add_experimental_option("prefs",{ 5 "download.default_directory": r"Z:\TEMP", #ダウンロード先を指定 6 "download.prompt_for_download": False #ダイアログを出さない 7}) 8driver = webdriver.Chrome(options=options)

案3:自動その2
ChromeやFirefoxだと、Selenium経由でブラウザを起動する際に既存プロファイルを指定できます。
参考コードはググって下さい。このサイトでもChoromeについての質問と回答が何度か出ていますが、Seleniumのバージョンによって方法が違う可能性があり、バージョンが古いと使えないかもしれません。
これもIEの例が見つかるかどうか。

投稿2024/05/20 19:10

otn

総合スコア85458

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

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

PON.chan

2024/05/23 09:08

ご回答ありがとうございます。 別の方法を検討することになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問