从Puppeteer中的单个选择器中获取多个属性

问题描述 投票:1回答:1

我刚刚在App.js中创建了一个具有以下内容的新React应用:

import React from 'react';
import logo from './logo.svg';
import './App.css';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;

如果您不了解React,那么只需考虑return语句(基本HTML)中的内容。

我想用Puppeteer执行E2E测试,所以我的** App.test.js••看起来像:

import puppeteer from "puppeteer";

let browser;
let page;

beforeAll(async () => {
  browser = await puppeteer.launch({
    headless: false
  });
  page = await browser.newPage();
  await page.goto("http://localhost:3000/");
});

test("renders learn react link", async () => {
  await page.waitForSelector(".App");

  const header = await page.$eval(".App-header>p", e => e.innerHTML);
  expect(header).toBe(`Edit <code>src/App.js</code> and save to reload.`);

  const link = await page.$eval(".App-header>a", e => e);
  expect(link.innerHTML).toBe(`Learn React`);
  expect(link.href).toBe("https://reactjs.org");
  console.log(link);
});

afterAll(() => {
  browser.close();
});

注意,link常数及其后4行。他们不工作。一种方法是,如果我执行以下操作:

const linkInnerHTML = await page.$eval(".App-header>a", e => e.innerHTML);
const linkHref = await page.$eval(".App-header>a", e => e.href);
expect(linkInnerHTML).toBe(`Learn React`);
expect(linkHref).toBe("https://reactjs.org");

但是,我希望能够一次调用选择器.App-header>a,然后在其上调用innerHTMLhref。我知道这很简单,但似乎无法在Google上正确搜索😂

任何线索?

javascript html reactjs puppeteer
1个回答
1
投票

您无法从page.$eval返回整个节点元素,因为它们不可序列化,但是您可以返回像这样的简单对象:

const link = await page.$eval(".App-header>a", e => {
    return {
        InnerHTML : e.innerHTML,
        Href : e.href,
    }
});

expect(link.InnerHTML).toBe(`Learn React`);
expect(link.Href).toBe("https://reactjs.org");
© www.soinside.com 2019 - 2024. All rights reserved.