您现在的位置是:网站首页 > 博客日记 >

playwright禁用、拦截、替换、嵌入js

作者:YXN-python 阅读量:169 发布日期:2024-06-28

禁用js

context = await browser.new_context(java_script_enabled=False)
# or
page = await browser.new_page(java_script_enabled=False) 

拦截所有js

注意:此事件应该在进入页面之前,也就是要放在 goto 之前

await page.route('**', lambda route: route.continue_() if not route.request.url.endswith('.js') else route.abort())

拦截并替换指定js文件

功能:

  • 拦截指定 js 文件
  • 拦截指定 js 文件,并替换此文件中的指定js代码并重新上传
# 拦截并替换js文件内的代码
@staticmethod
async def intercept_js(route, js, *, js_path=None, js_code=None, new_js_code=None):
    """
    拦截并替换js文件内的代码
    :param route:
    :param js: 需要拦截的js文件名,支持正则
    :param js_path: 如果有替换的本地文件则传入本地的js地址
    :param js_code: 需要替换的js代码
    :param new_js_code: 替换后的js代码
    :return:
    """
    # 使用方法
    # 方法一:拦截js文件,可使用正则
    # await page.route('**', lambda route: intercept_js(route, '需要拦截的js文件名')
    # 方法二:
    # 拦截js文件,并替换此文件中的指定js代码,然后替换为修改后的代码上传
    # await page.route('**', lambda route: intercept_js(route,
    #                                                   '需要拦截的js文件名',
    #                                                   """需要替换掉的js代码""",
    #                                                   '替换后的js代码'))
    # 方法三:
    # 拦截js文件,并将此文件内容替换成本地js
    # await page.route('**', lambda route: intercept_js(route,
    #                                                   '需要拦截的js文件名',
    #                                                   '需要替换的本地文件路径'))

    if all(not var for var in (js_path, js_code, new_js_code)):
        if re.match(r'%s' % js, route.request.url):  # 单独只拦截js
            print('阻止请求:', route.request.url)
            return await route.abort()
        else:
            return await route.continue_()
    if not re.match(r'%s' % js, route.request.url):  # 正常请求
        return await route.continue_()
    else:  # 需要修改js文件并重新上传
        print('修改请求:' + route.request.url)
        if js_path:  # 替换为本地js
            try:
                new_js_content = open(js_path, 'r', encoding='utf-8').read()
            except FileNotFoundError:
                raise FileNotFoundError(f'本地没有找到{js_path}文件')
        else:  # 替换指定js代码
            js_content = requests.get(route.request.url).text
            new_js_content = js_content.replace(js_code, new_js_code)
        await route.fulfill(
            body=new_js_content.encode(),
            headers={'Content-Type': 'application/javascript'}
        )

嵌入js

# 将外部 js 文件嵌入到页面
await page.add_script_tag(url="https://yixiuna.top/js/article.js")

# 也可以使用本地 js 文件
# await page.add_script_tag(path="path/to/your-script.js")

# 执行 js
res = page.evaluate("() => 'Hello World!'", )
# res = page.evaluate("([a, b]) => a+b+'world'", ["hello", 'xx'])  # 带上参数
print(res)  # Hello World!

YXN-python

2024-06-28