应更改哪些属性以允许通过Selenium上传图像

时间:2018-04-02 17:51:45

标签: python image selenium upload

设置-向上

我正在使用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
  2. 第一个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. 更改第一个class
    2. styleinput属性

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

      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)  
      

      但是图片无法上传。上传按钮更改为本机OS文件选择器“选择文件”按钮。

      我该如何解决这个问题?

      旁注

      我不明白为什么这个按钮有两个input。我是初学者,如果我错了,请原谅我,但直觉上我觉得按钮只需1 input

2 个答案:

答案 0 :(得分:0)

根据您的代码尝试,似乎我们无法对第二个<input>标记做很多事情。但您只需从第一个<input>标记中删除属性 style =&#34; display:none;&#34; ,然后尝试按如下方式调用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 结尾的图像文件的绝对路径,< strong> .jpeg , .png .gif .bmp 扩展名,且必须小于 10240 bytes。

答案 1 :(得分:0)

<input>代码中,文字位于value属性中。使用JavaScript设置它应该可以正常工作

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