在没有 NoFileChosen 选项的情况下使用 Selenium C# 在浏览器中上传文件
Upload a file in browser using Selenium C# without NoFileChosen option
我正在尝试上传文件。我的应用程序只有一个浏览按钮,没有地方可以发送任何文件路径。所以我无法使用 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 threw exception: SyntaxError: Unexpected token :
为什么我得到异常?
与文件浏览交互 windows 超出了 webdriver 的能力范围。单击浏览器时,浏览器会将您转到 OS 以查找文件。 Javascript 不能对这些 windows 采取行动。
SendWait 用作将文件的 uri 传递给打开 window 和 return 的技巧。如果这不起作用,您将需要使用一些东西与 OS windows.
进行交互
我个人在使用 IE 时使用 InputSimulatorCore 来处理此类问题,IE 有很多此类文件下载问题。
编辑: 如果您控制应用程序更改为基于表单的上传将允许您在 Selenium 中进行测试,这是最佳选择。如果没有,您也可以直接对上传端点执行 post。
您发布的代码存在多个问题。首先,您试图用无效的 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。
我正在尝试上传文件。我的应用程序只有一个浏览按钮,没有地方可以发送任何文件路径。所以我无法使用 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 threw exception: SyntaxError: Unexpected token :
为什么我得到异常?
与文件浏览交互 windows 超出了 webdriver 的能力范围。单击浏览器时,浏览器会将您转到 OS 以查找文件。 Javascript 不能对这些 windows 采取行动。
SendWait 用作将文件的 uri 传递给打开 window 和 return 的技巧。如果这不起作用,您将需要使用一些东西与 OS windows.
进行交互我个人在使用 IE 时使用 InputSimulatorCore 来处理此类问题,IE 有很多此类文件下载问题。
编辑: 如果您控制应用程序更改为基于表单的上传将允许您在 Selenium 中进行测试,这是最佳选择。如果没有,您也可以直接对上传端点执行 post。
您发布的代码存在多个问题。首先,您试图用无效的 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。