You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Selenium实现GitHub Good First Issue自动认领的问题求助

问题描述

想开发一个Web Scraping工具,自动监控GitHub上带有up-for-grabs标签的开源issue,自动评论"Claiming this issue"完成认领——因为Hacktoberfest或GSOC活动中这类简单任务竞争激烈,手动监控效率太低。目前已能识别目标issue,但自动评论环节报错,无法定位评论输入框。

代码与报错信息

实现代码

from selenium import webdriver
from selenium.webdriver.common.by import By

website='https://github.com/ToolJet/ToolJet/issues?page=1&q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc'
path='C:\\Users\vedant\OneDrive\Desktop'
driver=webdriver.Chrome(path)

driver.get(website)

issue_labels = driver.find_elements(By.CLASS_NAME, "IssueLabel")

for issue_label in issue_labels:
    if issue_label.text == 'up-for-grabs':
        issue_parent_element = issue_label.find_element(By.XPATH, "..")
        issue_grandparent_element = issue_parent_element.find_element(By.XPATH, "..")
        issue_link_element = issue_grandparent_element.find_element(By.CLASS_NAME, "Link--primary")
        issue_link = issue_link_element.get_attribute('href')
        driver.get(issue_link)
        comment_box = driver.find_element(By.TAG_NAME, "textarea")
        comment_box.send_keys("Claiming this issue")
        submit_button = driver.find_element(By.XPATH, "//button[contains(text(),'Comment')]")
        submit_button.click()
        break

driver.close()

报错信息

Traceback (most recent call last):
  File "C:\Users\vedant\PycharmProjects\HelloWorld\main.py", line 36, in <module>
    comment_box = driver.find_element(By.TAG_NAME, "textarea")
  File "C:\Users\vedant\PycharmProjects\HelloWorld\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 861, in find_element
    return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
  File "C:\Users\vedant\PycharmProjects\HelloWorld\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 444, in execute
    self.error_handler.check_response(response)
  File "C:\Users\vedant\PycharmProjects\HelloWorld\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 249, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"tag name","selector":"textarea"}
解决方案与可行性分析

问题根源与修复步骤

  1. 元素定位错误
    GitHub的评论输入框并非直接通过<textarea>标签就能定位——页面加载后,评论框默认处于折叠状态,且实际的textarea带有特定类名comment-form-textarea。需先触发评论框显示,再用精准选择器定位:

    • 先点击页面中的"Comment"按钮(或评论输入区域)展开输入框
    • 用By.CLASS_NAME, "comment-form-textarea"定位输入框
  2. 缺少页面等待机制
    页面跳转后,动态元素需要时间加载,直接查找会导致元素未就绪。需添加Selenium显式等待,确保元素加载完成后再操作:
    导入WebDriverWait和expected_conditions模块,等待元素可交互。

  3. 未处理登录状态
    GitHub要求登录才能发表评论,脚本需先完成登录:

    • 可以手动登录后保存cookie,后续脚本加载cookie跳过登录
    • 或在脚本中自动输入账号密码完成登录(注意账号安全,避免硬编码)

修改后的示例代码

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
import time

website='https://github.com/ToolJet/ToolJet/issues?page=1&q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc'
path='C:\\Users\vedant\OneDrive\Desktop'
driver=webdriver.Chrome(path)

# 先处理登录(示例:手动登录后保存cookie,这里假设已登录,或添加自动登录逻辑)
driver.get("https://github.com/login")
# 这里可以添加输入账号密码的代码,或者加载本地cookie
# 示例:加载cookie(需先手动登录后导出cookie并保存)
# with open("github_cookies.txt", "r") as f:
#     cookies = json.load(f)
# for cookie in cookies:
#     driver.add_cookie(cookie)
time.sleep(2) # 等待登录完成,实际建议用显式等待

driver.get(website)

# 等待标签元素加载
issue_labels = WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.CLASS_NAME, "IssueLabel"))
)

for issue_label in issue_labels:
    if issue_label.text == 'up-for-grabs':
        # 定位issue链接(优化层级定位,避免依赖多层父元素)
        issue_link = issue_label.find_element(By.XPATH, "../../../div[1]/div[1]/a").get_attribute('href')
        driver.get(issue_link)
        
        # 等待页面加载并展开评论框
        WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//button[contains(text(),'Comment')]"))
        ).click()
        
        # 定位评论输入框并输入内容
        comment_box = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.CLASS_NAME, "comment-form-textarea"))
        )
        comment_box.send_keys("Claiming this issue")
        
        # 提交评论
        submit_button = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//button[contains(text(),'Comment')]"))
        )
        submit_button.click()
        break

driver.close()

方案可行性说明

这个方案具备技术可行性,但需注意以下限制:

  • GitHub反爬机制:频繁的自动请求可能触发GitHub的速率限制,导致账号被临时封禁。建议添加随机延迟,避免短时间内大量请求。
  • 仓库规则:部分开源仓库明确禁止自动认领issue,自动评论可能被维护者标记为恶意行为,甚至封禁账号。使用前需确认目标仓库的贡献规则。
  • 账号安全:自动登录脚本需妥善处理账号密码,避免硬编码或泄露。

内容的提问来源于stack exchange,提问作者Vedant Borkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 10:00:18