使用Python Selenium WebDriver上传多个文件

4 投票
6 回答
6263 浏览
提问于 2025-04-18 04:49

我有一个 HTML 元素

<input type=file multiple="">

我该如何使用 send_keys 来上传多个文件呢?

现在这个方法只能上传一个文件。我想用它来上传多个文件。

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

6 个回答

0

我没有测试这段代码,但我觉得它应该能正常工作。

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()
0

我试过这样做。用uploader.send_keys 'path_to_file1'可以上传文件1,但当我尝试上传文件2时,

出现了一个错误,提示“无法与'uploader'元素进行交互”。

我检查了一下uploader.is_enabled()

结果是false。

1

这里有一个例子,适合我自己的情况,用来上传多张照片,可能对其他人也有帮助...

Photos 是一个字符串数组,比如 ['/Users/foo/bar/beautiful_forest-1546653.jpg', '/Users/foo/bar/DTHalloween.jpg']。然后我通过 send_keys 循环上传这些照片。我会检查上传的文件名是否存在于网页的结构中,如果存在就说明上传成功(这是我特定的情况)。顺便说一下,我是在测试一个 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
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

我不确定这样做是否有效,但你可以试试看,然后告诉我结果。

3

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

我发现这个在我的代码中可以正常工作。你也试试这个,然后告诉我你遇到的错误。

撰写回答