这是一个规范的问题,旨在为许多相关问题提供全面的答案。

在Webdriver测试过程中,我要上传文件。但是,这将打开一个本机文件选择器,Webdriver似乎不支持与之交互。如何与之互动?

#1 楼

使用Webdriver上传文件
注意:此答案适用于Selenium2。显然Selenium 3再次更改了界面。
本地
如果文件位于同一台计算机或映射的网络驱动器上,则为实际上非常简单:您需要在文件上传控件中“键入”文件的路径。示例:
driver = webdriver.Firefox()
element = driver.find_element_by_id("fileUpload")
element.send_keys("C:\myfile.txt")

(来自此SO答复的代码)
使用RemoteWebDriver
为了使文件能够从本地计算机传输到远程计算机,以便可以将其上传,您需要设置所谓的文件检测器。 Java示例:
    driver.setFileDetector(new LocalFileDetector());
    WebElement upload = driver.findElement(By.id("myfile"));
    upload.sendKeys("/Users/sso/the/local/path/to/darkbulb.jpg");

(来自Sauce Labs的代码,以及更多信息,请参阅)

评论


我收到错误selenium.common.exceptions.WebDriverException:消息:未知错误:无法聚焦元素

– SIslam
16 Mar 7 '16 at 11:52

@Sislam您应该提出问题,这里的评论不是寻求帮助的正确位置。当您这样做时,请附上您要对其自动化的HTML代码段,因为我怀疑这很重要

– Yamikuronue
16 Mar 10 '16 at 13:07



@Yamikuronue驱动程序。我没有setFileDetector,所以我想它已经更改了,但是我不知道该怎么办

– mosaad
16 Dec 20'在12:14

@mosaad我的公司尚未更新到Selenium 3,但我已经注释了答案并提出了赏金。希望它将很快得到Selenium 3的更新!

– Yamikuronue
16 Dec 20'在12:23

是的,这对于硒3同样有效,我正在使用硒3,并且其工作方式相同。

– Keshav
16-12-28 at 13:47

#2 楼

使用Robot类上载文件

此方法用于处理Windows文件上载对话框,而Selenium无法处理该对话框。请按照以下步骤操作:



单击File Upload / Choose File按钮,以显示“文件上载”对话框。 >

将文件的绝对路径复制到剪贴板

driver.findElement(By.id("uploadbutton")).click;



将文件的绝对路径粘贴到File的File name字段中上传对话框

StringSelection ss = new StringSelection("D:/Test/Test1.docx");
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);




评论


为什么在路径D://Test//Test1.docx中正斜杠?

–ilm
16-2-16在8:09



看起来像错字。它应该是“ \\”或“ /”

–小熊猫
16-2-17在6:39

如果计算机已注销,则此解决方案无效,文本将粘贴到其他位置而不是文件选择窗口中。此解决方案是我们目前使用的解决方案,我们正在寻找该问题的解决方案

–elhadi dpıpɐɥןǝ
18年6月28日在14:28

#3 楼

使用AutoIT上传文件

关于AutoIT:

AutoIt v3是一种类似于BASIC的免费软件,其脚本语言旨在实现Windows GUI和常规脚本的自动化。它结合了模拟的击键,鼠标移动和窗口/控件操作来自动执行任务。

此方法用于处理Windows文件上传对话框,而Selenium无法处理该对话框。请按照以下步骤操作:


下载AutoIT

打开SciTE脚本编辑器

下面的脚本用于检测Windows文件上传对话框

WinWaitActive("File Upload") //File Upload is the dialog's title
Send("Full path of the document") 
Send("{ENTER}")


将上述脚本文件另存为Script.au3

从SciTE Editor编译文件,您将获得Script.exe文件

运行测试时应遵循的步骤:



单击“文件上传/选择文件”按钮,以显示“文件上传”对话框。

driver.findElement(By.id("uploadbutton")).click;



调用Script.exe文件

Runtime.getRuntime().exec("Script.exe");


Script.exe文件将处理文件上传


评论


干得好! :-)我对脚本进行了一些改进:stackoverflow.com/questions/14592853/…

– SharpC
18年2月2日在8:33

#4 楼

使用Webdriver(本地)上传文件
下面介绍两种上传文件的方法。第一个在特殊情况下使用Python Selenium(不可见输入),第二个处理Windows对话框。
不可见输入
如果输入是隐藏的,则使其可见。这是一个示例(Python)。
输入隐藏在页面底部,看起来像这样:

 <input type="file" multiple="multiple" class="dz-hidden-input" style="visibility: hidden; position: absolute; top: 0px; left: 0px; height: 0px; width: 0px;">
 


现在让我们看看如何发送文件(注意使用绝对路径):
 file_input = driver.find_element_by_xpath("//input[@class = 'dz-hidden-input']")
# make the input visible:
driver.execute_script('arguments[0].style = ""; arguments[0].style.display = "block"; arguments[0].style.visibility = "visible";', file_input)
# send file:
file_input.send_keys("C:\Users\nicolas\Documents\CT\Séance_du_Lundi_15_février.pdf")
  
(cf此SO答案)
与Windows文件上传对话框交互(仅Windows和Python)
您可以使用Pywinauto模块直接处理Windows对话框(该窗口必须可见) ,而不是隐藏的。)
 import pywinauto

def Test(Name_of_File):
    app = pywinauto.application.Application()
    mainWindow = app['Envoi du fichier'] # main windows' title
    ctrl=mainWindow['Edit'] 
    mainWindow.SetFocus()
    ctrl.ClickInput()
    ctrl.TypeKeys(Name_of_File)
    ctrlBis = mainWindow['Ouvrir'] # open file button
    ctrlBis.ClickInput()

""" example:
Test("C:\Users\nicolas\Documents\CT\Séance_du_Lundi_7_mars.pdf")
"""
 

Windows的标题位于方括号内。您可以使用SWAPY之类的工具轻松获取它们(以及其他Windows的属性)。

评论


这是唯一适用于我的设置的解决方案(python3.9,selenium,docker)。非常感谢,您保存了我的一天:)))))))))))))

–范妮
10月19日14:20

#5 楼

如果您只想将文件发送到Web服务器,则可以使用无头的HTTP客户端来进行处理,例如使用Ruby或Perl中的mechanize库或Python中的Request库。您不需要通过浏览器进行任何操作。

使用python的示例:

>>> url = 'http://httpbin.org/post'
>>> files = {'file': open('report.xls', 'rb')}

>>> r = requests.post(url, files=files)
>>> r.text
{
  ...
  "files": {
    "file": "<censored...binary...data>"
  },
  ...
}


评论


您可以添加使用无头客户端上传文件的代码吗?这是一个规范的问题,因此我们正在寻找使用Selenium Webdriver上载文件的所有方式。

–小熊猫
15年5月6日在6:58



这是一个很好的示例,特别是Python中的Requests库:docs.python-requests.org/en/latest/user/quickstart / ...

–user1780
15年5月8日在20:33

#6 楼

Yamikuronue,如果您愿意使用其他软件,则可以使用Kantu Chromium浏览器(https://kantu.io)自动执行文件上传,然后使用Kantu API或命令行与Selenium和/或您的自动化工具集成链。该软件是免费的,但仅限Windows。

对于文件上传,使用命令“ SelectFileToUpload”。 Kantu包括一个基于屏幕截图的脚本记录器,它将自动将此命令添加到您的脚本中:



#7 楼

import win32com.client  

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


将解决问题

评论


您能否解释一下这会增加现有答案,特别是已接受的答案?

–凯特·保罗(Kate Paulk)
16-09-30在11:36

#8 楼

AutoIT代码:

ControlFocus("File Upload","","Edit1");
ControlSetText("File Upload","","Edit1","E:\test.txt");
ControlClick("File Upload","","Button1");


硒代码:

Runtime.getRuntime().exec("C:\Users\sudhir\Desktop\sssss.exe");


#9 楼

首先,您必须切换到新的打开的窗口。

browser.switchTo().window(browser.windowHandles.last())


然后您可以使用此文件来选择文件。

browser.findElement(By.id("file")).sendKeys(<Absolute path the file>/<file name with extension>)


在这里,绝对路径将是“ C:/ Users / dd / Pictures”。

#10 楼

通过Selenium Webdriver上传文件可以通过以下步骤完成:

步骤1:-设置chromeDriver exe文件的路径:

System.setProperty(“ webdriver.chrome.driver “,” ./ driver / chromedriver.exe“);

步骤2:-创建ChromeDriver类的对象:

WebDriver driver = new ChromeDriver();


这里我们正在进行转换,将子类对象转换为Super Type。

步骤3:-导航至必须上传文件的网页:-

驱动程序。到(“传递页面的URL”);

现在您必须在网页上找到上传按钮,使用任何定位符(XPath,ID或类名等)来查找该按钮并单击它。

WebElement uploadButton = driver.findElement(By.id(“ uploadBTN”));

uploadButton.click();

步骤4:-现在输入您必须在网页上上传的文件的路径:

WebElement uploadTextField = driver.findElement(By.id(“ uploadTextField”));

uploadTextField.s endKeys(“ D:\ Screenshot_1.png”);

我们正在传递.png文件的路径以上传到网页上。

等到文件上传完毕成功加载文件后,在页面上单击“提交”按钮。

driver.findElement(By.name(“ submitBTN”))。submit();

一旦运行此脚本,您将能够有效地上传文件并获得确认消息(您的文件已上传并解压缩)。 Selenium项目中的Selenium WebDriver。如果您有独特的想法或观点来处理文件上传,请告诉我们。