无法使用Selenium Webdriver中的send_keys上传文件

时间:2014-06-24 15:15:57

标签: javascript python selenium selenium-webdriver

我无法使用Selenium Webdriver和Python来上传文件。我昨天重新安装了selenium和python,所以我很确定一切都是最新的,如果有帮助的话我会使用Windows 7。我知道其他人已经问过这个问题,而且每个人都建议的答案是在文件上传元素上使用send_keys命令。 我已尝试在其他网页上进行文件上传,我让它至少在另一个页面上工作,但是当我尝试在页面上尝试相同的程序时,似乎没有任何事情发生。我想我记得找到其他人无法让这个工作的例子,所以我不认为我是唯一一个有这个问题的人。

可能相关的一件事是,当我在文件上传表单上尝试send_keys时,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'是输入类型='文件的名称'页面源中的元素,最后一行中的xpath指向" upload"按钮。

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和类似的工具,但我需要远程运行。

2 个答案:

答案 0 :(得分:1)

我必须看到整个脚本以确保代码是正确的,但这应该可以为您提供一些工具:

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()获取testscript的当前工作目录,然后将文件名附加到该工作目录的末尾,创建一个可在任何计算机上运行的通用路径,而不是指定将中断的绝对路径下一台机器。使用此代码,您不再需要Javascript代码段。

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

答案 1 :(得分:0)

使用标记输入查找web元素,并使用xpath下面的类型='file'      //输入[@类型= '文件']

在您的情况下,这是“documentfile”元素。

使用javascript使其可见:

    document.getElementById(“documentfile”)。style.visibility =“visible”;  

使用绝对文件路径发送上面输入元素的键
   driver.findElement(By.xpath( “//输入[@类型= '文件']”))的SendKeys( “/绝对/ filepath.jpeg”);


如有任何问题,请告诉我。