Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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
使用Selenium C#在浏览器中上载文件,但不选择NoFileSelected选项_C#_Selenium_Selenium Webdriver_Autoit C# Wrapper - Fatal编程技术网

使用Selenium C#在浏览器中上载文件,但不选择NoFileSelected选项

使用Selenium C#在浏览器中上载文件,但不选择NoFileSelected选项,c#,selenium,selenium-webdriver,autoit-c#-wrapper,C#,Selenium,Selenium Webdriver,Autoit C# Wrapper,我正试图上传一个文件。我的应用程序只有一个浏览按钮,没有地方发送任何文件路径。因此,我无法使用SendKeys.SendWait(@“filepath”)我尝试使用JavaScriptExecutor,但在使用以下代码时出错: IWebElement upload = _driver.FindElement(By.XPath("//div[starts-with(@class,'addDoc') and contains(text(),'Browse')]")); string filepat

我正试图上传一个文件。我的应用程序只有一个浏览按钮,没有地方发送任何文件路径。因此,我无法使用
SendKeys.SendWait(@“filepath”)我尝试使用
JavaScriptExecutor
,但在使用以下代码时出错:

IWebElement upload = _driver.FindElement(By.XPath("//div[starts-with(@class,'addDoc') and contains(text(),'Browse')]"));

string filepath = @"C:/Users/../Amazon vs Walmart.pdf";
String script = "document.upload.value= " + filepath;
((IJavaScriptExecutor)_driver).ExecuteScript(script);
Runtime.evaluate引发异常:SyntaxError:意外标记:


为什么会出现异常?

与文件浏览窗口交互超出了webdriver的功能范围。单击“浏览”时,浏览器会将您传递到操作系统以查找文件。Javascript无法在这些窗口上运行

SendWait用作将文件的uri传递给打开窗口并返回的技巧。如果这不起作用,您将需要使用一些东西与操作系统窗口进行交互

我个人在使用IE时经常处理类似的问题,IE在文件下载方面有很多这样的问题


编辑:如果您控制应用程序,更改为基于表单的上载将允许您使用Selenium进行测试,这是最佳选择。如果没有,您也可以直接向上载端点发送帖子

您发布的代码存在多个问题。首先,您试图使用无效的JavaScript调用
ExecuteScript
。也就是说,字符串连接后,JavaScript如下所示:

document.upload.value= C:/Users/../Amazon vs Walmart.pdf
string script = "document.upload.value='" + filepath + "'";
请注意,您实际尝试设置的字符串周围没有引号。语法正确的JavaScript应该是:

// Note carefully the quotes around the string literal. 
document.upload.value='C:/Users/../Amazon vs Walmart.pdf'
要实现这一点,您的串联代码需要如下所示:

document.upload.value= C:/Users/../Amazon vs Walmart.pdf
string script = "document.upload.value='" + filepath + "'";

第二个问题是您试图调用上载文件。假设上传是通过使用标准HTML机制完成的,这意味着页面上的某个地方有am
元素。它可能是隐藏的,但它在页面的某个地方。要上载文件,可以对该元素使用
SendKeys
方法。文件上传案例是
SendKeys
中极少数例外情况之一,因为要与之交互的元素必须对用户可见(至少是最新版本的浏览器和浏览器驱动程序。如果应用程序使用一些非标准上传机制,如纯JavaScript实现,或某种Flash组件,那么您需要使用其他方法与该组件通信。

尽管我尝试使用AutoItX上传文件,但它不会rked.以下是相同的代码- 为了获得AutoItX,我安装了Nugget包-AutoItX.DotNet

AutoItX.ControlFocus("Open", "", "Edit1");
AutoItX.ControlSetText("Open", "", "Edit1", filepath);
AutoItX.ControlClick("Open", "", "Button1");

但是,我还是想探索如何使用JS。

这可能是因为PDF文件不包含可读格式的javascript欢迎Kanika。始终确保用户清楚地了解您的问题。您的问题是导致异常的原因吗?@BugFinder:我试过使用xlsx,但仍然收到javascript异常-OpenQA.Selenium.WebDriverException:“javascript错误:无法设置未定义的属性“值”(会话信息:chrome=76.0.3809.132)好的,但是excel电子表格也不是javascript。它可能是您想要在其上执行脚本的文件,但您似乎试图以javascript的形式运行非javascript,这没有任何意义。谢谢Jim。我明白了,我已经将document.upload.Value改为引号-但我仍然得到下面的javascript异常-OpenQA.Selenium.WebDriverException:“javascript错误:无法设置未定义的属性“值”(会话信息:chrome=76.0.3809.132)'如果
upload
是执行上载的文档上
元素的名称,则不允许使用JavaScript。浏览器的现代版本不允许JavaScript将文件上载元素的
值设置为安全措施。使用
IWebElement.SendKeys
是一种经过测试的交叉浏览ser机制由W3C WebDriver规范记录,并将跨平台工作。在我看来,这使其优于单平台解决方案和基于专有、封闭源代码软件的解决方案。