18910140161

PyQt5 内嵌浏览器注入 Javascript 脚本实现自动化操作

顺晟科技

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 "){

句柄(文档。位置。路径名);

}

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航