如何使用Selenium中的Windows上载对话框处理文件上传

时间:2016-08-16 15:15:49

标签: c# silverlight selenium-webdriver

我正在尝试使用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上传对话框吗? 希望听到任何有此经验的人的发言。

谢谢!

3 个答案:

答案 0 :(得分:2)

我明白了,我做的是这个:

 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工作。谢谢大家!

答案 1 :(得分:1)

开发网站的人使用非标准机制上传文件。查看您提供的HTML,它看起来像某种类型的Silverlight控件。虽然Selenium WebDriver可以正确处理文件选择对话框,以便在页面使用标准HTML上载机制(即<input type="file">元素)时上传文件,但它无法通过非标准上传机制这样做。您需要找到一种方法来处理Selenium之外的对话框。

答案 2 :(得分:0)

我在下载/上传文件时遇到与Windows对话框交谈的问题。我的解决方案是利用user32.dll GetForegroundWindow()。然后创建了一些等待方法,使对话框显示基于标题文本消失(仍然使用user32.dll)。然后最终为BeginInvoke创建了一个动作,等待窗口弹出,然后继续发送键。我现在面前没有代码示例,但Google user32.dll Selenium和您将获得一些信息。