PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
程序员文章站
2022-06-11 19:27:04
概要
应同学邀请,演示如何使用 pyqt5 内嵌浏览器浏览网页,并注入 javascript 脚本实现自动化操作。
下面测试的是一个廉价机票预订网站(),关键点如下...
概要
应同学邀请,演示如何使用 pyqt5 内嵌浏览器浏览网页,并注入 javascript 脚本实现自动化操作。
下面测试的是一个廉价机票预订网站(),关键点如下
- 使用 qwebengineview 加载网页,并显示进度。
- 在默认配置(qwebengineprofile)中植入 javascript 内容,这样脚本会在所有打开的网页中执行,不论跳转到哪个网址。
- javascript 脚本使用网址中的路径名,判断当前网页位置,从而决定执行哪种操作。
python 代码示例
#!/usr/bin/env python3 # -*- coding: utf-8 -*- '''使用 pyqt5 内嵌浏览器浏览网页,并注入 javascript 脚本实现自动化操作。''' import os import sys from datetime import datetime from pyqt5.qtwidgets import ( qwidget, qapplication, qvboxlayout, qhboxlayout, qdesktopwidget, qtextedit, qlabel, qlineedit, qpushbutton, qfiledialog, qprogressbar, ) from pyqt5.qtcore import qurl, pyqtslot from pyqt5.qtwebenginewidgets import qwebengineview, qwebengineprofile, qwebenginescript, qwebenginepage class browser(qwidget): def __init__(self): super().__init__() self.init_ui() # 脚本 self.profile = qwebengineprofile.defaultprofile() self.script = qwebenginescript() self.prepare_script() def init_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( lambda i: 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() def center(self): qr = self.framegeometry() cp = qdesktopwidget().availablegeometry().center() qr.movecenter(cp) self.move(qr.topleft()) @pyqtslot() def load_url(self): url = self.addredit.text().strip() if not url.lower().startswith('http://') \ and not url.lower().startswith('https://'): url = 'http://{}'.format(url) self.load(url) @pyqtslot() def choose_js_file(self): f, _ = qfiledialog.getopenfilename(filter="javascript files(*.js)") if os.path.isfile(f): self.jsedit.settext(f) self.prepare_script() def prepare_script(self): path = self.jsedit.text().strip() if not os.path.isfile(path): self.log('invalid js path') return self.profile.scripts().remove(self.script) with open(path, 'r') as f: self.script.setsourcecode(f.read()) self.profile.scripts().insert(self.script) self.log('injected js ready') def log(self, msg, *args, **kwargs): m = msg.format(*args, **kwargs) self.logedit.append('{} {}'.format( datetime.now().strftime('%h:%m:%s'), m)) def load(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丶原贴文。 function handle(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 = "匿名"; } } let host = document.location.hostname; if (host.endswith('.flyscoot.com')) { handle(document.location.pathname); }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
上一篇: supervisor4.1.0 安装 和 配置备忘教程
下一篇: Oracle锁表 解锁sql