Python如何调用js函数?

2023-10-27

一.概述

	测试web前端、前端SDK、web渗透流程等时,难免会需要调用前端js里面自定义的方法。
	那么该如何用python编写脚本去调用js文件里面的函数呢?
	这里将以SDK的调用为例,提供一些解决方法,供大家参考!

【方法一】
自主研发:直接用前端开发语言来研发SDK的测试demo。(缺点:对技术要求较高,对js不熟悉的我就不多言语了。)

【方法二】
Python+Selenium: 这个一般被用来做UI自动化。selenium可以通过定位元素的方式来模拟用户在界面上的点击操作,从而实现自动化测试。除此之外,它还可以直接调用js文件的函数,通过浏览器驱动的execute_script方法来完成。

【方法三】
**Python+Pyexecjs: PyExecJS库相当于js的引擎,在Windows上默认有个JScript库,可以直接运行execjs。**不同的操作系统依赖不同的执行环境,PyExecJS库提供了JScript、Node、PhantomJS环境,可以根据情况进行配置。Python就是通过这个引擎来执行js函数的。

下面我将重点跟大家讲解下第三种方法!

二.环境准备

1.Python开发环境:部署安装省略。
2.安装PyExecJS模块
(1)推荐:pip install pyexecjs
(2)到官网下载安装包,进行安装。(https://pypi.org/project/PyExecJS/)
(3)推荐:直接通过开发工具安装第三方依赖库。

三.调用方法/步骤

1.引入模块的库名:import execjs
2.引入需要被调用的js文件:建议放置于python文件的同级目录。
3.Python调用过程:
(1)打开并读取js文件(注意编码格式)
rFile = open("./static/js/test.js", 'r', encoding='UTF-8')

(2)通过execjs库加载并编译js文件
testResult = execjs.compile(rFile.read()).call('test')

(3)方法解说
eval()
输入参数:source(JS语句)、cwd(路径)
返回值:result(语句执行结果)
compile()
输入参数:source(JS语句)、cwd(路径)
返回值:编译后的对象
call()
输入参数:name(要调用的JS方法名称)、*args(方法所需要的参数,可多个)
返回值:result(运行方法的返回结果)

四.Demo演示基础版

# -*- coding:utf-8 -*-
from selenium import webdriver

import os,sys,io,time
import execjs

# #执行本地的js
# def get_js():
#     # D:\Pycharm\PycharmProjects\SDKTestDemo\demo\static\js
#     f = open("./static/js/test.js", 'r', encoding='utf-8')
#     jsstr = f.read()
#     line = f.readline()
#     htmlstr = ''
#     while line:
#         htmlstr = htmlstr + line
#         line = f.readline()
#         print(htmlstr)
#     return htmlstr
#     # return jsstr

def login(driver,url):
  # 通过驱动不同的浏览器:需要安装对应的驱动版本
  driver = webdriver.Chrome()
  driver.maximize_window()
  time.sleep(1)
  url = "https://liveweb.haoshitong.com:8080/demo/index.html?uri=85AcOKEaS"
  driver.get(url)
  time.sleep(3)

def testPy():
  print('当前目录是:', os.getcwd())
  rFile = open("./static/js/test.js", 'r', encoding='UTF-8')
  testResult = execjs.compile(rFile.read()).call('test')
  print(testResult)


if __name__ == '__main__':
    #运行环境:JScript,Node,PhantomJS
    os.environ["EXECJS_RUNTIME"] = "Node"
    testPy()

执行结果

五.常见问题

1.无Windows目录?
2.没有Windows对象?找不到某个属性?
解决方法:
解决方案
在js文件的头部添加如下代码:

const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
window = dom.window;
document = window.document;
location = window.location;
XMLHttpRequest = window.XMLHttpRequest;

3.找不到路径?
4.中文出现乱码?
在这里插入图片描述
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding=‘gb18030’)

5.在windows环境运行存在gbk编码报错问题,错误信息:
“UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xa9’ in position 75879: illegal multibyte sequence”
在这里插入图片描述
解决方法:
将python的Lib库subprocess.py文件中的586初始化函数的参数:encoding=None改成:encoding="utf-8"
演示图

6.未定义的错误
【错误1】execjs._exceptions.ProgramError: ReferenceError: navigator is not defined
【错误2】execjs._exceptions.ProgramError: TypeError: Cannot read property ‘userAgent’ of undefined
在这里插入图片描述
解决方法:
在这里插入图片描述
在js文档头部添加如下代码:

global.navigator={
userAgent: 'node.js',
};

8.函数名未定义错误,报错信息:execjs._exceptions.ProgramError: ReferenceError: getUsingSignup is not defined
在这里插入图片描述

六.深入了解(待更新)

1.如何调用第三方封装好的函数?
2.如何调用SDK?
3.存在多个依赖文件时,如何引用调用?
4.Js中的变量被加密后,python如何解析?

七.参考资料

官方说明: https://pypi.org/project/PyExecJS/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python如何调用js函数? 的相关文章

  • 如何将多种语言设置放入单个 .clang-format 文件中

    我想为 java javascript 和 c 创建一个 clang 格式 我知道如何转储单一语言的示例配置 但不知道如何合并这 3 个配置文件 有关如何将多种语言配置放入单个文件中的示例 BasedOnStyle LLVM IndentW
  • 使用 BeautifulSoup 查找 html 中的所有表

    我想使用 BeautifulSoup 查找 html 中的所有表格 内部表应包含在外部表中 我创建了一些有效的代码 并且它给出了预期的输出 但是 我不喜欢这个解决方案 因为它使用 decompose 这会破坏 汤 对象 你知道如何以更优雅的
  • 如何为python虚拟环境设置特定的python版本? [复制]

    这个问题在这里已经有答案了 我是 python 的新手 我正在尝试为我的项目添加一个新环境 该环境在我当前的环境 Python 3 7 5 上运行良好 添加所有依赖项后 我遇到了 pyttsx3 包的问题 用于 python 文本到语音 进
  • 尝试使用 Paramiko 通过 SSH 连接到新的 EC2 实例时出现问题

    我正在编写一个脚本 该脚本使用 boto 启动一个新的 EC2 实例 并使用 Paramiko SSH 客户端在该实例上执行远程命令 无论出于何种原因 Paramiko 客户端无法连接 我收到错误 Traceback most recent
  • 基本的 Swing 库? JGoodies,JFreeChart [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 什么是对象发布以及为什么我们需要它?

    在一次 Java 开发人员面试中 我被问到一个问题 什么是对象发布以及为什么我们需要它 我不确定我知道正确的答案 我认为对象发布是指将对象 变量 状态放入堆内存中 线程之间共享对象 变量 需要它 我对吗 如果我错了 请纠正我 我一直在搜索
  • java.util.Prefs 抛出 BackingStoreException - 为什么?

    我有一个系统可以缓存启动时 SOAP 调用的微小 简单结果 我需要实例能够在启动时重新加载其缓存 以防 SOAP 服务失效 并且还需要处理使用此缓存文件的多个实例的可能性 我选择使用java util prefs但是 Java 的内置自动同
  • 覆盖 Autobahn/Twisted WebsocketClientProtocol 类

    我想重写我的 WebSocketClientFactory 类以允许传入数据填充作业队列 这是我正在尝试的连接代码 factory WebSocketClientFactory ws localhost 7096 job queue Que
  • 使用 Spring Boot 应用程序属性设置 tomcat 属性

    我想为启动提供的 tomcat 设置 maxSwallowSize 属性 我的 application properties 有这一行 server context parameters maxSwallowSize 20971520 由于
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r
  • Gradle:找不到受信任的证书

    我正在尝试使用 Gradle 在 Ubuntu 服务器上构建我的 Android 项目 在我的 Windows 10 PC 上使用 Android Studio 构建工作正常 但使用 gradlew build or gradlew cle
  • functools.partial 想要使用位置参数作为关键字参数

    所以我试图理解partial import functools def f x y print x y g0 functools partial f 3 g0 1 4 Works as expected In g1 functools pa
  • 在标准 python 线程中发出信号

    我有一个线程应用程序 其中有一个网络线程 UI 部分通过callback到这个线程 线程是一个normalpython 线程 它是NO QThread 是否可以在该线程内发出 PyQT Slot 不 不可能像这样从 python 线程发出
  • 在Java中解析包含multipart/form-data请求体的字符串

    问题陈述 我认为标题说明了一切 我正在寻找解析 a 的方法String包含 multipart form data HTTP 请求的正文部分 IE 字符串的内容看起来像这样 xyzseparator blah Content Disposi
  • 从邮件服务器读取发送的邮件

    我知道如何从 INBOX 文件夹中检索邮件 但现在我想从 SENT ITEMS 文件夹中检索邮件 我正在使用 imap 检索数据 让我知道我应该在此函数中传递什么参数才能从 SENT ITEMS 文件夹中获取邮件Folder folder
  • XStream:xstream 1.3.1 中具有属性和文本节点的节点?

    我想使用 XStream 将对象序列化为这种形式的 XML
  • 使用 NumPy 函数计算 Pandas 的加权平均值

    假设我们有一个像这样的 pandas 数据框 a b id 36 25 2 40 25 3 46 23 2 40 22 5 42 20 5 56 39 3 我想执行一个操作 a div b 然后按 id 分组 最后使用 a 作为权重计算加权
  • JavaFX - 当文本字段具有焦点时加速器不工作

    在我的应用程序中 我有一个使用加速器的屏幕 我正在使用功能键 F3 在我的应用程序中执行操作 它每次都工作正常 但是当我单击此屏幕上的任何文本字段时 功能键不会执行 这是我设置加速器的代码 scene getAccelerators put
  • 使用 Vaadin 生成 HTML 速度缓慢

    我是一个有问题的开发人员 目前我们的项目 使用 Vaadin 即将结束 但是 我们在其中一个视图中显示简单数据时遇到了一些麻烦 Vaadin 完成生成后 需要显示超过 500 KB 的数据 以及超过 15K 的 DOM 元素 在完成之前需要
  • 使用 pytz 获取时区的国家/地区代码?

    我在用着pytz http pytz sourceforge net country information 我已经阅读了整个文档表 但没有看到如何做到这一点 我有一个时区 美国 芝加哥 我想要的只是获取该时区的相应国家 地区代码 美国 它

随机推荐

  • Keepalived 配置手册

    官网 https www keepalived org manpage html 1 描述 keepalived conf 是描述所有Keepalived关键字的配置文件 关键字放在块和子块的层次结构中 每一层由 和 对分隔 注释以 或 到
  • 目标检测中的回归损失函数系列二:IoU Loss

    IOU Loss 出自论文 https arxiv org pdf 1608 01471 pdf L1 和L2 loss是将bbox四个点分别求loss然后相加 并没有考虑靠坐标之间的相关性 而实际评价指标IOU是具备相关性 看一张图关注I
  • python实现-从带层级的json到markdown无序列表的父子关系的转换

    带层级的json到无序列表的父子关系的转换 从带层级的json到无序列表的父子关系的转换 总结 python中 with的用法一定要跟 as 结合在一起吗 顺便也说下 as 的用法吧 从带层级的json到无序列表的父子关系的转换 首先 我们
  • Timequest Timing Analyzer进行时序分析(二)

    四 用TimeQuest对DAC7512控制器进行时序分析 在对某个对象下时序约束的时候 首先要能正确识别它 TimeQuest会对设计中各组成部分根据属性进行归类 我们在下时序约束的时候 可以通过命令查找对应类别的某个对象 TimeQue
  • 实例解析C++/CLI之接口与泛型

    实例解析C CLI 之接口与泛型 接口 某些时候 让不相关的类分享一组公有成员 以便产生相同的行为 是非常有用的 一个最基本的方法可能是通过一个公共的基类来定义它们 但这种方法太受局限 因为它要求这些类通过继承而互相关联 另外 它们也许还有
  • 又一个大雷引发市场巨震?Silvergate或将跌落:成也加密败也加密?

    这是白话区块链的第1874期原创 作者 Terry出品 白话区块链 ID hellobtc 3月1日 加密友好银行集团 Silvergate Capital布将推迟提交其年度 10 K 报告 10 K 报告是美国证券交易委员会要求的一份文件
  • PPPoE工作流程

    PPPoE 英语 Point to Point Protocol Over Ethernet 以太网上的点对点协议 是将点对点协议 PPP 封装在以太网 Ethernet 框架中的一种网络隧道协议 PPPoE协议及其工作过程 PPPoE的工
  • 【游戏杂记】Rgss3a文件的解包

    Rgss3a文件的解包 在RPG游戏中 如果想提取图片音乐等资源 需要对文件进行解包 这里是解包工具的链接 链接 https pan baidu com s 1 UKyetIHGsw1ibOHFLHUMQ pwd 5422 提取码 5422
  • 转载:Run-Time Check Failure #2分析

    文章出处 http hi baidu com D6 BB D3 B0 C1 F7 C0 CB blog item 0d72bcb477b2bbc236d3cad4 html Run Time Check Failure 2 一般是栈被破坏
  • 34 个 常用 Linux Shell 脚本,运维必备!

    作为一名 Linux 工程师 会写好的脚本不仅能提高工作效率 还能有更多的时间做自己的事 最近在网上冲浪的时候 也注意收集一些大佬写过的脚本 汇总整理一下 欢迎收藏 与君共勉 1 用户猜数字 bin bash 脚本生成一个 100 以内的随
  • 【力扣】两数之和-java

    思路是 两个循环套用 刚刚开始的时候想判断里面数小于目标值 这样遍历的次数会少 后面发现当数组中为负数的时候 if方法失效 判断了负数 后面发现数据中有两个0失效 判断了0 后面发现如果数据中有正有负 方法失效 public int two
  • 2021-08-30爬取网页信息并转成DataFrame

    导入包 from urllib request import urlopen Request from chardet import detect from bs4 import BeautifulSoup import re import
  • Spring多线程事务解决方案

    Spring多线程事务解决方案 多线程事务场景以及解决思路 代码实现 工具类使用演示 效果展示 多线程事务场景以及解决思路 多线程事务场景举例 对批量操作进行性能优化时会用到多线程来并行处理 从而提高运行效率 而时有业务要求保证批量操作事务
  • 如何在SOLIDWORKS中实现装配体缩放

    缩放比例功能 通过选择 插入 gt 功能 gt 缩放比例 可以找到 可用于更改单个零件中所有功能的比例 使用时 此工具在功能树中显示为附加功能 但是 此功能仅限于零件 sldprt 文件使用 您如何缩放SOLIDWORKS装配体 标SOLI
  • 解决运行flutter doctor --android-licenses时报错

    问题描述 配置flutter环境时 会使用flutter doctor命令来检查运行flutter的相关依赖是否配好 能看到还差 Android license status unknown 未解决 C Users ipkiss wu gt
  • 5 个最令人兴奋的 ES13 功能

    ES13 ECMAScript 2022 已经发布很久了 并且更新了许多有用的功能 在这篇文章中 我想与大家分享 5 种我最喜欢的技术 这些技术是我已经开始在工作中实施的 1 顶级await await 是我最喜欢的功能 因为它使我的代码显
  • python调用m文件

    系统环境 windows 64bit matlab 2018b 64bit python3 6 前提 windows下需要有matlab软件和python python调用m文件需要安装matlab engine 注意matlab版本与py
  • 类模板下运算符重载的两种用法

    1 template
  • java编写定时器,定时执行某个方法

    第一步 编写测试类 该类extends TimerTask 重新run 方法 run方法里面就是你要执行的逻辑代码 示例如下 import java text SimpleDateFormat import java util Date i
  • Python如何调用js函数?

    Python如何调用SDK的js函数 一 概述 二 环境准备 三 调用方法 步骤 四 Demo演示基础版 五 常见问题 六 深入了解 待更新 七 参考资料 一 概述 测试web前端 前端SDK web渗透流程等时 难免会需要调用前端js里面