【问题标题】:Which attributes should be changed to allow for image upload via Selenium应该更改哪些属性以允许通过 Selenium 上传图像
【发布时间】:2018-09-11 22:59:38
【问题描述】:

设置

我正在使用 Python + Selenium 将图像上传到系统后端。

send_keys()的上传按钮有以下HTML,

<div id="uploadifive-FileNameUpload" class="uploadifive-button" style="height:
18px; line-height: 18px; overflow: hidden; position: relative; text-align: center;
width: 50px;">
  Upload
  <input id="FileNameUpload" name="FileNameUpload" data-editor="#FileName" 
  data-url="http://also-inc.com/upload/uploadfile" data-path="~/UserFiles/Products/Images/" 
  data-maxsize="10240" data-extensions="*.jpg;*.jpeg;*.png;*.gif;*.bmp;" 
  data-thumbnailwidth="128" data-thumbnailheight="128" 
  data-thumbnailpath="/UserFiles/Products/Images/Preview/" data-uniquename="True" 
  data-preview="/Content/uploadify/noimage.jpg" data-isnew="true" 
  data-auth="D2C14774E29BBB87D2F34719884CFC5C6370502B067D5FC55D0C40A5EE6B1646ED4C77C9C0180D607052FF52653BA981732417A24C3F7547903649C4D64491C184E1C60D7756608784B4B3E806417E77750D87BABD9CDDCB6294EA62DE884EC7B3A4416558405874ED1C0259CD4430990BA83FC0" 
  data-session="f1txsiyxglqb3ma1dr45awrf" class="file-uploader hide-input" style="display: none;" 
  type="file">
  <input style="font-size: 18px; opacity: 0; position: absolute; right: -3px; top: -3px; z-index: 999;" type="file">
</div>

请注意,该按钮有两个inputtype="file"


使用的代码

upload_button = el_id('uploadifive-FileNameUpload').find_element_by_xpath('input[2]')
upload_button.send_keys(path_to_my_image)  

其中el_id() = browser.find_element_by_id()path_to_my_image.jpeg 结尾。


问题

使用的代码通过第二个input成功上传图片。但是,图像保存时没有.jpeg 扩展名。因此图像在后端出现损坏;即image_name 而不是image_name.jpeg

我认为图像是在没有扩展名的情况下保存的,因为第二个 input 不允许这样做。


尝试

  1. 将属性添加到第二个input

第一个input 具有以下属性data-extensions="*.jpg;*.jpeg;*.png;*.gif;*.bmp;"。我将此属性添加到第二个input

upload_button = el_id('uploadifive-FileNameUpload').find_element_by_xpath('input[2]')
browser.execute_script("arguments[0].setAttribute('data-extensions','*.jpg;*.jpeg;*.png;*.gif;*.bmp;')", upload_button)
upload_button = el_id('uploadifive-FileNameUpload').find_element_by_xpath('input[2]')
upload_button.send_keys(path_to_my_image)  

这添加了属性,但上传的图像仍然保存,没有.jpeg 扩展名。

  1. 更改第一个inputclassstyle 属性

第一个inputclass="file-uploader hide-input"style="display: none;",我将它们设置为class="file-uploader"style="display: block;" via,

upload_button = el_id('uploadifive-FileNameUpload').find_element_by_xpath('input[1]')
browser.execute_script("arguments[0].setAttribute('class','file-uploader hide-input')", upload_button)
upload_button = el_id('uploadifive-FileNameUpload').find_element_by_xpath('input[1]')
browser.execute_script("arguments[0].setAttribute('style','display: block')", upload_button)
upload_button = el_id('uploadifive-FileNameUpload').find_element_by_xpath('input[1]')
upload_button.send_keys(path_to_my_image)  

但是图片没有上传。上传按钮变为原生操作系统文件选择器“选择文件”按钮。

我该如何解决这个问题?


旁注

我不明白为什么这个按钮有两个input。我是初学者,如有错误请见谅,但直觉上我认为一个按钮只需要1个input

【问题讨论】:

  • 你说文件上传成功——只是没有扩展名。你到底在哪里看到的文件?名称的其余部分是否正确?也就是说,只是缺少扩展名吗?还有其他区别吗?例如,它是否与手动上传的其他文件位于同一文件夹中(即不使用 Selenium)?
  • 可能是个愚蠢的问题,但您确定 path_to_my_image 包含文件扩展名吗?

标签: python image selenium upload


【解决方案1】:

根据您的代码尝试,我们似乎无法对第二个 &lt;input&gt; 标记做太多事情。但是您可以简单地从第一个 &lt;input&gt; 标记中删除属性 style="display: none;" 并尝试调用 send_keys() 方法,如下所示:

element = driver.find_element_by_xpath("//input[@id='FileNameUpload' and @name='FileNameUpload']")
driver.execute_script("arguments[0].removeAttribute('style')", element)
driver.find_element_by_xpath("//input[@id='FileNameUpload' and @name='FileNameUpload']").send_keys("path_to_my_image")

注意path_to_my_image必须是以.jpg、.jpeg、.png.gif.bmp 扩展名,并且必须小于 10240强> 字节。

【讨论】:

  • 谢谢!我试过你的代码,但我得到:ElementNotInteractableException: Element &lt;input id="FileNameUpload" class="file-uploader hide-input" name="FileNameUpload" type="file"&gt; is not reachable by keyboard
  • @LucSpan 出于调试目的,需要进行一些核心等待。如果可行,我将提供 WebdriverWait 来打包代码。也许not reachable by keyboard 源于您使用的二进制文件不匹配,就 WebDriver 变体和 WebClient 变体而言。
  • 硬核等待 = time.sleep()?
  • 我试过 1) time.sleep(10) 在你的第一行和第二行之间,2) time.sleep(10) 在你的第二行和第三行之间,但两者都再次给出了键盘无法访问的错误。
  • 你的二进制版本怎么样?
【解决方案2】:

&lt;input&gt; 标记中,文本位于value 属性中。用 JavaScript 设置它应该可以工作

upload_button = el_id('FileNameUpload')
browser.execute_script("arguments[0].value = 'arguments[1]';", upload_button, path_to_my_image)

【讨论】:

  • 感谢您与我一起思考。我运行了您的代码,但得到了 JavascriptException: SecurityError: The operation is insecure. 找到了这个答案:stackoverflow.com/questions/13348766/…。不知道如何继续。
  • @LucSpan 只是为了好玩尝试在隐藏字段upload_button = el_id('FileNameUpload') upload_button.send_keys(path_to_my_image) 上使用send_keys(没有任何javascript)
  • 之前已经尝试过了,给我一个ElementNotInteractableException: Element &lt;input id="FileNameUpload" class="file-uploader hide-input" name="FileNameUpload" type="file"&gt; is not reachable by keyboard。请参阅原始问题。
  • @LucSpan 我明白了。您也可以尝试另一种方式使其可见execute_script("document.getElementById('FileNameUpload'‌​).style.visibility='‌​visible'")
  • 这给出了一个JavascriptException: SyntaxError: illegal character
猜你喜欢
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多