gpt4 book ai didi

javascript - 无法在 Selenium Webdriver 中使用 send_keys 上传文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:32:39 27 4
gpt4 key购买 nike

我在使用 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 个页面)。这是相关的代码——我也尝试了很多其他的东西,如果它有帮助并且我能记住它们,我很乐意分享,但这是我认为“应该”工作的方式。如果您愿意,请随时检查页面源代码,但 FYI 'documentfile' 是页面源代码中 input 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>

我还应该提到,我正在寻找一个完全基于 selenium 的解决方案 - 我知道 AutoIt 和类似的工具,但我需要远程运行它。

最佳答案

我必须查看整个脚本以确保代码正确,但这应该会给您一些有用的东西:

wd.find_element_by_css_selector('a[onclick*="uploadDocument"]').click()
wd.find_element_by_css_selector('div#UploadDocumentPopup input#documentfile').send_keys(os.getcwd()+"/<filename>")
wd.find_element_by_css_selector('div#UploadDocumentPopup input[value="Upload"]').click()

你应该在哪里替换 <filename>使用您要上传的文件的确切名称。此版本使用 os.getcwd()获取测试脚本的当前工作目录,然后将文件名附加到该工作目录的末尾,创建一个可以在任何机器上工作的通用路径,而不是指定将在下一台机器上中断的绝对路径。这段代码不再需要 Javascript 片段。

我已经使用了 CSS 选择器,因为我更喜欢它们而不是 xpath,如果您愿意,您应该能够轻松地转换它们。 (如果你真的不会,请发表评论,我会试一试)

关于javascript - 无法在 Selenium Webdriver 中使用 send_keys 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24390359/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com