PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
概要
应同学邀请,演示如何使用PyQt5内嵌浏览器浏览网页,并注入Javascript脚本实现自动化操作。
下面测试的是一个廉价机票预订网站(http://www.flyscoot.com/),关键点如下
- 使用QWebEngineView加载网页,并显示进度。
- 在默认配置(QWebEngineProfile)中植入Javascript内容,这样脚本会在所有打开的网页中执行,不论跳转到哪个网址。
- Javascript脚本使用网址中的路径名,判断当前网页位置,从而决定执行哪种操作。
python代码示例
#!/usr/bin/envpython3 #-*-coding:utf-8-*- '''使用PyQt5内嵌浏览器浏览网页,并注入Javascript脚本实现自动化操作。''' importos importsys fromdatetimeimportdatetime fromPyQt5.QtWidgetsimport( QWidget,QApplication,QVBoxLayout,QHBoxLayout, QDesktopWidget,QTextEdit,QLabel,QLineEdit,QPushButton, QFileDialog,QProgressBar, ) fromPyQt5.QtCoreimportQUrl,pyqtSlot fromPyQt5.QtWebEngineWidgetsimportQWebEngineView,QWebEngineProfile,QWebEngineScript,QWebEnginePage classBrowser(QWidget): def__init__(self): super().__init__() self.init_ui() #脚本 self.profile=QWebEngineProfile.defaultProfile() self.script=QWebEngineScript() self.prepare_script() definit_ui(self): self.webView=QWebEngineView() self.logEdit=QTextEdit() self.logEdit.setFixedHeight(100) self.addrEdit=QLineEdit() self.addrEdit.returnPressed.connect(self.load_url) self.webView.urlChanged.connect( lambdai:self.addrEdit.setText(i.toDisplayString())) self.jsEdit=QLineEdit() self.jsEdit.setText('inject.js') loadUrlBtn=QPushButton('加载') loadUrlBtn.clicked.connect(self.load_url) chooseJsBtn=QPushButton('选择脚本文件') chooseJsBtn.clicked.connect(self.choose_js_file) #导航/工具 top=QWidget() top.setFixedHeight(80) topBox=QVBoxLayout(top) topBox.setSpacing(0) topBox.setContentsMargins(5,0,0,5) progBar=QProgressBar() progBox=QHBoxLayout() progBox.addWidget(progBar) topBox.addLayout(progBox) naviBox=QHBoxLayout() naviBox.addWidget(QLabel('网址')) naviBox.addWidget(self.addrEdit) naviBox.addWidget(loadUrlBtn) topBox.addLayout(naviBox) naviBox=QHBoxLayout() naviBox.addWidget(QLabel('注入脚本文件')) naviBox.addWidget(self.jsEdit) naviBox.addWidget(chooseJsBtn) topBox.addLayout(naviBox) self.webView.loadProgress.connect(progBar.setValue) #主界面 layout=QVBoxLayout(self) layout.addWidget(self.webView) layout.addWidget(top) layout.addWidget(self.logEdit) self.show() self.resize(1024,900) self.center() defcenter(self): qr=self.frameGeometry() cp=QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) @pyqtSlot() defload_url(self): url=self.addrEdit.text().strip() ifnoturl.lower().startswith('http://')\ andnoturl.lower().startswith('https://'): url='http://{}'.format(url) self.load(url) @pyqtSlot() defchoose_js_file(self): f,_=QFileDialog.getOpenFileName(filter="Javascriptfiles(*.js)") ifos.path.isfile(f): self.jsEdit.setText(f) self.prepare_script() defprepare_script(self): path=self.jsEdit.text().strip() ifnotos.path.isfile(path): self.log('invalidjspath') return self.profile.scripts().remove(self.script) withopen(path,'r')asf: self.script.setSourceCode(f.read()) self.profile.scripts().insert(self.script) self.log('injectedjsready') deflog(self,msg,*args,**kwargs): m=msg.format(*args,**kwargs) self.logEdit.append('{}{}'.format( datetime.now().strftime('%H:%M:%S'),m)) defload(self,url): self.log(f'loading{url}') self.addrEdit.setText(url) self.webView.load(QUrl(url)) if__name__=='__main__': app=QApplication(sys.argv) b=Browser() b.load('http://www.flyscoot.com/') sys.exit(app.exec_())
Javascript脚本示例
//简单起见,这里只演示部分页面,脚本内容摘自Heng丶原贴文。 functionhandle(path){ //首页 if(path=='/zh'){ document.getElementsByClassName('radio-inline')[1].click(); document.getElementById('oneway_from').value='广州(CAN)'; document.getElementById('oneway_to').value='新加坡(SIN)'; document.getElementById('oneway_departuredate').value='2018年9月10日'; document.getElementsByClassName('btn--booking')[1].click(); return; } //选择航班 if(path=='/Book/Flight'){ document.getElementsByClassName('price--sale')[0].click(); document.getElementsByClassName('heading-4')[0].click(); document.getElementsByClassName('btn-submit')[0].click(); return; } //乘客信息 if(path=='/BookFlight/Passengers'){ document.getElementsByClassName('fname1')[0].value="匿名"; } } lethost=document.location.hostname; if(host.endsWith('.flyscoot.com')){ handle(document.location.pathname); }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接