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

如何从Python脚本发送信号触发已运行的Selenium脚本?

技术实现指引:跨脚本触发结账流程

一、Python脚本间通信方案(无需Node.js)

直接用Python原生方案就能实现需求,不用额外学习新语言,成本更低。

1. 本地Socket通信(实时性高)

  • 思路:结账脚本做服务端,启动后保持Selenium登录状态,监听本地端口等待信号;加购脚本做客户端,成功加购后给服务端发触发指令。
  • 代码片段:
    结账脚本(服务端):
    import socket
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    # 加载Chrome用户配置,跳过重复登录
    chrome_options = Options()
    chrome_options.add_argument(r"user-data-dir=C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data") # Windows路径,Mac/Linux自行替换
    driver = webdriver.Chrome(options=chrome_options)
    driver.get("https://目标网站/cart") # 直接进入购物车,确保登录状态有效
    
    # 启动本地Socket监听
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(('localhost', 9999))
    server.listen(1)
    print("等待加购触发信号...")
    
    while True:
        conn, addr = server.accept()
        signal = conn.recv(1024).decode()
        if signal == "DO_CHECKOUT":
            print("收到指令,开始结账")
            # 这里写你的结账Selenium逻辑:点击结账按钮、填地址、提交订单等
            driver.find_element("id", "checkout-btn").click()
        conn.close()
    
    加购脚本(客户端):
    import socket
    
    def send_checkout_signal():
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.connect(('localhost', 9999))
        client.send(b"DO_CHECKOUT")
        client.close()
    
    # 商品成功加入购物车后调用
    if 加购成功的判断条件:
        send_checkout_signal()
    

2. 本地文件标记(实现简单)

  • 思路:加购成功后创建一个临时文件,结账脚本定时检查这个文件,存在就执行结账然后删除文件。
  • 代码片段:
    结账脚本:
    import os
    import time
    from selenium import webdriver
    
    # 初始化Selenium并保持登录(同上)
    driver = webdriver.Chrome(options=chrome_options)
    driver.get("https://目标网站/cart")
    
    TRIGGER_FILE = "./checkout_flag.txt"
    while True:
        if os.path.exists(TRIGGER_FILE):
            print("检测到触发信号")
            # 执行结账流程
            driver.find_element("id", "checkout-btn").click()
            os.remove(TRIGGER_FILE)
        time.sleep(1) # 每秒检查一次
    
    加购脚本:
    import os
    
    if 加购成功的判断条件:
        with open("./checkout_flag.txt", "w") as f:
            f.write("1")
    

二、Node.js实现方案

如果想用Node.js,核心是让Node脚本维持Selenium登录状态,通过HTTP接口或Socket接收Python的触发指令。

1. Node.js + Express HTTP服务

  • 思路:Node启动一个本地HTTP服务,同时初始化Selenium保持登录;Python通过POST请求调用该服务触发结账。
  • 代码片段:
    Node脚本(checkout-server.js):
    const { Builder } = require('selenium-webdriver');
    const chrome = require('selenium-webdriver/chrome');
    const express = require('express');
    const app = express();
    let driver;
    
    // 初始化Selenium并登录
    async function initDriver() {
        const options = new chrome.Options().addArguments(r"user-data-dir=C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data");
        driver = await new Builder().forBrowser('chrome').setChromeOptions(options).build();
        await driver.get("https://目标网站/cart");
        console.log("已登录,等待结账指令");
    }
    
    // 定义触发接口
    app.post('/trigger-checkout', async (req, res) => {
        try {
            await driver.get("https://目标网站/checkout");
            // 执行结账操作:点击按钮、填写信息等
            console.log("结账流程执行完成");
            res.sendStatus(200);
        } catch (err) {
            console.error("结账失败:", err);
            res.sendStatus(500);
        }
    });
    
    // 启动服务
    initDriver().then(() => {
        app.listen(3000, () => {
            console.log("服务运行在 http://localhost:3000");
        });
    });
    
    Python调用代码:
    import requests
    
    if 加购成功的判断条件:
        resp = requests.post("http://localhost:3000/trigger-checkout")
        if resp.status_code == 200:
            print("触发结账成功")
    

三、关键注意事项

  • 持久化登录:一定要加载Chrome用户配置文件,避免每次启动Selenium都重新登录,这是提升速度的核心。
  • 异常处理:给结账流程加try-catch,比如元素找不到、网络超时等情况,必要时加重试逻辑。
  • 后台运行:如果不想看到Chrome窗口,可以用无头模式(add_argument('--headless=new')),但注意无头模式可能会丢失登录状态,建议先测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:10:40