Python中如何使用selenium判断图片上传完成?

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

20180524123511


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检查图片加载状态最靠谱。


你可以对比上传前 上传中 上传后三个页面是否有样式或者标签的变动,一般判断页面是否加载完成也是这种方式。以此来推断具体进行到什么步骤了。

回到顶部