AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79593773
Accepted
Mahesh Kamath - Vendor
Mahesh Kamath - Vendor
Asked: 2025-04-26 17:22:56 +0800 CST2025-04-26 17:22:56 +0800 CST 2025-04-26 17:22:56 +0800 CST

HttpsConnectionPool 错误 Selenium:使用 Selenium 将 3000 个 ID 从 csv 文件的列粘贴到 URL 的输入字段中。对于 200 个 ID 来说效果很好

  • 772

我正在使用 Selenium 自动下载一份报告。为此,我需要将大约 3000 个 ID 以循环方式粘贴到网页的输入字段中,每个 ID 大约有 30 万个,然后点击“下载”按钮,等待大约 40 秒即可下载报告。之后,点击“清除”按钮清除输入字段,再将另外 3000 个值(或 ID)粘贴到输入字段中,再次点击“下载”。重复此步骤,直到提取完数据框中某一列的所有 ID。

ID 之间以逗号分隔。

手动操作大约需要 2 秒来粘贴值(正好 3000 个)并下载,然后等待 40 秒,清除并粘贴另外 3000 个 ID。重复此过程。

但是,在登录 url 后使用 selenium 脚本时,关闭所有弹出窗口并选择精确选项,然后在输入(或使用 input_filed.send_keys(ids) 和 input_field.send_keys(Keys.ENTER))时,120 秒出现超时错误。我没有 120 秒的时间等待,而手动只需 2 秒即可抛出错误。

该脚本对于 200 左右的 ID 运行良好,但对于 3000 左右的 ID 则不行。我希望粘贴 3000 个值,以便加快进程。

请提供解决方案。

下面是我尝试的代码。请看一下最后主要问题在哪里。

from selenium import webdriver
#you have to create instance wait
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("MY URL")

wait = WebDriverWait(driver, 10)


try: 
    close_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.toast-close-button")))
    close_button.click()
    print("Popup Closed")
except Exception as e:
    print("No Popup appeared. or popup closed")
    print("Error: ", e)

try:
    username_input = wait.until(EC.presence_of_element_located((By.ID, "username")))
    username_input.send_keys("[email protected]")
    print("UserName Entered")
except Exception as e:
    print("Failed to enter Username")
    print("Error: ", e)


try: 
    password_input = wait.until(EC.presence_of_element_located((By.ID, "password")))
    password_input.send_keys("some_password")
    print("Password Entered")
except Exception as e:
    print("Failed to enter Password")
    print("Error: ",e)

try:
    submit_button = wait.until(EC.element_to_be_clickable((By.ID, "loginSubmit"))) 
    submit_button.click()
    print("Submit Button Clicked")
except Exception as e:
    print("Failed to click submit button")
    print("Error: ",e)


ids_option= WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//*[@id="root"]/div/div/div[2]/div[2]/div[2]/div/div/div[1]/div/div/div/div/div[1]/div'))
)
ids_option.click()

option = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//div[text()="Option for Id selected"]'))
)
option.click()


input_click_target = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//*[@id="root"]/div/div/div[2]/div[2]/div[2]/div/div/div[2]/div/div[1]/div/div/div[1]/div[1]'))
)
input_click_target.click()



focused_input = WebDriverWait(driver, 10).until(
    lambda d: d.execute_script("return document.activeElement")
)


from selenium.webdriver.common.keys import Keys
focused_input.send_keys(id_string)        #comma seperated ids
focused_input.send_keys(Keys.ENTER)

大约 120 秒后,它会抛出错误。如果我只输入 15 或 200 个 ID,它会起作用,但输入 3000 个 ID 时则不起作用。

请提供更快的解决方案

我尝试了上面提到的代码,并期望下载每个包含 3000 个 id 的单独 csv 文件,直到 id 结束。

python
  • 1 1 个回答
  • 57 Views

1 个回答

  • Voted
  1. Best Answer
    Sanjay Nakate
    2025-04-26T17:32:17+08:002025-04-26T17:32:17+08:00

    您尝试使用 Selenium 将 3000 个 ID 快速粘贴到输入框中,但仅当 ID 数量较多(如 3000)时,它才会挂起或引发 HttpsConnectionPool 错误(120 秒后超时),但对于较少的数字(如 200)则工作正常。

    这很常见,因为:send_keys 对于大文本来说非常慢。通过模拟按键粘贴大文本时,浏览器会卡顿。字段可能在每次按键后重新验证(对于数千个字符来说,这很慢)。网络相关操作(每次更改时触发的 XHR/fetch)会由于浏览器繁忙或卡顿而超时。

    解决方案:使用 JavaScript 注入(绕过缓慢的 send_keys) 无需发送数千次击键,而是直接通过 JavaScript 设置值。

    改进的解决方案如下:

    # Instead of send_keys
    driver.execute_script("arguments[0].value = arguments[1];", focused_input, id_string)
    
    # If needed, trigger an input event manually
    driver.execute_script("""
    var input = arguments[0];
    var lastValue = input.value;
    input.value = arguments[1];
    var event = new Event('input', { bubbles: true });
    event.simulated = true;
    input._valueTracker && input._valueTracker.setValue(lastValue);
    input.dispatchEvent(event);
    """, focused_input, id_string)
    

    解释:

    • argument[0] 是您拥有的输入元素。
    • argument[1] 是用逗号分隔的 3000 个 ID 的字符串。
    • 然后它调度一个输入事件,假装用户输入了它,一些应用程序依靠它进行进一步的验证。

    修改此部分:

    # Instead of:
    # focused_input.send_keys(id_string)
    # focused_input.send_keys(Keys.ENTER)
    
    # Use:
    driver.execute_script("arguments[0].value = arguments[1];", focused_input, id_string)
    
    # Optionally trigger input event if needed (for apps that listen to 'input' event)
    driver.execute_script("""
    var input = arguments[0];
    var lastValue = input.value;
    input.value = arguments[1];
    var event = new Event('input', { bubbles: true });
    event.simulated = true;
    input._valueTracker && input._valueTracker.setValue(lastValue);
    input.dispatchEvent(event);
    """, focused_input, id_string)
    
    # Then manually click the download button or submit
    
    • 1

相关问题

  • 如何将 for 循环拆分为 3 个单独的数据框?

  • 如何检查 Pandas DataFrame 中的所有浮点列是否近似相等或接近

  • “load_dataset”如何工作,因为它没有检测示例文件?

  • 为什么 pandas.eval() 字符串比较返回 False

  • Python tkinter/ ttkboostrap dateentry 在只读状态下不起作用

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve