我需要通过外部网址上传图片,但我发现的示例仅显示了如何上传本地存储的图片。这是我尝试过的,但没有成功。
driver.find_element_by_id("attachFile_nPaintUploadAll").send_keys("http://bdfjade.com/data/out/89/5941587-natural-image-download.jpg")
错误消息:
selenium.common.exceptions.InvalidArgumentException: Message: File not found: http://bdfjade.com/data/out/89/5941587-natural-image-download.jpg
答案 0 :(得分:2)
根据send_keys()
的文档,模拟了元素的键入。
send_keys(*value)
Args:
value - A string for typing. For setting file inputs, this could be a local file path.
使用此设置文件输入:
driver.find_element_by_id("attachFile_nPaintUploadAll").send_keys("path/to/profilepic.gif")
但是根据您的代码试用,您将 url 作为 string 传递,因此您看到的错误为:
selenium.common.exceptions.InvalidArgumentException: Message: File not found: http://bdfjade.com/data/out/89/5941587-natural-image-download.jpg
如果用例要使用 Selenium 上传文件,则必须在本地系统中下载文件并通过绝对路径作为send_keys()
方法中的参数。
作为替代方案,您还可以使用 Python 3.x 中的urlretrieve
方法,如下所示:
将URL表示的网络对象复制到本地文件。如果URL指向本地文件,则除非提供文件名,否则不会复制该对象。返回一个元组(文件名,标头),其中filename是可以在其中找到对象的本地文件名,标头是urlopen()
返回的对象的info()方法(对于远程对象)返回的任何值。例外与urlopen()
相同。
代码块:
import urllib.request
urllib.urlretrieve("http://andrew.com/selfie.jpg", "andrew_selfie.jpg")
driver.find_element_by_id("attachFile_nPaintUploadAll").send_keys("andrew_selfie.jpg")
答案 1 :(得分:1)
尝试先获取文件,然后上传:
import urllib
urllib.urlretrieve("http://bdfjade.com/data/out/89/5941587-natural-image-download.jpg", "5941587-natural-image-download.jpg")
driver.find_element_by_id("attachFile_nPaintUploadAll").send_keys("5941587-natural-image-download.jpg")
要在Python 3.X中检索文件,您可以尝试
urllib.request.urlretrieve("http://bdfjade.com/data/out/89/5941587-natural-image-download.jpg", "5941587-natural-image-download.jpg")
或
import requests
with open("5941587-natural-image-download.jpg", "wb") as f:
f.write(requests.get("http://bdfjade.com/data/out/89/5941587-natural-image-download.jpg").content)
您可以删除文件,然后使用
import os
os.remove("5941587-natural-image-download.jpg")