Selenium点击Convert按钮无报错但网站返回Invalid Argument错误如何解决
问题描述
代码执行到最后一行点击Convert按钮将无版权YouTube音乐视频转换为mp3文件时,网站会在按钮下方红色框抛出错误:Invalid Argument。已尝试其他触发方式,包括调用.send_keys(Keys.ENTER)、.submit()方法,均出现相同错误。注:不建议直接访问带转换按钮的目标网站,该网站存在可疑广告,因此操作使用Brave浏览器而非Chrome。
按钮对应HTML代码
<button id="cvt-btn" class="btn btn-danger mr-1">Convert</button>
原始代码
import time from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import StaleElementReferenceException driver_path = "C:/Users/User/Documents/Python_Projects/chromedriver.exe" brave_path = "C:/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe" option = webdriver.ChromeOptions() option.binary_location = brave_path driver=webdriver.Chrome(executable_path=driver_path, chrome_options=option) driver.maximize_window() driver.implicitly_wait(2) driver.get("https://www.youtube.com/watch?v=MkNeIUgNPQ8&list=PLzCxunOM5WFLNCSF0UEHZqFJJlmdeL71S") driver.find_element_by_xpath("/html/body/ytd-app/ytd-consent-bump-v2-lightbox/tp-yt-paper-dialog/div[2]/div[2]/div[5]/div[2]/ytd-button-renderer[2]/a/tp-yt-paper-button").click() lnks=driver.find_elements_by_tag_name("a") songs = [] double = False for lnk in lnks: link = lnk.get_attribute("href") if link != None: if "FJJlmdeL71S&index=2" in link: for i in songs: if link == i: double = True else: double = False if double == False: songs.append(link) driver.implicitly_wait(2) driver.get("https://youtubetomp3music.com/en26/") for i in songs: driver.find_element_by_xpath("/html/body/header/div[2]/div/div[2]/form/div/div[1]/input").send_keys(i) driver.find_element_by_xpath("/html/body/header/div[2]/div/div[2]/form/div/div[2]/button").click() driver.find_element_by_id("cvt-btn").click()
修复方案
错误原因
报错核心是点击转换按钮时提交的参数无效,常见触发场景有三种:
- 点击操作执行过快,页面还未完成链接解析,转换按钮绑定的参数未初始化完成
- Selenium的自动化特征被网站反爬策略识别,请求被拦截
- 多次循环输入时输入框有历史内容残留,导致提交的链接格式异常
具体修改点
- 新增Selenium反爬配置,隐藏自动化特征,初始化浏览器选项时添加以下代码:
option.add_argument("--disable-blink-features=AutomationControlled") option.add_experimental_option("excludeSwitches", ["enable-automation"]) option.add_experimental_option("useAutomationExtension", False)
- 替换原有隐式等待为显式等待,确保链接解析完成后再点击转换按钮,同时每次输入新链接前先清空输入框:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 循环逻辑修改为以下内容 wait = WebDriverWait(driver, 10) input_xpath = "/html/body/header/div[2]/div/div[2]/form/div/div[1]/input" search_btn_xpath = "/html/body/header/div[2]/div/div[2]/form/div/div[2]/button" for i in songs: # 清空输入框再输入链接 input_ele = wait.until(EC.presence_of_element_located((By.XPATH, input_xpath))) input_ele.clear() input_ele.send_keys(i) # 点击搜索 wait.until(EC.element_to_be_clickable((By.XPATH, search_btn_xpath))).click() # 等待转换按钮可点击后再执行点击 cvt_btn = wait.until(EC.element_to_be_clickable((By.ID, "cvt-btn"))) # 用JS点击避免元素交互限制 driver.execute_script("arguments[0].click();", cvt_btn) # 单次转换完成后可以加几秒等待,避免请求频率过高被拦截 time.sleep(3)
- 原有链接去重逻辑存在缺陷,只要最后一个存储的链接和当前链接不同就会判定为不重复,可以直接用set简化去重:
songs = [] for lnk in lnks: link = lnk.get_attribute("href") if link and "FJJlmdeL71S&index=2" in link: songs.append(link) # 直接去重 songs = list(set(songs))
内容的提问来源于stack exchange,提问作者Aloof
相关产品推荐
相关产品推荐

