如何在Selenium中使用Windows上传对话框处理文件上传
本文关键字:对话框 处理 文件 Windows Selenium | 更新日期: 2023-09-27 18:02:33
我正在尝试使用Selenium (c#)上传附件。
在检查网站的DOM时,我注意到附加文件的链接使用object tags
。以下是HTML节选:
<object id="ctl00_mainContent_rauFilessilverlight03" class="ruObject" height="22px" type="application/x-silverlight-2" data="data:application/x-silverlight-2," style="width: 100%;">
<param value="/App/somelongjunkyparameters" name="source"/>
<param value="true" name="windowless"/> <param value="transparent" name="background"/>
<param value="some number" name="minRuntimeVersion"/>
<param value="PostData=anotherlongjunkyparameters,SilverlightRowId=ctl00_mainContent_rauFilessilverlight03,AsyncUploadId=ctl00_mainContent_rauFiles,MultipleSelection=Disabled,AllowedFileExtensions=,ServiceHandlerUrl=/App/Telerik.Web.UI.WebResource type=rau,MaxFileSize=0" name="InitParams"/>
<param value="true" name="autoUpgrade"/>
</object>
我已经试过了:
IWebElement fileAttachTA = driver.FindElement(By.XPath("//object[@class='ruObject']"));
fileAttachTA.Click();
String filePath = "C:/User/My Documents/file.txt";
Selenium能够找到对象,但是,我应该切换到Windows上传对话框吗?希望听到有这方面经验的人的意见。
谢谢!
我明白了,我所做的是:
IWebElement fileAttachTA = driver.FindElement(By.XPath("//object[@class='ruObject']"));
fileAttachTA.Click();
//Switch into the windows upload dialog
SendKeys.SendWait("^a");
Thread.Sleep(1000);
SendKeys.SendWait(file);
Thread.Sleep(1000);
SendKeys.SendWait(@"{Enter}");
Thread.Sleep(1000);
我使用System.Windows.Forms来获取SendKeys。SendWait工作。谢谢大家!
开发这个网站的人使用了一种非标准的上传文件机制。看看您提供的HTML,它看起来像是某种Silverlight控件。当页面使用标准的HTML上传机制(即<input type="file">
元素)时,Selenium WebDriver可以正确地处理文件选择对话框来上传文件,但是对于非标准的上传机制,它没有希望这样做。您需要找到一种方法来处理Selenium之外的对话框。
我在下载/上传文件时遇到了与Windows对话框对话的问题。我的解决方案是利用user32.dll GetForegroundWindow()。然后创建了一些等待方法,使对话框根据头文本出现并消失(仍然使用user32.dll)。然后最后创建一个BeginInvoke的动作,等待窗口弹出,然后继续发送键。现在我面前没有代码示例,但是Google user32.dll Selenium,你会得到一些信息。