能否用Python+Selenium/Selenium-wire实现异步嵌入代码替换?
实现Adobe Experience Platform标签脚本的自动化替换(用于测试)
完全可行,请求拦截器就是这类场景的标准解决方案,能在请求发送前修改脚本的源地址,完美适配自动化测试需求。下面是主流自动化测试工具的具体实现方式:
Playwright 实现方式
Playwright自带请求拦截API,能精准命中目标脚本并替换URL:
const { chromium } = require('playwright'); (async () => { const browser = await chromium.launch(); const page = await browser.newPage(); // 拦截所有符合特征的Adobe Launch脚本请求 await page.route('**://assets.adobedtm.com/**/launch-*.min.js', route => { // 替换成你的目标脚本地址 const modifiedUrl = 'https://your-custom-domain.com/your-custom-launch-script.min.js'; route.continue({ url: modifiedUrl }); }); await page.goto('https://your-target-page.com'); // 这里写你的测试逻辑 await browser.close(); })();
用**://assets.adobedtm.com/**/launch-*.min.js作为匹配规则,能精准定位原脚本,避免误改其他资源。
Cypress 实现方式
Cypress的cy.intercept()专门用来处理请求拦截,还能直接验证替换结果:
describe('替换Adobe Launch脚本', () => { it('修改脚本源地址并验证', () => { // 拦截目标脚本请求并修改URL cy.intercept('GET', '**://assets.adobedtm.com/**/launch-*.min.js', (req) => { req.url = 'https://your-custom-domain.com/your-custom-launch-script.min.js'; }); cy.visit('https://your-target-page.com'); // 可选:验证修改后的脚本是否成功加载 cy.get('script[src="https://your-custom-domain.com/your-custom-launch-script.min.js"]').should('exist'); }); });
Selenium 实现方式
Selenium本身没有内置请求拦截,但可以通过Chrome DevTools Protocol(CDP)实现:
from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() driver = webdriver.Chrome(options=options) # 启用CDP网络功能 driver.execute_cdp_cmd('Network.enable', {}) # 设置请求拦截规则 def handle_intercept(request): req_url = request['request']['url'] # 判断是否是目标Adobe Launch脚本 if 'assets.adobedtm.com' in req_url and 'launch-' in req_url and req_url.endswith('.min.js'): modified_url = 'https://your-custom-domain.com/your-custom-launch-script.min.js' # 修改URL后继续请求 driver.execute_cdp_cmd('Network.continueInterceptedRequest', { 'interceptionId': request['interceptionId'], 'url': modified_url }) else: # 其他请求正常放行 driver.execute_cdp_cmd('Network.continueInterceptedRequest', { 'interceptionId': request['interceptionId'] }) # 开启请求拦截,只拦截脚本类资源 driver.execute_cdp_cmd('Network.setRequestInterception', { 'patterns': [{'urlPattern': '*', 'resourceType': 'Script', 'interceptionStage': 'HeadersReceived'}] }) # 监听拦截事件 driver.add_event_listener('Network.requestIntercepted', handle_intercept) driver.get('https://your-target-page.com') # 后续测试逻辑... driver.quit()
注意事项
- 匹配规则要精准:优先结合原脚本的域名
assets.adobedtm.com和文件名特征launch-*.min.js,避免误改其他脚本。 - 等待脚本加载:如果测试逻辑依赖替换后的脚本,记得用工具的等待API(比如Playwright的
page.waitForRequest、Cypress的cy.wait())确保脚本加载完成。 - 跨域问题:如果目标脚本域名和测试页面域名不同,要确保测试环境允许跨域,或者在工具里配置跨域支持。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

