web-dev-qa-db-ja.com

Seleniumでファイル(画像)をアップロードする方法、python

Seleniumテストツールを使用してWebアプリケーションに画像をアップロードする方法は?私はpythonを使用しています。

私は多くのことを試しましたが、何もうまくいきませんでした。

46
Filip

入力コントロールをアップロードすると、ネイティブダイアログが開きます(ブラウザによって実行されます)。そのため、Seleniumを介してコントロールボタンまたは参照ボタンをクリックすると、ダイアログがポップされ、テストがハングします。

回避策は、JavaScriptを使用してアップロード入力の値を設定し(JavaでJavascriptExecutorを使用して行われます)、フォームを送信します。

この質問 を参照してください。C#のサンプルについては、PythonでJavaScriptを呼び出す方法もありますが、Selenium Python =バインディング

5
Sergii Pozharov

私がやっていることはこれです(drvがwebdriverのインスタンスであることを確認してください):

drv.find_element_by_id("IdOfInputTypeFile").send_keys(os.getcwd()+"/image.png")

送信ボタンを見つけてクリックします。

140
karloskar

これらのアプローチはすべて、olxの最新の画像アップローダーでは機能しません。代替アプローチ(Windowsのみ)

1. Automation of windows can be done using Autoit 
2. Install Autoit and SciTe Script editor 
3. Autoit code :(imageupload.au3)

WinActivate("File Upload");  for chrome use "open" that is the name of the window that pops 
send("D:\images\image1.png");  path of the file
Send("{ENTER}")

4. compile it to get an .exe file(imageupload.exe)
5. Now from python call the .exe file like

import os
import os.system('C:\images\imageupload.exe') #path of the .exe file
7
saravanan

迷惑なmsofiledialogsを使用したいと考えている人には答えを追加しました。これは、サラバナンが提案した解決策に取り組んでいますが、Pythonの方が具体的です。

側の会社で作業しているスクリプトでも同様の問題が発生しました。会社のクライアント向けにドキュメントをアップロードしようとしていますが、サイトの動作方法が原因で、send_keysを使用して直接パスを送信できなかったため、msofiledialogに頼らなければなりませんでした。

  1. AutoItをインストールするだけです https://pypi.python.org/pypi/PyAutoIt/0. またはcmd画面から「pip install -U pyautoit」のみ

  2. スクリプトページに「import autoit」と入力します

  3. スクリプトにファイルダイアログが表示される前に、次を入力します。

    autoit.win_active( "Open")autoit.control_send( "Open"、 "Edit1"、r "C:\ Users\uu\Desktop\TestUpload.txt")autoit.control_send( "Open"、 "Edit1"、 "{入る}")

ファイルを開くダイアログウィンドウを探して入力し、Enterキーを押します。 「開く」は、ファイルダイアログ画面のタイトルです。 「オープン」の代わりにあなたのタイトルを入れてください。 AutoItの機能を利用するより創造的な方法がありますが、これは初心者にとって簡単で簡単な方法です。

編集:しないでください。回避できる場合は、ほとんどのものにcontrol_sendを使用しないでください。誤ったテキストを送信するという既知の問題があります。私の場合、ファイルパスのコロンはセミコロンに変換されていました。入力キーを送信する必要がある場合は問題ありませんが、テキストを送信する必要がある場合は、control_set_textを使用します。構文は同じです。

autoit.control_set_text("Open","Edit1",r"C:\Users\uu\Desktop\TestUpload.txt")
7
Noctsol

私は fine-uploader を使用しており、pytestでSeleniumテストを実行していますが、これはうまくいきました:

    Elm = driver.find_element_by_xpath("//input[@type='file']")
    Elm.send_keys(os.getcwd() + "/tests/sample_files/Figure1.tif")

私の場合、フォームの送信やEnterキーは必要ありません。

すべての答えをありがとう!それは大いに役立ちました!

5
AnaPana
import win32com.client

Shell = win32com.client.Dispatch("WScript.Shell")   
Shell.Sendkeys("C:\text.txt")  
Shell.Sendkeys("~")

問題を解決します

3
user1859723

ここに私が使用したコードがあります:

Imagepath = "C:\User\Desktop\image.png" driver.find_element_by_xpath('//html/body/input').send_keys(Imagepath) driver.find_element_by_xpath('//html/body/button').click()

Karloskarによる回答を受け入れます。注FireFox(59)では機能しません。そして、それはChromeドライバーのみで動作します。

0
Arun K

autoitツールを使用してファイルをアップロードするための完全なコード。これをコピーして貼り付けるだけで実行できます。これはアクティタイムデモなので動作します。

from Selenium import webdriver
from Selenium.webdriver.support.ui import WebDriverWait
from Selenium.webdriver.support import expected_conditions as ec
from Selenium.webdriver.common.by import By
from Selenium.webdriver.common.keys import Keys
import time
import os

def fileUploading():

    driver = webdriver.Firefox()
    driver.implicitly_wait(20)
    wait = WebDriverWait(driver, 10)
    driver.get("https://demo.actitime.com/login.do");
    driver.find_element(By.ID,"username").send_keys("admin")
    driver.find_element(By.NAME, "pwd").send_keys("manager")
    driver.find_element(By.XPATH, "//div[.='Login ']").click()
    wait.until(ec.element_to_be_clickable((By.XPATH, "(//div[@class='popup_menu_icon'])[3]")))
    driver.find_element(By.XPATH, "(//div[@class='popup_menu_icon'])[3]").click()
    wait.until(ec.element_to_be_clickable((By.XPATH, "//a[contains(text(),'Contact actiTIME Support')]")))
    driver.find_element(By.XPATH, "//a[contains(text(),'Contact actiTIME Support')]").click()
    wait.until(ec.element_to_be_clickable((By.XPATH,"//div[@class='dz-default dz-message']")))
    driver.find_element(By.XPATH,"//div[@class='dz-default dz-message']").click()
    os.system("C:\\Users\\mallikar\\Desktop\\screenUpload.exe")
    time.sleep(2000)

fileUploading()

autoitコードの内容は次のとおりです。

WinWaitActive("File Upload")
Send("D:\SoftwareTestingMaterial\UploadFile.txt")
Send("{ENTER}")

autoItおよびautoIt SCITEエディターツールをダウンロードします。 autoitをインストールしてsciteエディターを開き、上記のコードを貼り付けて.au3拡張子で保存し、保存したら、ファイルを右クリックしてcomplile script(x64)を選択すると、.exeファイルが作成されます。

以下のコードを使用してください:

os.system("C:\\Users\\mallikar\\Desktop\\screenUpload.exe")
0
Mallikarjuna B

破片の使用:

browser.attach_file( 'file_chooser_id'、fully_qualified_file_path)

0
Anjan Dash

以下のスクリプト形式を使用して画像をアップロードしました。これはあなたを助けるかもしれません。

   Imagepath=os.path.abspath('.\\folder1\\subfolder2\file1.jpg')
   driver.find_element_by_id("Id of the element").clear()            
   driver.find_element_by_id("Id of the element").send_keys(Imagepath)

オブジェクトのIDがない場合は、それに応じてxpathまたはcssセレクターを使用できます。

0
Tester P