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

VPS服务器上Selenium无法定位元素的问题求助

Selenium脚本本地正常,VPS部署后出现NoSuchElementException的解决方法

问题描述

本地运行Selenium解析脚本完全正常,但部署到VPS服务器时抛出NoSuchElementException,无法定位.no-skins和.market_item元素。以下是相关代码及报错信息:

脚本代码

def csgo_registration():

    options = webdriver.ChromeOptions()
    # options.add_argument("--headless")
    options.add_argument("--no-sandbox")
    options.add_argument('--disable-dev-shm-usage')
    options.add_argument("--disable-blink-features=AutomationControlled")
    options.add_argument(f"user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                         f"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

    driver.get("https://lis-skins.ru/market/csgo/")

    load_cookies(driver, "cookies.txt")

    time.sleep(3)

    driver.refresh()

    time.sleep(3)

    return driver


def csgo_checker(driver, link, wait):

    driver.get(link)
    time.sleep(3)
    try:
        print(5)
        print(5)
        print(5)
        no_skins_elem = driver.find_element(by=By.CLASS_NAME, value="no-skins")
        print("Nothing here")
        return None

    except NoSuchElementException:
        desired_skin_elem = driver.find_element(by=By.CLASS_NAME, value="market_item")
        link_to_buy = desired_skin_elem.find_element(by=By.TAG_NAME, value="a").get_attribute("href")

        good_naming = desired_skin_elem.find_element(by=By.CLASS_NAME, value="name-inner").text
        good_price = desired_skin_elem.find_element(by=By.CLASS_NAME, value="price").text.split("cls")[0][:-1]
        good_float = desired_skin_elem.find_elements(by=By.CLASS_NAME, value="info-item")[-1].text

        print(good_price)

        driver.get(link_to_buy)

        time.sleep(3)

        buy_now_btn = wait.until(ec.element_to_be_clickable((By.CLASS_NAME, "buy-now-button")))

        buy_now_btn.click()

        time.sleep(2)

        try:
            buy_now_popup_btn = wait.until(ec.element_to_be_clickable((By.CLASS_NAME,
                                                                       "buy-now-popup-bottom-button")))
            buy_now_popup_btn.click()
            message = f"Куплено успешно!\nНазвание: {good_naming}\nЦена: {good_price}₽\nФлот: {good_float}"
            return [message, link_to_buy]

        except TimeoutException:

            message = "Недостаточно средств!"
            return [message, link_to_buy]

VPS报错信息

ERROR:asyncio:Task exception was never retrieved
future: <Task finished name='Task-9' coro=<Dispatcher._process_polling_updates() done, defined at /usr/local/lib/python3.8/dist-packages/aiogram/dispatcher/dispatcher.py:407> exception=NoSuchElementException()>
Traceback (most recent call last):
  File "main.py", line 75, in csgo_checker
    no_skins_elem = driver.find_element(by=By.CLASS_NAME, value="no-skins")
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 740, in find_element
    return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 346, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".no-skins"}
  (Session info: headless chrome=114.0.5735.198); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
Stacktrace:
#0 0x560f46c9d4e3 <unknown>
#1 0x560f469ccc76 <unknown>
#2 0x560f46a08c96 <unknown>
#3 0x560f46a08dc1 <unknown>
#4 0x560f46a427f4 <unknown>
#5 0x560f46a2803d <unknown>
#6 0x560f46a4030e <unknown>
#7 0x560f46a27de3 <unknown>
#8 0x560f469fd2dd <unknown>
#9 0x560f469fe34e <unknown>
#10 0x560f46c5d3e4 <unknown>
#11 0x560f46c613d7 <unknown>
#12 0x560f46c6bb20 <unknown>
#13 0x560f46c62023 <unknown>
#14 0x560f46c301aa <unknown>
#15 0x560f46c866b8 <unknown>
#16 0x560f46c86847 <unknown>
#17 0x560f46c96243 <unknown>
#18 0x7f3d468bb609 start_thread


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/dist-packages/aiogram/dispatcher/dispatcher.py", line 415, in _process_polling_updates
    for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
  File "/usr/local/lib/python3.8/dist-packages/aiogram/dispatcher/dispatcher.py", line 235, in process_updates
    return await asyncio.gather(*tasks)
  File "/usr/local/lib/python3.8/dist-packages/aiogram/dispatcher/handler.py", line 117, in notify
    response = await handler_obj.handler(*args, **partial_data)
  File "/usr/local/lib/python3.8/dist-packages/aiogram/dispatcher/dispatcher.py", line 256, in process_update
    return await self.message_handlers.notify(update.message)
  File "/usr/local/lib/python3.8/dist-packages/aiogram/dispatcher/handler.py", line 117, in notify
    response = await handler_obj.handler(*args, **partial_data)
  File "main.py", line 132, in send_welcome
    answer = csgo_checker(driver, link, wait)
  File "main.py", line 80, in csgo_checker
    desired_skin_elem = driver.find_element(by=By.CLASS_NAME, value="market_item")
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 740, in find_element
    return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 346, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".market_item"}
  (Session info: headless chrome=114.0.5735.198); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
Stacktrace:
#0 0x560f46c9d4e3 <unknown>
#1 0x560f469ccc76 <unknown>
#2 0x560f46a08c96 <unknown>
#3 0x560f46a08dc1 <unknown>
#4 0x560f46a427f4 <unknown>
#5 0x560f46a2803d <unknown>
#6 0x560f46a4030e <unknown>
#7 0x560f46a27de3 <unknown>
#8 0x560f469fd2dd <unknown>
#9 0x560f469fe34e <unknown>
#10 0x560f46c5d3e4 <unknown>
#11 0x560f46c613d7 <unknown>
#12 0x560f46c6bb20 <unknown>
#13 0x560f46c62023 <unknown>
#14 0x560f46c301aa <unknown>
#15 0x560f46c866b8 <unknown>
#16 0x560f46c86847 <unknown>
#17 0x560f46c96243 <unknown>
#18 0x7f3d468bb609 start_thread

解决方法

1. 修复无头模式配置

从报错信息看,VPS实际是用无头模式运行的,但代码中注释了--headless参数。无头模式下必须配置窗口尺寸,否则页面渲染会异常:

options.add_argument("--headless=new")  # 使用新版无头模式,更接近正常浏览器行为
options.add_argument("--window-size=1920,1080")  # 设置标准桌面窗口尺寸

2. 替换固定等待为显式等待

time.sleep()是固定时长等待,VPS的网络或性能波动会导致页面未加载完成就查找元素。全部替换为显式等待:

# 替换driver.get(link)后的time.sleep(3)
wait.until(ec.presence_of_element_located((By.TAG_NAME, "body")))

# 查找元素时用显式等待替代直接find_element
try:
    no_skins_elem = wait.until(ec.presence_of_element_located((By.CLASS_NAME, "no-skins")))
    print("Nothing here")
    return None
except TimeoutException:
    desired_skin_elem = wait.until(ec.presence_of_element_located((By.CLASS_NAME, "market_item")))

3. 验证Cookie有效性

本地生成的cookies.txt可能包含与本地IP、会话绑定的信息,传到VPS后会失效。建议在VPS上重新登录网站,生成新的cookies文件替换原文件。

4. 排查反爬拦截

VPS的IP可能被网站标记为爬虫,导致页面返回异常内容(如验证码页、空白页)。可以在获取页面后截图排查:

driver.save_screenshot("vps_page.png")  # 运行后查看截图,确认页面是否正常加载

如果遭遇反爬,添加更多模拟浏览器的参数:

options.add_argument("--disable-extensions")
options.add_argument("--disable-gpu")
options.add_argument("--start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)

5. 确保Chrome与驱动版本匹配

虽然使用了ChromeDriverManager,但VPS上的Chrome版本可能与本地不一致,导致兼容性问题。可以手动指定驱动版本:

driver = webdriver.Chrome(service=Service(ChromeDriverManager(version="114.0.5735.90").install()), options=options)

内容的提问来源于stack exchange,提问作者Lam Thuyi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:18:09