在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的代码,以及更多信息,请参阅)
#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")
pre >
(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。如果您有独特的想法或观点来处理文件上传,请告诉我们。
评论
我收到错误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