如何在Python Selenium中通过if-else判断文件上传状态并继续执行
问题描述
文件上传完成后,页面会显示Upload successful!文本;多次上传错误时,页面元素会显示Upload Status。需求是通过if-else逻辑实现:无论上传成功或失败,都执行后续命令(返回上一页并处理下一个文件),但以下两段代码均无法正常工作,需要正确实现方式:
尝试的错误代码1
if WebDriverWait(driver, 300, 1).until( EC.text_to_be_present_in_element((By.XPATH, "//*"), "Upload successful!") ): print("uploaded") driver.back() else: print("upload failed") driver.back()
尝试的错误代码2
myStr = WebDriverWait(driver, 300, 1).until( EC.text_to_be_present_in_element((By.XPATH, "//*")) ) if myStr.txt.contains("Upload successful!"): print("uploaded") driver.back() else: print("upload failed") driver.back()
问题分析
- 第一段代码:
EC.text_to_be_present_in_element仅等待指定文本出现,若超时(即出现Upload Status)会直接抛出TimeoutException,不会进入else分支,导致失败逻辑无法执行。 - 第二段代码:
EC.text_to_be_present_in_element必须传入第二个参数(目标文本),且该方法返回布尔值而非元素对象,因此myStr.txt.contains的写法完全错误。
正确实现方式
使用EC.any_of等待两种状态文本中的任意一种出现,避免超时报错;之后获取目标元素文本判断状态,最后统一执行后续操作:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By try: # 等待页面出现上传成功或失败的状态文本,超时300秒 WebDriverWait(driver, 300, 1).until( EC.any_of( EC.text_to_be_present_in_element((By.XPATH, "//*"), "Upload successful!"), EC.text_to_be_present_in_element((By.XPATH, "//*"), "Upload Status") ) ) # 获取状态元素的文本(建议替换//*为具体的状态元素XPATH,提升准确性) status_text = driver.find_element(By.XPATH, "//*").text if "Upload successful!" in status_text: print("上传成功") else: print("上传失败") # 无论成功失败,执行后续操作 driver.back() # 此处添加处理下一个文件的逻辑 except Exception as e: print(f"等待超时或发生异常: {str(e)}") # 异常场景下也可执行后续操作,根据需求调整 driver.back()
优化建议
- 避免使用
//*定位元素,建议找到显示上传状态的具体元素(比如带特定class或id的容器),替换为更精准的XPATH(例如//div[@class='upload-status-container']),减少误判概率。 - 可根据实际情况调整超时时间,300秒过长时可适当缩短。
内容的提问来源于stack exchange,提问作者Sagar Rawal
相关产品推荐
相关产品推荐

