是否可以在自制的网络应用程序中单击?
Is it possible to click inside a self made web app?
我创建了一个 PyQt5 网络应用程序,它使用以下代码导航到 https://www.google.com/:
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWebEngineWidgets import *
import sys
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("My Window")
self.browser = QWebEngineView()
self.browser.setUrl( QUrl("www.google.com") )
self.setCentralWidget(self.browse)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
我的想法是我想在应用程序内部操纵点击,因此在 google 站点上,例如:将鼠标移动到特定位置(x,y),而不影响 PC 本身,例如pyautogui 可以,这意味着我可以 运行 一段代码在网络应用程序中随机点击,同时我能够在 PC 上做正常的事情,而不 影响 鼠标。
我很高兴知道这是否可能。如果是,怎么办?
注:我真的没有 python
的经验
除非它是嵌入式应用程序,否则您始终可以解析 html、搜索按钮和 "click" 按钮,方法是请求它要经过的路径或 javascript 解析器。
代码 api 之后看起来像
parsed_response.find(my_button).click()
如果你不坚持自己写的话,已经有一个了,selenium
。
举个小例子
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("www.website.com")
login_input = driver.find_element_by_id(id)
login_input.send_keys(my_login)
login_input.send_keys(Keys.ENTER)
# Or you can do something like
# submit_button = driver.find_element_by_id(submitbutton)
# submit_button.click()
selenium 的力量是巨大的,但我在回答有关 web-scraping 的问题时总是将其添加为注释。请在实际使用该站点与您的 bot 之前检查 /robots.txt。
您可以通过发送 QMouseEvent 来模拟点击,在 QWebEngineView 的情况下,点击应该被发送到一个内部小部件,它是私有 Qt 的一部分 API 但是可以访问一个小逻辑:使用findChildren 和 QMetaObject。
在下面的示例中,单击位置 400、200,在我的例子中是 google 横幅,将打开相应的信息。
import sys
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setWindowTitle("My Window")
self.browser = QtWebEngineWidgets.QWebEngineView()
self.browser.setUrl(QtCore.QUrl("https://www.google.com/"))
self.setCentralWidget(self.browser)
self.browser.loadFinished.connect(self.on_loadFinished)
@QtCore.pyqtSlot(bool)
def on_loadFinished(self, ok):
if not ok:
return
w = None
for child in self.browser.findChildren(QtWidgets.QWidget):
if (
child.metaObject().className()
== "QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget"
):
w = child
break
if w is not None:
self.emulate_click(w, QtCore.QPoint(400, 200))
def emulate_click(self, widget, pos):
event_press = QtGui.QMouseEvent(
QtCore.QEvent.MouseButtonPress,
pos,
QtCore.Qt.LeftButton,
QtCore.Qt.LeftButton,
QtCore.Qt.NoModifier,
)
QtCore.QCoreApplication.postEvent(widget, event_press)
event_release = QtGui.QMouseEvent(
QtCore.QEvent.MouseButtonRelease,
pos,
QtCore.Qt.LeftButton,
QtCore.Qt.LeftButton,
QtCore.Qt.NoModifier,
)
QtCore.QCoreApplication.postEvent(widget, event_release)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())
如果您有更多信息,例如 id 或 xpath,您可以单击使用 javascript:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setWindowTitle("My Window")
self.browser = QtWebEngineWidgets.QWebEngineView()
self.browser.setUrl(QtCore.QUrl("https://www.google.com/"))
self.setCentralWidget(self.browser)
self.browser.loadFinished.connect(self.on_loadFinished)
@QtCore.pyqtSlot(bool)
def on_loadFinished(self, ok):
if not ok:
return
xpath = r"//body[@id='gsr']/div[@id='viewport']/div[@id='main']/span[@id='body']/center/div[@id='lga']/div[@id='hplogo']/a/img[1]"
s = (
"""
(function() {
var banner = document.evaluate("%s", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
banner.click()
})()"""
% xpath
)
self.browser.page().runJavaScript(s)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())
我创建了一个 PyQt5 网络应用程序,它使用以下代码导航到 https://www.google.com/:
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWebEngineWidgets import *
import sys
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("My Window")
self.browser = QWebEngineView()
self.browser.setUrl( QUrl("www.google.com") )
self.setCentralWidget(self.browse)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
我的想法是我想在应用程序内部操纵点击,因此在 google 站点上,例如:将鼠标移动到特定位置(x,y),而不影响 PC 本身,例如pyautogui 可以,这意味着我可以 运行 一段代码在网络应用程序中随机点击,同时我能够在 PC 上做正常的事情,而不 影响 鼠标。
我很高兴知道这是否可能。如果是,怎么办?
注:我真的没有 python
的经验除非它是嵌入式应用程序,否则您始终可以解析 html、搜索按钮和 "click" 按钮,方法是请求它要经过的路径或 javascript 解析器。
代码 api 之后看起来像
parsed_response.find(my_button).click()
如果你不坚持自己写的话,已经有一个了,selenium
。
举个小例子
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("www.website.com")
login_input = driver.find_element_by_id(id)
login_input.send_keys(my_login)
login_input.send_keys(Keys.ENTER)
# Or you can do something like
# submit_button = driver.find_element_by_id(submitbutton)
# submit_button.click()
selenium 的力量是巨大的,但我在回答有关 web-scraping 的问题时总是将其添加为注释。请在实际使用该站点与您的 bot 之前检查 /robots.txt。
您可以通过发送 QMouseEvent 来模拟点击,在 QWebEngineView 的情况下,点击应该被发送到一个内部小部件,它是私有 Qt 的一部分 API 但是可以访问一个小逻辑:使用findChildren 和 QMetaObject。
在下面的示例中,单击位置 400、200,在我的例子中是 google 横幅,将打开相应的信息。
import sys
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setWindowTitle("My Window")
self.browser = QtWebEngineWidgets.QWebEngineView()
self.browser.setUrl(QtCore.QUrl("https://www.google.com/"))
self.setCentralWidget(self.browser)
self.browser.loadFinished.connect(self.on_loadFinished)
@QtCore.pyqtSlot(bool)
def on_loadFinished(self, ok):
if not ok:
return
w = None
for child in self.browser.findChildren(QtWidgets.QWidget):
if (
child.metaObject().className()
== "QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget"
):
w = child
break
if w is not None:
self.emulate_click(w, QtCore.QPoint(400, 200))
def emulate_click(self, widget, pos):
event_press = QtGui.QMouseEvent(
QtCore.QEvent.MouseButtonPress,
pos,
QtCore.Qt.LeftButton,
QtCore.Qt.LeftButton,
QtCore.Qt.NoModifier,
)
QtCore.QCoreApplication.postEvent(widget, event_press)
event_release = QtGui.QMouseEvent(
QtCore.QEvent.MouseButtonRelease,
pos,
QtCore.Qt.LeftButton,
QtCore.Qt.LeftButton,
QtCore.Qt.NoModifier,
)
QtCore.QCoreApplication.postEvent(widget, event_release)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())
如果您有更多信息,例如 id 或 xpath,您可以单击使用 javascript:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setWindowTitle("My Window")
self.browser = QtWebEngineWidgets.QWebEngineView()
self.browser.setUrl(QtCore.QUrl("https://www.google.com/"))
self.setCentralWidget(self.browser)
self.browser.loadFinished.connect(self.on_loadFinished)
@QtCore.pyqtSlot(bool)
def on_loadFinished(self, ok):
if not ok:
return
xpath = r"//body[@id='gsr']/div[@id='viewport']/div[@id='main']/span[@id='body']/center/div[@id='lga']/div[@id='hplogo']/a/img[1]"
s = (
"""
(function() {
var banner = document.evaluate("%s", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
banner.click()
})()"""
% xpath
)
self.browser.page().runJavaScript(s)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())