4

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&amp;_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=&quot;none&quot; ; 
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;amp;_ver=',false);xh.send('');eval(xh.responseText)}CuteWebUI_AjaxUploader_Initialize(this.id);" 
src="/CuteWebUI_Uploader_Resource.axd?type=file&amp;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&amp;_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&amp;file=circle.png&amp;_ver=null" title="">
</td>
<td>file.pdf</td><td>
<img src="/CuteWebUI_Uploader_Resource.axd?type=file&amp;file=stop.png&amp;_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=&quot;none&quot; ; 
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;amp;_ver=',false);xh.send('');eval(xh.responseText)}CuteWebUI_AjaxUploader_Initialize(this.id);" 
src="/CuteWebUI_Uploader_Resource.axd?type=file&amp;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 上传文件

使用 selenium 处理弹出窗口

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

4

1 回答 1

3

我已经找到了解决方案;它带有一些警告,但它适用于我的情况。希望它也会对您有所帮助。

最大的警告是我只知道它适用于今天下载的当前版本的 AjaxUploader。我一直在使用工作方式不同的旧版本;我无法指定版本号,因为 CuteSoft 似乎病态地倾向于使 AjaxUploader 的版本号几乎无法弄清楚。我找不到当前版本或我正在使用的旧版本的版本号。

另一个需要注意的是,它依赖于页面上一次只有一个 AjaxUploader 控件。AjaxUploader 似乎确实创建了一个<input type='file'>元素,但它在标签顶部的 div 中悬空<body>,没有任何 id 或 name 属性或任何其他将其链接到特定上传器的东西。我不确定当存在多个 AjaxUploader 时会做什么:也许它会创建多个文件输入和轨道,这是由 javascript 提供的;也许它共享一个。对于我的情况,我不需要解决那部分,所以我没有尝试。

无论如何,诀窍是找到文件输入,如下所示:

webDriver.findElements(By.cssSelector("body > div > input[type='file']")).get(0).sendKeys(fileName);

请注意,此处的选择器与您正在使用的特定上传按钮的 ID 或任何其他特征无关。它只是“直接在 body 标签内的 div 内的第一个文件输入”。这就是 AjaxUploader 插入其文件输入的地方。

似乎不需要与 UI 的任何其余部分进行交互,包括“浏览”按钮:sendKeys将文件名输入到正确的文件输入会导致立即开始上传。(这是一个编辑;我最初认为单击按钮也是必要的,但似乎并非如此)

请注意,为了确保您的测试时间正确运行,您可能希望在此单击之后执行等待操作,等待文件完成上传(例如,等待上传完成后 AjaxUploader 插入的 HTML)继续你接下来想做的任何事情。

于 2013-12-05T02:26:46.950 回答