使用Selenium向reroom.ai上传图片无响应,求解决方案
问题描述
我使用Python和Selenium编写了脚本,尝试将本地文件夹中的图片上传至reroom.ai网站。该网站需通过Google登录才能进入上传页面,登录完成后会自动跳转至目标页面,点击Full Remake按钮后,脚本试图通过“Drag & Drop your image or Browse”按钮上传图片,但选中Browse按钮后无任何反应。以下是我的代码:
import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = 'https://reroom.ai/' options = webdriver.ChromeOptions() options.add_argument("--disable-blink-features=AutomationControlled") driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) gmail = "" #gamil address here password = "" #password here driver.get(url) original_window = driver.current_window_handle driver.maximize_window() try: WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@type='button'][contains(.,'Accept')]"))).click() except Exception as err: pass WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[./img[@alt='google']][contains(.,'Sign in with Google')]"))).click() time.sleep(5) WebDriverWait(driver, 20).until(EC.new_window_is_opened) driver.switch_to.window([window for window in driver.window_handles if window != original_window][0]) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#identifierId"))).send_keys(gmail) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#identifierNext"))).click() time.sleep(5) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='Passwd']"))).send_keys(password) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button/span[.='Next']"))).click() driver.switch_to.window(original_window) time.sleep(5) WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//span[.='Full Remake']"))).click() image_path = r'C:\Users\C.L\Desktop\Jonathan\c7OgQ1Qh.jpeg' WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "img[class='object-contain']"))) time.sleep(5) file_input = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='filepond--label-action'][.='Browse']"))) time.sleep(5) file_input.send_keys(image_path)
解决方案
问题核心是:你定位的Browse是页面上的文本按钮元素,但网站的文件上传功能依赖隐藏的<input type="file">原生控件,而非可见的按钮。直接对可见按钮使用send_keys不会触发上传逻辑,必须操作真实的文件输入框。
修改后的代码如下(替换原代码中最后几行关于文件上传的部分):
image_path = r'C:\Users\C.L\Desktop\Jonathan\c7OgQ1Qh.jpeg' # 等待文件上传控件加载完成 WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='file'][accept='image/*']"))) # 定位隐藏的文件输入框 file_input = driver.find_element(By.CSS_SELECTOR, "input[type='file'][accept='image/*']") # 直接向输入框发送本地文件路径 file_input.send_keys(image_path)
完整的修改后代码:
import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = 'https://reroom.ai/' options = webdriver.ChromeOptions() options.add_argument("--disable-blink-features=AutomationControlled") driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) gmail = "" #gamil address here password = "" #password here driver.get(url) original_window = driver.current_window_handle driver.maximize_window() try: WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@type='button'][contains(.,'Accept')]"))).click() except Exception as err: pass WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[./img[@alt='google']][contains(.,'Sign in with Google')]"))).click() time.sleep(5) WebDriverWait(driver, 20).until(EC.new_window_is_opened) driver.switch_to.window([window for window in driver.window_handles if window != original_window][0]) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#identifierId"))).send_keys(gmail) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#identifierNext"))).click() time.sleep(5) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='Passwd']"))).send_keys(password) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button/span[.='Next']"))).click() driver.switch_to.window(original_window) time.sleep(5) WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//span[.='Full Remake']"))).click() image_path = r'C:\Users\C.L\Desktop\Jonathan\c7OgQ1Qh.jpeg' # 等待文件上传控件加载完成 WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='file'][accept='image/*']"))) # 定位隐藏的文件输入框 file_input = driver.find_element(By.CSS_SELECTOR, "input[type='file'][accept='image/*']") # 直接向输入框发送本地文件路径 file_input.send_keys(image_path)
内容的提问来源于stack exchange,提问作者SMTH
相关产品推荐
相关产品推荐

