本文探讨了如何在多个独立浏览器中并行执行自动化任务,并模拟独立的鼠标光标操作。传统方法难以实现,因此我们提出采用基于发布-订阅(pub-sub)模式的领导者-跟随者架构。通过消息队列系统,领导者程序广播指令,而多个跟随者程序各自驱动一个selenium浏览器实例,接收并执行这些指令,从而实现高效且独立的并行自动化。
在自动化测试、数据抓取或多账号操作等场景中,开发者常常面临一个挑战:如何在多个独立的浏览器实例中同时执行任务,并且每个实例都能模拟独立的鼠标光标操作。这与简单的多线程或多进程启动浏览器不同,因为操作系统通常只提供一个物理鼠标光标,像pyautogui这类库的操作会影响到全局光标,无法实现多个独立浏览器中“各自”的鼠标移动和点击。传统的虚拟化方案虽然能隔离环境,但若要实现程序化的独立鼠标控制,通常会带来较高的复杂性和资源开销。
为了有效解决这一问题,核心策略是采用一种分布式通信模式——发布-订阅(Publish-Subscribe, Pub-Sub)模式,并结合领导者-跟随者(Leader-Follower)架构。这种模式将任务的生成与执行解耦,使得多个浏览器实例能够独立地接收和响应指令。
该解决方案的核心在于构建一个领导者程序和N个跟随者程序,并通过一个消息队列系统进行通信。
领导者程序 (Leader Program)
跟随者程序 (Follower Programs)
消息队列系统 (Message Queue System)
以下是使用Python和Selenium结合消息队列系统实现此架构的概念性示例:
首先,选择一个消息队列框架并进行基本配置。以RabbitMQ为例,你需要安装pika库。
pip install pika selenium webdriver_manager
领导者程序负责生成并发布指令。
# leader.py (概念性代码,需根据实际消息队列库调整)
import json
import pika # 假设使用RabbitMQ
class Leader:
def __init__(self, queue_name='browser_commands'):
self.connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
self.channel = self.connection.channel()
self.channel.queue_declare(queue=queue_name)
self.queue_name = queue_name
def publish_command(self, browser_id, command_type, payload):
"""
发布一个指令到消息队列。
:param browser_id: 目标浏览器实例的ID。
:param command_type: 指令类型,如 'mouse_move', 'click', 'navigate'。
:param payload: 指令的具体参数,如坐标、URL等。
"""
message = {
"browser_id": browser_id,
"type": command_type,
"payload": payload
}
self.channel.basic_publish(
exchange='',
routing_key=self.queue_name,
body=json.dumps(message)
)
print(f"Leader published: {message}")
def close(self):
self.connection.close()
if __name__ == "__main__":
leader = Leader()
# 模拟为不同的浏览器实例发布指令
leader.publish_command(1, 'navigate', {'url': 'https://www.example.com'})
leader.publish_command(2, 'navigate', {'url': 'https://www.google.com'})
leader.publish_command(1, 'mouse_move', {'x': 100, 'y': 200})
leader.publish_command(1, 'click', {'x': 100, 'y': 200})
leader.publish_command(2, 'mouse_move', {'x': 50, 'y': 50})
leader.publish_command(2, 'click', {'x': 50, 'y': 50})
leader.close()每个跟随者程序启动一个独立的Selenium浏览器实例,并监听消息队列。
# follower.py (概念性代码,需根据实际消息队列库调整)
import json
import pika
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
import time
class Follower:
def __init__(self, browser_id, queue_name='browser_commands'):
self.browser_id = browser_id
# 初始化Selenium WebDriver
options = webdriver.ChromeOptions()
# 可以添加headless模式,或者为每个浏览器设置不同的用户数据目录以完全隔离
# options.add_argument('--headless')
# options.add_argument(f'--user-data-dir=/tmp/chrome-profile-{browser_id}')
self.driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=options)
print(f"Follower {self.browser_id}: Browser initialized.")
# 初始化
消息队列连接
self.connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
self.channel = self.connection.channel()
self.channel.queue_declare(queue=queue_name)
self.queue_name = queue_name
def _execute_command(self, command):
"""根据接收到的指令在浏览器中执行操作。"""
if command['browser_id'] != self.browser_id:
return # 忽略不属于本实例的指令
command_type = command['type']
payload = command['payload']
print(f"Follower {self.browser_id}: Executing {command_type} with payload {payload}")
try:
if command_type == 'navigate':
self.driver.get(payload['url'])
elif command_type == 'mouse_move':
# Selenium的ActionChains模拟鼠标移动到相对页面左上角的坐标
# 注意:这只是将Selenium的内部光标移动到该位置,不影响物理光标
body = self.driver.find_element(By.TAG_NAME, 'body')
ActionChains(self.driver).move_to_element_with_offset(body, payload['x'], payload['y']).perform()
elif command_type == 'click':
# 模拟点击,通常需要先移动到目标位置再点击
body = self.driver.find_element(By.TAG_NAME, 'body')
ActionChains(self.driver).move_to_element_with_offset(body, payload['x'], payload['y']).click().perform()
# 可以添加更多指令类型,如 keyboard_input, find_element_and_click 等
else:
print(f"Follower {self.browser_id}: Unknown command type {command_type}")
except Exception as e:
print(f"Follower {self.browser_id}: Error executing command {command_type}: {e}")
def start_listening(self):
"""开始监听消息队列并处理指令。"""
def callback(ch, method, properties, body):
command = json.loads(body)
self._execute_command(command)
ch.basic_ack(delivery_tag=method.delivery_tag) # 确认消息已处理
self.channel.basic_consume(
queue=self.queue_name,
on_message_callback=callback,
auto_ack=False # 手动确认,确保消息被成功处理
)
print(f"Follower {self.browser_id}: Started listening for commands...")
self.channel.start_consuming()
def close(self):
"""关闭浏览器和消息队列连接。"""
self.driver.quit()
self.connection.close()
print(f"Follower {self.browser_id}: Closed.")
if __name__ == "__main__":
# 启动多个跟随者实例,每个实例在独立的终端或进程中运行
# 例如,在不同的终端分别运行:
# python follower.py 1
# python follower.py 2
import sys
if len(sys.argv) > 1:
browser_id = int(sys.argv[1])
follower = Follower(browser_id)
try:
follower.start_listening()
except KeyboardInterrupt:
print(f"Follower {browser_id}: Shutting down...")
finally:
follower.close()
else:
print("Usage: python follower.py ") 通过采用发布-订阅模式和领导者-跟随者架构,我们能够有效解决在多个独立浏览器中并行执行自动化任务并模拟独立鼠标光标的复杂问题。这种方案将任务生成与执行解耦,提高了系统的灵活性、可扩展性和鲁棒性。开发者可以根据具体需求选择合适的消息队列系统,并结合Selenium WebDriver等工具,构建出高效、可靠的多浏览器并行自动化解决方案。
# python
# redis
# js
# json
# go
# apache
# cookie
# 操作系统
# 浏览器
# 工具
# ai
# 路由
相关文章:
建站之星如何快速生成多端适配网站?
建站10G流量真的够用吗?如何应对访问高峰?
焦点电影公司作品,电影焦点结局是什么?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
如何在阿里云部署织梦网站?
电商网站制作价格怎么算,网上拍卖流程以及规则?
网站按钮制作软件,如何实现网页中按钮的自动点击?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
教学论文网站制作软件有哪些,写论文用什么软件
?
建站主机选虚拟主机还是云服务器更好?
网站微信制作软件,如何制作微信链接?
网站代码制作软件有哪些,如何生成自己网站的代码?
建站之星图片链接生成指南:自助建站与智能设计教程
测试制作网站有哪些,测试性取向的权威测试或者网站?
建站之星如何快速解决建站难题?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
北京企业网站设计制作公司,北京铁路集团官方网站?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
建站之星后台密码如何安全设置与找回?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
香港服务器选型指南:免备案配置与高效建站方案解析
建站主机与虚拟主机有何区别?如何选择最优方案?
建站主机服务器选购指南:轻量应用与VPS配置解析
制作表格网站有哪些,线上表格怎么弄?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
建站之星价格显示格式升级,你的预算足够吗?
安徽网站建设与外贸建站服务专业定制方案
宝塔面板如何快速创建新站点?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
Java解压缩zip - 解压缩多个文件或文件夹实例
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站主机默认首页配置指南:核心功能与访问路径优化
如何在橙子建站上传落地页?操作指南详解
音响网站制作视频教程,隆霸音响官方网站?
宝塔建站助手安装配置与建站模板使用全流程解析
c# 在高并发场景下,委托和接口调用的性能对比
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
如何选择高性价比服务器搭建个人网站?
如何通过虚拟主机快速搭建个人网站?
家具网站制作软件,家具厂怎么跑业务?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
青岛网站建设如何选择本地服务器?
网站制作网站,深圳做网站哪家比较好?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
如何通过万网虚拟主机快速搭建网站?
音乐网站服务器如何优化API响应速度?
深圳网站制作培训,深圳哪些招聘网站比较好?
*请认真填写需求信息,我们会在24小时内与您取得联系。