久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

    <legend id='BBkNz'><style id='BBkNz'><dir id='BBkNz'><q id='BBkNz'></q></dir></style></legend>
      <bdo id='BBkNz'></bdo><ul id='BBkNz'></ul>
    1. <tfoot id='BBkNz'></tfoot>

      <small id='BBkNz'></small><noframes id='BBkNz'>

        <i id='BBkNz'><tr id='BBkNz'><dt id='BBkNz'><q id='BBkNz'><span id='BBkNz'><b id='BBkNz'><form id='BBkNz'><ins id='BBkNz'></ins><ul id='BBkNz'></ul><sub id='BBkNz'></sub></form><legend id='BBkNz'></legend><bdo id='BBkNz'><pre id='BBkNz'><center id='BBkNz'></center></pre></bdo></b><th id='BBkNz'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='BBkNz'><tfoot id='BBkNz'></tfoot><dl id='BBkNz'><fieldset id='BBkNz'></fieldset></dl></div>

        有什么方法可以在瀏覽器中獲取 Pyqt5 中頁面的

        Is there any way of getting XPATH of the page in Pyqt5 in browser?(有什么方法可以在瀏覽器中獲取 Pyqt5 中頁面的 XPATH 嗎?)

            <tbody id='QGqA2'></tbody>
          <legend id='QGqA2'><style id='QGqA2'><dir id='QGqA2'><q id='QGqA2'></q></dir></style></legend>
          • <bdo id='QGqA2'></bdo><ul id='QGqA2'></ul>
          • <tfoot id='QGqA2'></tfoot>

            <small id='QGqA2'></small><noframes id='QGqA2'>

                • <i id='QGqA2'><tr id='QGqA2'><dt id='QGqA2'><q id='QGqA2'><span id='QGqA2'><b id='QGqA2'><form id='QGqA2'><ins id='QGqA2'></ins><ul id='QGqA2'></ul><sub id='QGqA2'></sub></form><legend id='QGqA2'></legend><bdo id='QGqA2'><pre id='QGqA2'><center id='QGqA2'></center></pre></bdo></b><th id='QGqA2'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='QGqA2'><tfoot id='QGqA2'></tfoot><dl id='QGqA2'><fieldset id='QGqA2'></fieldset></dl></div>
                • 本文介紹了有什么方法可以在瀏覽器中獲取 Pyqt5 中頁面的 XPATH 嗎?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

                  問題描述

                  我正在使用 pyqt5.我希望用戶單擊嵌入在我的 pyqt5 應用程序中的瀏覽器以獲取他/她單擊它的元素的 XPATH.

                  I am working with pyqt5. I want user to click the browser embeded on my pyqt5 application to get the XPATH of the element which he/she is clicking on it.

                  知道它是如何完成的,或者是否可行?

                  Any idea how it's done, or is it feasible?

                  推薦答案

                  為了回答這個問題,我使用了以下答案:

                  To answer this question I have used the following answers:

                  • 獲取被點擊的項目:https://stackoverflow.com/a/9012576

                  獲取給定項目的 XPATH:https://stackoverflow.com/a/58677712

                  Get the XPATH given the item: https://stackoverflow.com/a/58677712

                  運行js腳本并將信息發送到python:https://stackoverflow.com/a/55294356

                  Run js scripts and send the information to python: https://stackoverflow.com/a/55294356

                  加入所有這些部分,您將獲得以下解決方案:

                  Joining all these parts you get the following solution:

                  ├── main.py
                  └── xpath_from_element.js
                  

                  ma??in.py

                  import os
                  
                  from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets, QtWebChannel
                  
                  from jinja2 import Template
                  
                  CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
                  
                  
                  class Element(QtCore.QObject):
                      def __init__(self, name, parent=None):
                          super(Element, self).__init__(parent)
                          self._name = name
                  
                      @property
                      def name(self):
                          return self._name
                  
                      def script(self):
                          return ""
                  
                  
                  class WebEnginePage(QtWebEngineWidgets.QWebEnginePage):
                      def __init__(self, parent=None):
                          super(WebEnginePage, self).__init__(parent)
                          self.loadFinished.connect(self.onLoadFinished)
                          self._objects = []
                          self._scripts = []
                  
                      def add_object(self, obj):
                          self._objects.append(obj)
                  
                      @QtCore.pyqtSlot(bool)
                      def onLoadFinished(self, ok):
                          print("Finished loading: ", ok)
                          if ok:
                              self.load_qwebchannel()
                              self.add_objects()
                  
                      def load_qwebchannel(self):
                          file = QtCore.QFile(":/qtwebchannel/qwebchannel.js")
                          if file.open(QtCore.QIODevice.ReadOnly):
                              content = file.readAll()
                              file.close()
                              self.runJavaScript(content.data().decode())
                          if self.webChannel() is None:
                              channel = QtWebChannel.QWebChannel(self)
                              self.setWebChannel(channel)
                  
                      def add_objects(self):
                          if self.webChannel() is not None:
                              objects = {obj.name: obj for obj in self._objects}
                              self.webChannel().registerObjects(objects)
                              _script = """
                              {% for obj in objects %}
                              var {{obj}};
                              {% endfor %}
                              new QWebChannel(qt.webChannelTransport, function (channel) {
                              {% for obj in objects %}
                                  {{obj}} = channel.objects.{{obj}};
                              {% endfor %}
                              }); 
                              """
                              self.runJavaScript(Template(_script).render(objects=objects.keys()))
                              for obj in self._objects:
                                  if isinstance(obj, Element):
                                      self.runJavaScript(obj.script())
                  
                  
                  class Helper(Element):
                      xpathClicked = QtCore.pyqtSignal(str)
                  
                      def script(self):
                          js = ""
                          file = QtCore.QFile(os.path.join(CURRENT_DIR, "xpath_from_element.js"))
                          if file.open(QtCore.QIODevice.ReadOnly):
                              content = file.readAll()
                              file.close()
                              js = content.data().decode()
                  
                          js += """
                          document.addEventListener('click', function(e) {
                              e = e || window.event;
                              var target = e.target || e.srcElement;
                              var xpath = Elements.DOMPath.xPath(target, false); 
                              {{name}}.receive_xpath(xpath);
                          }, false);"""
                          return Template(js).render(name=self.name)
                  
                      @QtCore.pyqtSlot(str)
                      def receive_xpath(self, xpath):
                          self.xpathClicked.emit(xpath)
                  
                  
                  if __name__ == "__main__":
                      import sys
                  
                      app = QtWidgets.QApplication(sys.argv)
                  
                      xpath_helper = Helper("xpath_helper")
                      xpath_helper.xpathClicked.connect(lambda xpath: print("clicked", xpath))
                      view = QtWebEngineWidgets.QWebEngineView()
                      page = WebEnginePage()
                      page.add_object(xpath_helper)
                      view.setPage(page)
                      view.load(QtCore.QUrl("https://www.qt.io"))
                      view.show()
                      sys.exit(app.exec_())
                  

                  xpath_from_element.js

                  // Copyright 2018 The Chromium Authors. All rights reserved.
                  // Use of this source code is governed by a BSD-style license that can be
                  // found in the LICENSE file.
                  
                  Elements = {};
                  Elements.DOMPath = {};
                  
                  /**
                   * @param {!Node} node
                   * @param {boolean=} optimized
                   * @return {string}
                   */
                  Elements.DOMPath.xPath = function (node, optimized) {
                      if (node.nodeType === Node.DOCUMENT_NODE) {
                          return '/';
                      }
                  
                      const steps = [];
                      let contextNode = node;
                      while (contextNode) {
                          const step = Elements.DOMPath._xPathValue(contextNode, optimized);
                          if (!step) {
                              break;
                          }  // Error - bail out early.
                          steps.push(step);
                          if (step.optimized) {
                              break;
                          }
                          contextNode = contextNode.parentNode;
                      }
                  
                      steps.reverse();
                      return (steps.length && steps[0].optimized ? '' : '/') + steps.join('/');
                  };
                  
                  /**
                   * @param {!Node} node
                   * @param {boolean=} optimized
                   * @return {?Elements.DOMPath.Step}
                   */
                  Elements.DOMPath._xPathValue = function (node, optimized) {
                      let ownValue;
                      const ownIndex = Elements.DOMPath._xPathIndex(node);
                      if (ownIndex === -1) {
                          return null;
                      }  // Error.
                  
                      switch (node.nodeType) {
                          case Node.ELEMENT_NODE:
                              if (optimized && node.getAttribute('id')) {
                                  return new Elements.DOMPath.Step('//*[@id="' + node.getAttribute('id') + '"]', true);
                              }
                              ownValue = node.localName;
                              break;
                          case Node.ATTRIBUTE_NODE:
                              ownValue = '@' + node.nodeName;
                              break;
                          case Node.TEXT_NODE:
                          case Node.CDATA_SECTION_NODE:
                              ownValue = 'text()';
                              break;
                          case Node.PROCESSING_INSTRUCTION_NODE:
                              ownValue = 'processing-instruction()';
                              break;
                          case Node.COMMENT_NODE:
                              ownValue = 'comment()';
                              break;
                          case Node.DOCUMENT_NODE:
                              ownValue = '';
                              break;
                          default:
                              ownValue = '';
                              break;
                      }
                  
                      if (ownIndex > 0) {
                          ownValue += '[' + ownIndex + ']';
                      }
                  
                      return new Elements.DOMPath.Step(ownValue, node.nodeType === Node.DOCUMENT_NODE);
                  };
                  
                  /**
                   * @param {!Node} node
                   * @return {number}
                   */
                  Elements.DOMPath._xPathIndex = function (node) {
                      // Returns -1 in case of error, 0 if no siblings matching the same expression,
                      // <XPath index among the same expression-matching sibling nodes> otherwise.
                      function areNodesSimilar(left, right) {
                          if (left === right) {
                              return true;
                          }
                  
                          if (left.nodeType === Node.ELEMENT_NODE && right.nodeType === Node.ELEMENT_NODE) {
                              return left.localName === right.localName;
                          }
                  
                          if (left.nodeType === right.nodeType) {
                              return true;
                          }
                  
                          // XPath treats CDATA as text nodes.
                          const leftType = left.nodeType === Node.CDATA_SECTION_NODE ? Node.TEXT_NODE : left.nodeType;
                          const rightType = right.nodeType === Node.CDATA_SECTION_NODE ? Node.TEXT_NODE : right.nodeType;
                          return leftType === rightType;
                      }
                  
                      const siblings = node.parentNode ? node.parentNode.children : null;
                      if (!siblings) {
                          return 0;
                      }  // Root node - no siblings.
                      let hasSameNamedElements;
                      for (let i = 0; i < siblings.length; ++i) {
                          if (areNodesSimilar(node, siblings[i]) && siblings[i] !== node) {
                              hasSameNamedElements = true;
                              break;
                          }
                      }
                      if (!hasSameNamedElements) {
                          return 0;
                      }
                      let ownIndex = 1;  // XPath indices start with 1.
                      for (let i = 0; i < siblings.length; ++i) {
                          if (areNodesSimilar(node, siblings[i])) {
                              if (siblings[i] === node) {
                                  return ownIndex;
                              }
                              ++ownIndex;
                          }
                      }
                      return -1;  // An error occurred: |node| not found in parent's children.
                  };
                  
                  /**
                   * @unrestricted
                   */
                  Elements.DOMPath.Step = class {
                      /**
                       * @param {string} value
                       * @param {boolean} optimized
                       */
                      constructor(value, optimized) {
                          this.value = value;
                          this.optimized = optimized || false;
                      }
                  
                      /**
                       * @override
                       * @return {string}
                       */
                      toString() {
                          return this.value;
                      }
                  };
                  

                  這篇關于有什么方法可以在瀏覽器中獲取 Pyqt5 中頁面的 XPATH 嗎?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

                  【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

                  相關文檔推薦

                  How to bind a function to an Action from Qt menubar?(如何將函數綁定到 Qt 菜單欄中的操作?)
                  PyQt progress jumps to 100% after it starts(PyQt 啟動后進度躍升至 100%)
                  How to set yaxis tick label in a fixed position so that when i scroll left or right the yaxis tick label should be visible?(如何將 yaxis 刻度標簽設置在固定位置,以便當我向左或向右滾動時,yaxis 刻度標簽應該可見
                  `QImage` constructor has unknown keyword `data`(`QImage` 構造函數有未知關鍵字 `data`)
                  Change x-axis ticks to custom strings(將 x 軸刻度更改為自定義字符串)
                  How to show progress bar while saving file to excel in python?(如何在python中將文件保存為excel時顯示進度條?)

                      • <bdo id='xrMaS'></bdo><ul id='xrMaS'></ul>
                        • <legend id='xrMaS'><style id='xrMaS'><dir id='xrMaS'><q id='xrMaS'></q></dir></style></legend>

                            <small id='xrMaS'></small><noframes id='xrMaS'>

                            <i id='xrMaS'><tr id='xrMaS'><dt id='xrMaS'><q id='xrMaS'><span id='xrMaS'><b id='xrMaS'><form id='xrMaS'><ins id='xrMaS'></ins><ul id='xrMaS'></ul><sub id='xrMaS'></sub></form><legend id='xrMaS'></legend><bdo id='xrMaS'><pre id='xrMaS'><center id='xrMaS'></center></pre></bdo></b><th id='xrMaS'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='xrMaS'><tfoot id='xrMaS'></tfoot><dl id='xrMaS'><fieldset id='xrMaS'></fieldset></dl></div>
                            <tfoot id='xrMaS'></tfoot>

                              <tbody id='xrMaS'></tbody>
                            主站蜘蛛池模板: 91精品国产色综合久久不卡蜜臀 | 日韩中文一区二区三区 | 亚洲综合在 | 精品国产青草久久久久96 | 久久影院一区 | 人妖一区 | 久久久高清| 欧美久久免费观看 | 亚洲精品国产精品国自产在线 | 国产在线a| 久久丁香| 国产成人麻豆免费观看 | 成人 在线| 天天干狠狠| 日韩a视频 | 午夜免费视频 | 国产精品片 | 黄色精品 | 国产精品久久久av | 中文字幕国产在线 | 中国一级特黄视频 | 午夜欧美 | 国产精品亚洲精品 | 久久伊人精品 | 午夜爽爽爽男女免费观看 | 国产精品精品3d动漫 | 精品国产伦一区二区三区观看方式 | 国产亚洲人成a在线v网站 | 国产成人jvid在线播放 | 成人欧美一区二区三区黑人孕妇 | 97视频精品 | www.色综合| 日韩久久久久久 | 亚洲中午字幕 | 国产激情一区二区三区 | 日韩精品国产精品 | 水蜜桃亚洲一二三四在线 | 久久伊人一区二区 | 欧美高清视频一区 | 亚洲欧美综合 | 天堂一区 |