Selenium-2.37.0
Firefox 24.0(虽然也在 Chrome 上尝试过)
Mac OS X 山狮 10.8.5
涉及 Windows、Windows 特定自动化工具/库或 Mac OS X 以外的操作系统的解决方案是不可接受的答案
首先我要说的是,在 Stackoverflow 上经常会问到非常相似的问题,我检查了每个提供的答案,但没有一个适用于 CuteWebUI_Uploader_Resource AJAX 文件上传器,我将在下面详细说明。
我有一个包含数据和文件的 Enterprise Java Web 应用程序,并希望自动映射和上传来自该 Web 应用程序的选定数据和文件子集,针对(到)一个单独的 ASP.NET Web 应用程序,该应用程序使用 CuteWebUI 工具包和 CuteWebUI_Uploader_Resource来自可爱软件。
在撰写本文时,http://cutesoft.net服务器已经关闭了几天;谷歌搜索提供了一些可能有助于解决此问题的 CuteSoft 论坛点击,但我目前无法访问它们。
像许多文件上传器一样,CuteWebUI AJAX 文件上传器有一个浏览按钮和一个上传按钮。
我希望能够在不使用浏览按钮的情况下直接上传到 CuteWebUI AJAX 文件上传器(并且不必使用 Mac OS X 上的浏览对话框玩任何技巧,因为我希望上传的文件对浏览器不可用在本地文件系统上,而是存储在 Java Web 应用程序可以通过 Java 访问的服务器上,尽管为了测试我可以将它们放在本地文件系统上,如下所示)。
我很感激其他文件上传者已经多次回答了这个问题(请参阅本文末尾的详尽列表),并且通常描述为大多数文件上传者解决方案的过程大致是:
确定由 Browse 按钮填充的文件上传路径(有时隐藏)的 INPUT 字段。有时需要使用 JavascriptExecutor 取消隐藏它并确保它是一个文本字段,然后使用 sendKeys 填充它。
识别匹配的提交上传按钮并单击()它。
这不适用于 CuteWebUI AJAX 文件上传器。
我的目标系统确实有一个 INPUT 元素,顾名思义,它用于存储文件上传路径,但实际上当我手动尝试它(并使用 Firebug 和 Selenium IDE 检查它)时,它的值没有填充根本没有,而是出现了一个全新的可上传文件临时表。
以下 HTML 显示了尝试任何文件浏览或上传之前的情况。我省略了一些样式标记和一些不相关的值:
<script src="/CuteWebUI_Uploader_Resource.axd?type=script&_ver=" type="text/javascript"></script>
<input
type="hidden"
autocomplete="off"
name="fileuploader_433"
id="fileuploader_433"
isuploaderfield="1"
value="">
<button>Browse</button>
<span style="display: none;"></span>
<button style="display: none;">Cancel upload</button>
<img
showprogressbar="1"
canceluploadmsg="Cancel upload"
resourcehandler="/CuteWebUI_Uploader_Resource.axd"
uploadtype="Auto"
cancelallmsg="Cancel all Uploads"
uploadurl="/Handlers/UploadHandler.ashx"
insertext="Upload a file"
uploadingmsg="Uploading.." filetoolargemsg=".." maxfileslimitmsg=".."
inserttext="Browse"
numfilesshowcancelall="2147483647"
barstyle="Continuous"
showprogressinfo="0"
multiplefilesupload="0"
windowsdialoglimitmsg=".."
manualstartupload="1"
extensions=""
contextvalue=".."
onerror="this.onload()"
onload="this.style.display="none" ;
if(!window.CuteWebUI_AjaxUploader_Initialize){
var xh=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject('Microsoft.XMLHttp');
xh.open('GET','/CuteWebUI_Uploader_Resource.axd?type=script&amp;_ver=',false);xh.send('');eval(xh.responseText)}CuteWebUI_AjaxUploader_Initialize(this.id);"
src="/CuteWebUI_Uploader_Resource.axd?type=file&file=continuous.gif"
pageupload="1"
namespace="CuteWebUI"
uniqueid="fileuploader_433"
id="fileuploader_433_Loader_unique"
style="display: none;">
<button
onclick="return submitbutton_click('433')"
class="submitbutton"
name="SubmitButton"
id="SubmitButton">Upload</button>
以下 Java 中的 Selenium 正确地取消隐藏并填充了 fileuploader_433 INPUT 字段,但是在提交时执行 click() 时,我仍然得到一个弹出窗口,断言我必须使用带有消息“请使用浏览器上传文件”的浏览按钮:
String name_fileuploader = "fileuploader_434";
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("document.getElementsByName('" + name_fileuploader + "')[0].setAttribute('type', 'text');");
WebElement element_uploader = driver.findElement(By.xpath("//input[@name='" + name_fileuploader + "']"));
element_uploader.clear();
String filepath="/path/to/file.pdf";
element_uploader.sendKeys(filepath);
driver.findElement(By.xpath("(//button[@id='SubmitButton'])[2]")).click();
Firebug 确认即使您手动操作,也不会使用 INPUT 字段!相反,会出现一个新的文件队列表:
<script src="/CuteWebUI_Uploader_Resource.axd?type=script&_ver=" type="text/javascript"></script>
<input type="hidden" autocomplete="off" name="fileuploader_434" id="fileuploader_434" isuploaderfield="1" value="">
<button>Browse</button>
<table .. class="AjaxUploaderQueueTable">
<tbody>
<tr class="AjaxUploaderQueueTableRow">
<td>
<img src="/CuteWebUI_Uploader_Resource.axd?type=file&file=circle.png&_ver=null" title="">
</td>
<td>file.pdf</td><td>
<img src="/CuteWebUI_Uploader_Resource.axd?type=file&file=stop.png&_ver=null" title="Remove" style="cursor: pointer;">
</td>
</tr>
</tbody>
</table>
<span style="display: none;"></span>
<button style="display: none;">Cancel upload</button>
<img showprogressbar="1" canceluploadmsg="Cancel upload" ..
resourcehandler="/CuteWebUI_Uploader_Resource.axd" uploadtype="Auto"
cancelallmsg="Cancel all Uploads" uploadurl="/Handlers/UploadHandler.ashx" [snip]
onerror="this.onload()" onload="this.style.display="none" ;
if(!window.CuteWebUI_AjaxUploader_Initialize){var xh=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject('Microsoft.XMLHttp');xh.open('GET','/CuteWebUI_Uploader_Resource.axd?type=script&amp;_ver=',false);xh.send('');eval(xh.responseText)}CuteWebUI_AjaxUploader_Initialize(this.id);"
src="/CuteWebUI_Uploader_Resource.axd?type=file&file=continuous.gif"
pageupload="1" namespace="CuteWebUI" uniqueid="fileuploader_434"
id="fileuploader_434_Loader_unique" style="display: none;">
<button onclick="return submitbutton_click('434')" class="submitbutton" name="SubmitButton" id="SubmitButton">Upload</button>
请注意:
隐藏的 INPUT 元素永远不会填充文件路径值!
相反,没有完整文件路径的字符串 file.pdf出现在一个新的 TABLE 中,其中 class="AjaxUploaderQueueTable" 在 Browse 按钮下方。
插入的 AjaxUploaderQueueTable 显然只是装饰性的;似乎在浏览操作期间选择的文件路径存储在服务器端。在使用 Firebug 使用“浏览”按钮进行选择后,我已经搜索了完整的文件路径,但页面中不存在该路径。
我对那些涉及在 Mac OS X 中操纵“浏览”对话框的技巧持开放态度(仅出于测试目的),但这种方法不能满足我的最终要求,因为我不能依赖这种方法来完成最终任务将许多文件从 Enterprise Java Web 应用程序上传到目标 ASP.NET Web 应用程序。我必须完全避开浏览对话框。
背景调查
以下所有内容都有相关的问题和答案,但这些都不能解决 CuteWebUI AJAX 文件上传器的问题:
如何使用 Java 在 Selenium WebDriver 的隐藏字段中键入一些文本
如何使用 Selenium WebDriver 处理 Windows 文件上传?
如何强制 Selenium WebDriver 单击当前不可见的元素?
selenium webdriver如何将文件上传到浏览器?
如何使用 selenium 或 webdriver 在测试自动化中处理文件上传
https://stackoverflow.com/questions/18886970/selenium-webdriver-upload-file-sendkeys-dont-work
使用 Selenium WebDriver 和 Java 上传文件
如何处理从模态窗口 Selenium WebDriver Java 上传文件
http://selenium.10932.n7.nabble.com/Handling-browser-pop-up-dialog-to-upload-a-file-td29153.html
来自 CuteSoft 的这个可能相关的论坛链接已关闭:
2012 年 7 月 24 日-嗨,我正在使用 selenium webdriver 对我的 web 系统进行自动化测试,问题是我无法与 ajaxuploader 组件交互
以及一个使用 INPUT 取消隐藏技巧发布的 WebDriver 论坛:https ://groups.google.com/forum/#!topic/webdriver/JAXC_qEbQvI