Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Webdriver:文件上载_C#_Webdriver - Fatal编程技术网

C# Webdriver:文件上载

C# Webdriver:文件上载,c#,webdriver,C#,Webdriver,有没有办法与webdriver中的文件上传框进行交互?路径所在的表单字段是只读的,因此我无法写入该字段。您可以使用JavaScript设置输入字段的值。考虑到字段的id是fileName,下面的示例将设置文件C:\temp\file.txt的输入值: String script = "document.getElementById('fileName').value='" + "C:\\\\temp\\\\file.txt" + "';"; ((IJavaScriptExecutor)drive

有没有办法与webdriver中的文件上传框进行交互?路径所在的表单字段是只读的,因此我无法写入该字段。

您可以使用JavaScript设置输入字段的值。考虑到字段的id是
fileName
,下面的示例将设置文件
C:\temp\file.txt
的输入值:

String script = "document.getElementById('fileName').value='" + "C:\\\\temp\\\\file.txt" + "';";
((IJavaScriptExecutor)driver).ExecuteScript(script);
在本例中,
driver
是您的WebDriver实例


请注意,对于类似Windows的路径,您必须使用四个反斜杠(
\
),因为您需要向JavaScript传递双反斜杠,因此必须使用两个附加斜杠来转义这两个斜杠。另一个选项是使用正斜杠(例如,
“C:/tmp/file.txt”
),这也应该有效。

您可以在不注入JavaScript的情况下执行此操作。您只需要掌握表单字段并在其中键入内容。类似于(使用Ruby API):


我发现的问题是上传对话框挂起webdriver直到关闭。 也就是说,调用上载对话框的element.click在该上载对话框关闭之前不会返回。要清楚,上载对话框意味着一个操作系统本机文件选择

这是我的解决方案(虽然有点复杂,但对于SeleniumWebDriver问题,大多数解决方法都会变得复杂)


在Ubuntu12上使用Python2.7、webdriver 2.25.0和firefox

我们可以使用以下(ruby API)

这有助于我上传图像。

对于C#,
SendKeys()
可以工作,但您必须在文件路径中使用
\
,而不是
/

例如,以下工作:

string filePath = @"drive:\path\filename.filextension";
driver.FindElement(By.Id("fileInput")).SendKeys(filePath);
但以下方法不起作用:

string filePath = "drive:/path/filename.filextension";
driver.FindElement(By.Id("fileInput")).SendKeys(filePath);

我也在寻找第三方图书馆

除非没有其他窗口,否则这对我来说很有用:

在C#中添加System.Windows.Forms的引用

using System.Windows.Forms;

string url = "http://nervgh.github.io/pages/angular-file-upload/examples/image-preview/";
string path = @"C:\Users\File_Path";
IWebDriver d = new ChromeDriver();
d.Navigate().GoToUrl(url);
d.FindElement(By.XPath("//input[@type='file']")).Click();
hread.Sleep(5000);
System.Windows.Forms.SendKeys.SendWait(path);
System.Windows.Forms.SendKeys.SendWait(@"{Enter}");

在我的情况下,我可以上传类似文件的解决方案,写入hear,但对话框窗口卡住了进程,驱动程序无法引用关闭此窗口,因此我手动杀死了他:

 foreach (var p in Process.GetProcessesByName("chrome"))
        if (p.MainWindowTitle.ToLower().Contains("open"))
               p.Kill();

你试过这个吗?在我的应用程序中,该字段看起来当然是只读的,但效果很好。有人尝试过这种方法来上传多个文件(选择要上传的多个文件)吗?我无法让它工作。C#版本:driver.FindElement(By.Id(“FileUpload1”)).SendKeys(“C:\\foo\\bar”)@stuartmclark尝试了C#版本,用户界面表现得好像成功了,但没有上传任何文件。这种方法可以用于上传多个文件吗?假设您手动选择,则在弹出文件选择器中选择多个文件。我注意到它将所选文件显示为文件名的双引号列表,文件名之间用空格分隔。如果这个方法可以做到这一点,那么JS代码的语法是什么呢?由于安全原因,这实际上是行不通的。例如,大多数浏览器都会阻止此操作!实际上,它与send_keys方法(不执行javascript)一起工作@OlegTarasenko-我注意到了同样的事情。请看第二天早上试一试。我永远无法理解为什么.NET开发人员会强迫自己去处理文件上传对话框,但我发誓它们占用的时间比其他十种元素类型加起来还要多。@Jamesthomasmon我试过这个,但它不起作用,本机操作系统上载窗口弹出,但它不接收任何输入,也不接收函数最后3行中的Enter。请建议您最好使用driver.SendKeys并删除Windows窗体依赖项。这依赖于Linux和macOS平台,它是正斜杠。( / )
string filePath = "drive:/path/filename.filextension";
driver.FindElement(By.Id("fileInput")).SendKeys(filePath);
using System.Windows.Forms;

string url = "http://nervgh.github.io/pages/angular-file-upload/examples/image-preview/";
string path = @"C:\Users\File_Path";
IWebDriver d = new ChromeDriver();
d.Navigate().GoToUrl(url);
d.FindElement(By.XPath("//input[@type='file']")).Click();
hread.Sleep(5000);
System.Windows.Forms.SendKeys.SendWait(path);
System.Windows.Forms.SendKeys.SendWait(@"{Enter}");
 foreach (var p in Process.GetProcessesByName("chrome"))
        if (p.MainWindowTitle.ToLower().Contains("open"))
               p.Kill();