Selenium WebDriver和浏览器选择文件对话框

时间:2012-01-13 13:06:19

标签: c# selenium webdriver

我正在使用selenium webdriver,C#。

是否可以使用Firefox选择文件对话框制作工作webdriver? 或者我必须使用像AutoIt这样的东西吗?

9 个答案:

答案 0 :(得分:31)

如果您尝试选择要上传的文件,Selenium 2支持HTML文件输入。例如:

<强> HTML

<input type="file" id="uploadhere" />

Selenium Code

IWebElement element = driver.FindElement(By.Id("uploadhere"));
element.SendKeys("C:\\Some_Folder\\MyFile.txt");

基本上你&#34;输入&#34; (使用SendKeys)文件输入元素的完整文件路径。 Selenium为您处理文件选择对话框。

但是如果你想操纵一个任意的文件选择对话框,那么像Anders说的那样,你必须走出Selenium。

答案 1 :(得分:9)

不,WebDriver无法与对话框交互 - 这是因为对话框是操作系统的域而不是网页。

我认识那些运气很好的人以及.Net提供的Automation API。

另一种选择是完全跳过文件对话框并发出POST或GET,但这需要更高级的网站知识以及如何构建POST / GET。

您可以尝试Webinator,它与Selenium类似,因为它由WebDriver提供支持。它提供了文件对话功能,我用它取得了很大的成功。

答案 2 :(得分:4)

这是使用remotewebdriver的另一个解决方案,它像魔术一样工作,我喜欢它。

这是我的课程:

driver.findElementByLinkText("Upload Files").click();
driver.setLogLevel(Level.ALL);
System.out.println(driver.getCurrentUrl());
WebElement element = driver.findElement(By.xpath("//input[@name='file_1']"));
LocalFileDetector detector = new LocalFileDetector();

//Now, give the file path and see the magic :)              
String path = "D://test66T.txt";
File f = detector.getLocalFile(path);
((RemoteWebElement)element).setFileDetector(detector);
element.sendKeys(f.getAbsolutePath());

//now click the button to finish
driver.findElementByXPath("//html/body/div[9]/div[1]/a/span").click(); 

答案 3 :(得分:1)

According to Nadim Saker

  

.Net有一个库来处理文件上传对话框。它有一个SendKeys类,它有一个方法SendWait(字符串键)。它在活动应用程序上发送给定密钥,并等待处理消息。它不会返回任何值。

答案 4 :(得分:1)

这可以通过以下方式完成,测试并使用Internet Explorer和Chrome驱动程序

var allowsDetection = this.Driver as IAllowsFileDetection;
if (allowsDetection != null)
{
   allowsDetection.FileDetector = new LocalFileDetector();
}

Driver.FindElement(By.Id("your-upload-input")).SendKeys(@"C:\PathToYourFile");

参考https://groups.google.com/forum/#!msg/webdriver/KxmRZ8MkM4M/45CT4ID_WjQJ

答案 5 :(得分:0)

另一种方法是使用System.Windows.Forms.SendKeys.SendWait("pathToFile")
我用它成功地到处都无法将键发送到@prestomanifeo所描述的元素。

答案 6 :(得分:0)

我用它来解决问题...如果以上所有方法都不起作用

    Actions action = new Actions(driver);
    action.SendKeys(pObjElement, Keys.Space).Build().Perform();

    Thread.Sleep(TimeSpan.FromSeconds(2));

    var dialogHWnd = FindWindow(null, "Elegir archivos para cargar"); // Here goes the title of the dialog window
    var setFocus = SetForegroundWindow(dialogHWnd);
    if (setFocus)
    {

        Thread.Sleep(TimeSpan.FromSeconds(2));
        System.Windows.Forms.SendKeys.SendWait(pFile);
        System.Windows.Forms.SendKeys.SendWait("{DOWN}");
        System.Windows.Forms.SendKeys.SendWait("{TAB}");
        System.Windows.Forms.SendKeys.SendWait("{TAB}");
        System.Windows.Forms.SendKeys.SendWait("{ENTER}");
    }

    Thread.Sleep(TimeSpan.FromSeconds(2));
}

答案 7 :(得分:0)

您要求在文件对话框中使用 AutoIt 。这很容易,您可以使用 C#来实现。

  • 安装nuget软件包AutoItX.Net

  • 使用下面的演示代码

  • 根据需要更改对话框标题字符串

     public static void InsertIntoFileDialog(string file, int timeout = 10)
     {
         int aiDialogHandle = AutoItX.WinWaitActive("Save As", "", timeout); // adjust string as you need
         if (aiDialogHandle <= 0)
         {
             Assert.Fail("Can't find file dialog.");
         }
         AutoItX.Send(file);
         Thread.Sleep(500);
         AutoItX.Send("{ENTER}");
         Thread.Sleep(500);
     }
    

在与文件对话框相关的Appium / Selenium遇到问题之后,这对我有帮助。

答案 8 :(得分:-1)

如果您要上传文件而不使用WebDriver,我遇到的唯一解决方案是AutoIt。它允许您编写脚本并将其转换为可执行文件,然后您可以在代码中调用它。我在使用ActiveX控件时已成功使用它。