首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >木偶人如何处理点击对象/ DevTools协议铬/铬

木偶人如何处理点击对象/ DevTools协议铬/铬
EN

Stack Overflow用户
提问于 2020-04-01 22:46:19
回答 1查看 495关注 0票数 1

我需要知道木偶是如何处理点击对象的,以及Chromium DevTools应用程序接口。我试图自己研究它,但发现自己找不到处理它的实际代码。

我之所以需要知道这一点,是因为我正在开发一个包装器,它在测试Web页面的代码中测试事件,并希望了解实现事件处理例程是否有益,而不是使用事件的傀儡接口(单击和点击鼠标悬停,以及可能需要的其他事件,如触摸事件或滚动)

下面是我所学到的:

Puppeteer使用DevTools的框架逻辑联系接口:https://github.com/puppeteer/puppeteer/blob/master/lib/Page.js

代码语言:javascript
复制
    /**
       * @param {string} selector
       * @param {!{delay?: number, button?: "left"|"right"|"middle", clickCount?: number}=} options
   */
      click(selector, options = {}) {
      return this.mainFrame().click(selector, options);
      }
       /**
       * @return {!Puppeteer.Frame}
       */
      /**
       * @param {!Protocol.Page.Frame} framePayload`
       */
      _onFrameNavigated(framePayload) {
       const isMainFrame = !framePayload.parentId;
       let frame = isMainFrame ? this._mainFrame : this._frames.get(framePayload.id);
       assert(isMainFrame || frame, 'We either navigate top level or have old version of the navigated frame');
    // Detach all child frames first.
        if (frame) {
          for (const child of frame.childFrames())
           this._removeFramesRecursively(child);
        }
        if (isMainFrame) {
          if (frame) {
            // Update frame id to retain frame identity on cross-process navigation.
            this._frames.delete(frame._id);
            frame._id = framePayload.id;
          } else {
            // Initial main frame navigation.
            frame = new Frame(this, this._client, null, framePayload.id);
          }
          this._frames.set(framePayload.id, frame);
          this._mainFrame = frame;
        }

这就是我所得到的,因为我试图查找页面协议,但我不知道那里发生了什么。

任何帮助都将不胜感激,甚至在研究方面也是如此。

EN

回答 1

Stack Overflow用户

发布于 2020-04-01 23:21:25

主要部分发生在JSHandle here中。

代码语言:javascript
复制
async click(options) {
    await this._scrollIntoViewIfNeeded();
    const {x, y} = await this._clickablePoint();
    await this._page.mouse.click(x, y, options);
}

它会滚动,直到元素在视口中(否则不会单击),然后使用DevTools here here找到元素上的可单击坐标

代码语言:javascript
复制
async _clickablePoint() {
    const [result, layoutMetrics] = await Promise.all([
      this._client.send('DOM.getContentQuads', {
        objectId: this._remoteObject.objectId
      }).catch(debugError),
      this._client.send('Page.getLayoutMetrics'),
    ]);
    if (!result || !result.quads.length)
      throw new Error('Node is either not visible or not an HTMLElement');
    // Filter out quads that have too small area to click into.
    const {clientWidth, clientHeight} = layoutMetrics.layoutViewport;
    const quads = result.quads.map(quad => this._fromProtocolQuad(quad)).map(quad => this._intersectQuadWithViewport(quad, clientWidth, clientHeight)).filter(quad => computeQuadArea(quad) > 1);
    if (!quads.length)
      throw new Error('Node is either not visible or not an HTMLElement');
    // Return the middle point of the first quad.
    const quad = quads[0];
    let x = 0;
    let y = 0;
    for (const point of quad) {
      x += point.x;
      y += point.y;
    }
    return {
      x: x / 4,
      y: y / 4
    };
}

最后,它将鼠标移动到坐标here并单击它here

代码语言:javascript
复制
async click(x, y, options = {}) {
    const {delay = null} = options;
    if (delay !== null) {
      await Promise.all([
        this.move(x, y),
        this.down(options),
      ]);
      await new Promise(f => setTimeout(f, delay));
      await this.up(options);
    } else {
      await Promise.all([
        this.move(x, y),
        this.down(options),
        this.up(options),
      ]);
    }
}

它使用DevTools API与鼠标here进行交互。

代码语言:javascript
复制
async down(options = {}) {
    const {button = 'left', clickCount = 1} = options;
    this._button = button;
    await this._client.send('Input.dispatchMouseEvent', {
      type: 'mousePressed',
      button,
      x: this._x,
      y: this._y,
      modifiers: this._keyboard._modifiers,
      clickCount
    });
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60973617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档