使用不带NoFileChosen选项的Selenium C#在浏览器中上传文件

时间:2019-09-11 11:57:36

标签: c# selenium selenium-webdriver autoit

我正在尝试上传文件。我的应用程序只有一个“浏览”按钮,没有位置发送任何文件路径。因此,我无法使用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:意外令牌:

我为什么要得到例外?

3 个答案:

答案 0 :(得分:0)

与文件浏览窗口进行交互不在Webdriver可以执行的范围之内。当您单击浏览时,浏览器会将您转到操作系统以查找文件。 Javascript无法在这些窗口上起作用。

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

在使用IE时,我个人使用InputSimulatorCore处理此类问题,而IE在下载文件时会遇到很多这类问题。

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

答案 1 :(得分:0)

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

document.upload.value= C:/Users/../Amazon vs Walmart.pdf

请注意,您实际上要设置的字符串周围没有引号。语法正确的JavaScript为:

// Note carefully the quotes around the string literal. 
document.upload.value='C:/Users/../Amazon vs Walmart.pdf'

要产生此结果,您的串联代码将需要如下所示:

string script = "document.upload.value='" + filepath + "'";

第二个问题是您试图调用上传文件。假设上载是通过使用标准HTML机制完成的,这意味着页面上的某个地方有<input type="file">元素。它可能是隐藏的,但在页面上的某处。要上传文件,可以在该元素上使用SendKeys方法。文件上传案例是SendKeys的极少数例外之一,该规则要求与用户交互的元素必须对用户可见(至少对于最新版本的浏览器和浏览器驱动程序而言)。使用某种非标准的上载机制(例如纯JavaScript实现或某种Flash组件),则需要使用其他方法与该组件进行通信。

答案 2 :(得分:-1)

尽管我尝试使用AutoItX上载文件,但它仍然有效。下面是相同的代码- 要获得AutoItX,我安装了Nugget软件包-AutoItX.DotNet

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

但是,我仍然想探索使用JS。