使用Selenium C#在浏览器中上传文件,而不使用NoFileSelected选项



我正在尝试上传文件。我的应用程序只有一个"浏览"按钮,没有发送任何文件路径的地方。所以我无法使用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);
运行时:评估

引发异常:语法错误:意外令牌:

为什么会出现异常?

与文件浏览窗互超出了 Web 驱动程序可以执行的操作范围。当您单击浏览时,浏览器会将您传递到操作系统以查找文件。Javascript 无法在这些窗口上操作。

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

我个人使用 InputSimulatorCore 来处理使用 IE 时出现此类问题,IE 在文件下载方面有很多此类问题。

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

您发布的代码存在多个问题。首先,您尝试使用无效的 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组件,则需要使用其他方法来与该组件进行通信。

虽然我尝试使用 AutoItX 上传文件并且它有效。下面是相同的代码 - 为了获得AutoItX,我安装了Nugget软件包 - AutoItX.DotNet

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

但是,我也想探索使用 JS。

相关内容

  • 没有找到相关文章

最新更新