【发布时间】:2014-06-24 15:15:56
【问题描述】:
我在使用 Selenium Webdriver 和 Python 上传文件时遇到问题。我昨天重新安装了 selenium 和 python,所以我很确定一切都是最新的,如果有帮助的话,我正在使用 Windows 7。我知道有人问过这个问题,大家推荐的答案是在文件上传元素上使用 send_keys 命令。 我已经尝试在其他带有文件上传的网页上这样做,并且我让它至少可以在另一个页面上工作,但是当我在我试图测试的页面上尝试相同的过程时,似乎什么都没有发生。我想我记得找到了其他人无法让这个工作的例子,所以我不认为我是唯一一个遇到这个问题的人。
可能相关的一件事是,最初当我在文件上传表单上尝试 send_keys 时,selenium 抛出一个错误,指出该元素不可见,因此无法与之交互(事实上,它是可见的,但显然不在 selenium 的眼中)。我通过预先运行这行 JavaScript 解决了这个问题:
document.getElementById('UploadDocumentPopup').style.display = 'block';
(UploadDocumentPopup)是文件输入部分的父元素)
另一个可能有用的花絮是,当我使用 Selenium 1 / Selenium RC 时,我成功使用了 attach_file 命令(不过,它只支持 Firefox)。
如果有帮助,以下是访问我正在使用的页面的方法。点击此链接:https://qa.infosnap.com/family6/gosnap.aspx?action=3345&culture=en,点击“继续你的工作”,然后使用电子邮件 aaaa@b.com 和密码“asdfjkl;”登录(不带引号)。然后单击“继续您的工作”链接之一。您进入的页面应该有文件上传和照片上传部分。如果没有,只需使用“prev”和“next”浏览并找到可以的页面(只有 3 页)。这是相关的代码——我也尝试了很多其他的东西,如果它有用并且我能记住它们,我很乐意分享,但这是我认为“应该”工作的方式。如果您愿意,请随时检查页面源,但仅供参考 'documentfile' 是页面源中输入 type='file' 元素的名称,最后一行中的 xpath 指向“上传" 按钮。
js = "document.getElementById('UploadDocumentPopup').style.display = 'block';"
wd.execute_script(js)
wd.find_element_by_link_text("Upload Document...").click()
wd.find_element_by_id("documentfile").send_keys("C:\\Users\\username\\testdoc.rtf")
#ActionChains(wd).send_keys(Keys.ESCAPE)
wd.find_element_by_xpath("//div[@id='modal_container']/div/form/div/input[1]").click()
更新:我意识到我没有在除 Firefox 之外的任何东西上尝试过这个,所以我尝试了 IE11 - 发生的事情是,当调用 send_keys 时,出现了本机操作系统文件上传框(我认为这很奇怪,因为我没有点击“浏览”按钮 - 只使用了 send_keys)并且文本被输入到文件名字段中。然后文件上传对话消失了,但好像什么都没发生过。回顾:在 Internet Explorer 中,文件上传对话框打开,文件路径进入此对话框,对话框消失但没有实际附加文件。在 Firefox 中,没有打开任何对话框,也没有附加文件。 Chrome 与 Firefox 相同。
编辑:这是文档上传部分的 HTML 代码:
<div id="UploadDocumentPopup" style="display:none;">
<div class="popupmenu">
<h1 style="margin-top:0px; padding-bottom:10px; border-bottom:1px solid #CCCCCC;">
Upload Document
</h1>
<p>
Choose a file to upload.
</p>
<form id="documentuploadform" action="services/documentservice.aspx" enctype="multipart/form-data" method="post"
onsubmit="return AIM.submit(this, {'onStart' : startUploadDocument, 'onComplete' : completeUploadDocument})">
<input type="file" size="50" id="documentfile" name="documentfile" />
<input type="hidden" name="cmd" value="upload" />
<input type="hidden" id="documentuploadfield" name="field" />
<div style="margin-top: 10px;">
<input name="ctl00$OutsideFormContentPlaceholder$ctl06" type="submit" value="Upload" />
<input name="ctl00$OutsideFormContentPlaceholder$ctl07" type="button" onclick="Control.Modal.close();" value="Cancel" />
</div>
</form>
</div>
</div>
我还应该提到,我正在寻找一个完全基于硒的解决方案 - 我知道 AutoIt 和类似工具,但我需要远程运行它。
【问题讨论】:
-
您的 HTML 看起来如何?为我们提供HTML的相关sn-p。
-
@olyv 我希望对您有所帮助(此外,我一直在尝试发表评论,但它一直在消失 - 不确定这是我愚蠢还是比我更有线索的人正在删除它 -在这种情况下,我将停止转发)
-
这里stackoverflow.com/q/9726005/2504101 列出了
input type="file"的不同解决方案。先试试看。 -
@olyv 我已经尝试了该页面上的所有内容(以及其他几个),包括尝试使用 xpaths / css 选择器而不是 ids。我的问题不是点击输入 type='file',而是将密钥发送给它。
-
我认为我最初提供的链接可能已损坏(至少对于我以外的计算机)- 我已经更新了它,现在应该可以使用了。
标签: javascript python selenium selenium-webdriver