顺晟科技
2021-06-16 10:58:44
512
概要
应同学邀请,演示如何使用PyQt5内嵌浏览器浏览网页,并注入爪哇岛描述语言脚本实现自动化操作。
医务主任原贴地址:如何在计算机编程语言利用运行Java Script语言模拟鼠标移动页面的某个元素
https://segmentfault.com/q/10.
下面测试的是一个廉价机票预订网站(http://www.flyscoot.com/),关键点如下
使用QWebEngineView加载网页,并显示进度。
在默认配置(QWebEngineProfile)中植入爪哇岛描述语言内容,这样脚本会在所有打开的网页中执行,不论跳转到哪个网址。
爪哇岛描述语言脚本使用网址中的路径名,判断当前网页位置,从而决定执行哪种操作。
大蟒代码示例
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''使用PyQt5内嵌浏览器浏览网页,并注入爪哇岛描述语言脚本实现自动化操作。'''
导入操作系统
导入系统
从日期时间导入日期时间
来自PyQt5 .QtWidgets导入(
QWidget,QApplication,QVBoxLayout,QHBoxLayout,
QDesktopWidget、QTextEdit、QLabel、QLineEdit、QPushButton、
QFileDialog,QProgressBar,
)
来自PyQt5 .QtCore导入QUrl,pyqtSlot
来自PyQt5 .QtWebEngineWidgets导入QWebEngineView,QWebEngineProfile,QWebEngineScript,QWebEnginePage
班级浏览器(QWidget):
def __init__(self):
超级()。__init__()
self.init_ui()
# 脚本
自我。profile=QWebengineprofile。Defaultprofile()
self.script=QWebEngineScript()
self.prepare_script()
def init_ui(self):
self.webView=QWebEngineView()
self.logEdit=QTextEdit()
自我。LogEdit。设置固定高度(100)
self.addrEdit=QLineEdit()
自我。addredit。按回车键。连接(自我。加载(_ URL)
自我。WebView。urlChanged。连接(
lambda I : self。Addredit。SetText(I . TodisPlayString()))
self.jsEdit=QLineEdit()
self.jsEdit.setText('inject.js ')
loadUrlBtn=QPushButton('加载)
loadurlbtn。点击。连接(自我。加载(_ URL)
chooseJsBtn=QPushButton('选择脚本文件)
choosejsbtn。点击。连接(自我。选择_ js _ file)
# 导航/工具
top=QWidget()
top.setFixedHeight(80)
topBox=QVBoxLayout(顶部)
topBox.setSpacing(0)
topBox.setContentsMargins(5,0,0,5)
progBar=QProgressBar()
progBox=QHBoxLayout()
progBox.addWidget(progBar)
topBox.addLayout(progBox)
naviBox=QHBoxLayout()
naviBox.addWidget(QLabel('网址'))
纳维盒子。AddWidget(自。Addredit)
naviBox.addWidget(loadUrlBtn)
topBox.addLayout(导航框)
naviBox=QHBoxLayout()
naviBox.addWidget(QLabel('注入脚本文件'))
naviBox.addWidget(self.jsEdit)
naviBox.addWidget(chooseJsBtn)
topBox.addLayout(导航框)
自我。WebView。LoadProgress。连接(ProgBar。SetValue)
# 主界面
布局=Qvbox布局(自)
layout.addWidget(self.webView)
layout.addWidget(顶部)
layout.addWidget(self.logEdit)
self.show()
自行调整大小(1024,900)
self.center()
def center(self):
qr=self.frameGeometry()
cp=QDesktopWidget().可用性度量()。中心()
qr.moveCenter(cp)
self.move(qr.topLeft())
@pyqtSlot()
def load_url(self):
url=self.addrEdit.text().条状()
如果不是url.lower().startswith('http://') \
而不是url.lower().开始于(' https://'):
url='http://{} ' .格式(url)
self.load(url)
@pyqtSlot()
def choose_js_file(self):
f,_=QfileDialog。GetOpenfilename(filter=' JavaScript文件(* .js)’)
if os.path.isfile(f):
self.jsEdit.setText(f)
self.prepare_script()
def prepare_script(self):
path=self.jsEdit.text().条状()
如果不是os.path.isfile(路径):
self.log('无效的射流研究…路径)
返回
self.profile.scripts().移除(self.script)
打开(路径,“r”)为f:
自我。剧本。SetSourceCode(f . read())
self.profile.scripts().插入(self.script)
self.log('注入射流研究…就绪)
极好的日志(self,msg,*args,**kwargs):
m=msg.format(*args,**kwargs)
self.logEdit.append('{} {} ').格式(
datetime.now().字符串时间(' % H :% M :% S '),M))
极好的加载(自身,url):
self.log(f'loading {url} ')
self.addrEdit.setText(url)
self.webView.load(QUrl(url))
if __name__=='__main__':
app=qaapplication(sys。argv)
b=浏览器()
b.load('http://www.flyscoot.com/')
sys.exit(app.exec_())
爪哇岛描述语言脚本示例
//简单起见,这里只演示部分页面,脚本内容摘自恒丶原贴文。
函数句柄(路径){
//首页
if (path=='/zh') {
文件。GetElementsByclassname(' radio-inline ')[1].click();
文件。GetElementBYID('单向_ from ').值='广州(CAN)’;
文件。GetElementBYID('单向_到').值='新加坡(SIN)’;
文件。GetElementbyID('单程_出发日期').value='2018年9月10日;
文件。GetElementsByclassname(' BTN-预订')[1].click();
返回;
}
//选择航班
if (path=='/Book/Flight') {
文件。getelementsbyclassname(' price-sale ')[0].click();
文件。GetElementsByclassname(' heading-4 ')[0].click();
文件。GetElementsByclassname(' BTN-提交')[0].click();
返回;
}
//乘客信息
if(path=='/book flight/peoples '){
文件。GetElementsByclassname(' fname 1 ')[0].值='匿名;
}
}
let host=document。位置。主机名;
if(主机。endswith('。快跑。com "){
句柄(文档。位置。路径名);
}
17
2023-03
21
2022-06
21
2022-06
16
2021-06
16
2021-06
16
2021-06