Python中如何使用selenium判断图片上传完成?
上传图片的时候会有一个 loading 的界面, 我需要在这个上传完毕之后, 点击提交的按钮, 但是不知道, 这个如何判断上传完成了。

Python中如何使用selenium判断图片上传完成?
2 回复
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import time
def wait_for_image_upload(driver, locator, timeout=30):
"""
等待图片上传完成的通用方法
Args:
driver: WebDriver实例
locator: 定位上传后图片元素的定位器 (By.XPATH, By.CSS_SELECTOR等)
timeout: 最大等待时间(秒)
Returns:
bool: 上传是否成功完成
"""
try:
# 方法1:等待图片元素出现且src属性不为空
wait = WebDriverWait(driver, timeout)
img_element = wait.until(
EC.presence_of_element_located(locator)
)
# 方法2:等待图片加载完成(src包含有效内容且不是默认占位图)
def is_image_loaded(driver):
img = driver.find_element(*locator)
src = img.get_attribute('src')
# 检查src是否有效(不是空、data:image占位符等)
if src and src.strip() and not src.startswith('data:image'):
# 检查图片是否完全加载
return driver.execute_script("""
var img = arguments[0];
return img.complete && img.naturalWidth > 0;
""", img)
return False
# 轮询检查图片是否加载完成
start_time = time.time()
while time.time() - start_time < timeout:
if is_image_loaded(driver):
return True
time.sleep(0.5)
return False
except TimeoutException:
print(f"等待图片上传超时({timeout}秒)")
return False
# 使用示例
driver = webdriver.Chrome()
driver.get("your_upload_page_url")
# 1. 先执行上传操作
file_input = driver.find_element(By.CSS_SELECTOR, "input[type='file']")
file_input.send_keys("/path/to/your/image.jpg")
# 2. 等待上传完成
# 假设上传后的图片会显示在某个img标签中
img_locator = (By.CSS_SELECTOR, ".preview-area img.uploaded")
success = wait_for_image_upload(driver, img_locator, timeout=30)
if success:
print("图片上传并加载完成!")
# 继续后续操作...
else:
print("图片上传失败或超时")
# 备选方案:通过上传进度元素判断
def wait_by_upload_progress(driver):
"""通过上传进度条/文本判断"""
try:
# 等待进度元素消失或显示100%
wait = WebDriverWait(driver, 30)
wait.until(EC.invisibility_of_element_located(
(By.CLASS_NAME, "upload-progress")
))
# 或者等待成功提示出现
success_msg = wait.until(EC.presence_of_element_located(
(By.CLASS_NAME, "upload-success")
))
return True
except:
return False
# 关闭浏览器
driver.quit()
核心思路就是等图片元素出现并且确保它真的加载完了,别只看DOM有了就以为完事儿了。
总结:用显式等待加JS检查图片加载状态最靠谱。
你可以对比上传前 上传中 上传后三个页面是否有样式或者标签的变动,一般判断页面是否加载完成也是这种方式。以此来推断具体进行到什么步骤了。

