【问题标题】:Upload multiple files using Python Selenium WebDriver使用 Python Selenium WebDriver 上传多个文件
【发布时间】:2014-04-29 22:38:14
【问题描述】:

我有一个html元素

<input type=file multiple="">

如何使用 send_keys 上传多个文件?

目前这适用于上传单个文件。我想用它来上传多个文件

我尝试了逗号分隔的路径,但没有成功。

【问题讨论】:

    标签: python selenium selenium-webdriver


    【解决方案1】:

    首先,将所有文件发送到元素,然后提交。

    以下是 Ruby 代码,但您可以对 Python 应用相同的逻辑:

    uploader = driver.find_element(id: 'file-upload')
    uploader.send_keys 'path_to_file1'
    uploader.send_keys 'path_to_file2'
    uploader.send_keys 'path_to_file3'
    .
    .
    .
    uploader.submit
    

    我不确定这是否可行,但请尝试一下并告诉我结果。

    【讨论】:

      【解决方案2】:

      这是一个适用于我上传多张照片的具体案例的示例,可能会对某人有所帮助...

      Photos 是一个字符串数组,即['/Users/foo/bar/beautiful_forest-1546653.jpg', '/Users/foo/bar/DTHalloween.jpg'],然后我循环并通过send_keys 上传它们。我通过检查上传的文件名是否存在于 DOM 中来确保它们被上传,如果成功(特定于我的情况),它将被上传。 FWIW,我正在测试一个 react.js 网络应用顺便说一句。

      def uploadPhoto(self, photos):
          try:
              drop_zone = self.driver.find_element_by_id('photo-file-input')
      
              alreadyUploaded = []  # keep track of uploaded files
      
              for photo in photos:
                  photo_name = photo.split('/')[-1].split('.')[0]
      
                  if photo_name.lower() in alreadyUploaded:
                    print("Photo already uploaded with name: ( "+ photo_name.lower()+" )")
                    continue
      
                  alreadyUploaded.append(photo_name.lower())
      
                  drop_zone.send_keys(photo)
      
                  try:
                      WebDriverWait(self.driver, 5).until(
                          EC.presence_of_element_located((By.XPATH, '//img[contains(@data-galleryid, '+ photo_name +')]'))
                      )
                  except Exception, e:
                      raise Exception(e)
              return True
          except Exception, e:
              print 'Failed to upload photo {}'.format(str(e))
              return False
      

      【讨论】:

      • 我认为这是某种错误的场景,因为有两个请求带​​有单个文件而不是一个带有多个文件。在我的情况下,一个请求启动了所有文件的大型机器。你知道如何通过一个请求来完成吗?
      • @Netrix 不确定您是否使用我提供的实际代码,但它没有逻辑来确定是否已上传具有特定名称的照片,因此为什么会产生重复。我已经编辑了我的帖子以包含这样的逻辑。希望这能回答您的问题。
      • 谢谢,但我发现在我的情况下,一次 send_keys 调用会产生一个 POST。我想要的是能够通过 send_keys 请求上传多个文件。我发现了如何做到这一点,但它可能使用了一个错误,该错误将先前发送的文件保留为下一个请求,因此当我为第二个文件调用 send_keys 时,它实际上会发送两个文件。
      【解决方案3】:

      path = “/home/downloads/” send_keys(路径 + “file1.csv \n” + 路径 + “file2.csv”)

      我发现它在我的代码中工作。试试这个,告诉我你遇到的错误。

      【讨论】:

        【解决方案4】:

        我试过这个。 uploader.send_keys 'path_to_file1' 将上传file1,当我尝试上传file2时,

        抛出异常,说“上传器”元素无法交互

        我做了一个 uploader.is_enabled()

        它给了我错误

        【讨论】:

          【解决方案5】:

          我没有测试这段代码,但我认为它应该可以工作

          image_string = " ".join(images_array)
          driver.find_element_by_class_name('PhotoInputFile').send_keys(image_string)
          time.sleep(2)
          driver.find_element_by_class_name("ButtonUploadPhotos").click()
          

          【讨论】:

            【解决方案6】:

            尝试使用它,因为对我有用:

             @staticmethod
             def set_multiple_file_file():
               element = (INSERT_FILE)
               ROOT_DIR = your.path
               first_path = archive1.something
               second_path = archive2.something
               third_path = archive3.something
               element.send_keys(ROOT_DIR + first_path + ROOT_DIR + second_path + ROOT_DIR + third_path)
            

            【讨论】:

            • 纯代码答案并不是特别有用。请添加一些关于此代码如何解决问题的说明。
            猜你喜欢
            • 2014-07-20
            • 2017-10-02
            • 2019-09-20
            • 2023-03-06
            • 2016-10-19
            • 2013-06-17
            • 1970-01-01
            • 2020-09-13
            • 2013-09-20
            相关资源
            最近更新 更多