브라우저 환경에서 Puppeteer의 노드 환경으로 개체를 어떻게 반환합니까?

새긴 ​​금

페이지에서 '바구니에 추가'버튼 요소를 모두 긁어내어 배열에 넣고 해당 배열을 Node 환경으로 반환하는 다음 코드가 있습니다.

const puppeteer = require('puppeteer');

let getArrayofButtons = async () => {
  const browser = await puppeteer.launch({
    devtools: 'true',
  });

  const page = await browser.newPage();
  await page.setViewport({ width: 1280, height: 1800 });

  await page.goto('http://books.toscrape.com/', {
    waitUntil: 'domcontentloaded',
  });

  await page.waitForSelector('.product_pod');
  let buttons = [];

  await page.evaluate(() => {
    buttons = [...document.querySelectorAll('*')].filter(e =>
      [...e.childNodes].find(n => n.nodeValue?.match('basket'))
    );
    console.log(buttons);
  });
  // browser.close();
};
getArrayofButtons().then(returnedButtons => {
  console.log(returnedButtons);
});

나는 때 console.log(buttons);나는의 배열을 볼 수있는 button브라우저 환경의 요소를,하지만 난 얻을 노드 환경에 그 배열을 반환 할 때 undefined.

내 이해는 page.evaluate()전달 된 함수의 값을 반환하므로 다음을 대체하면

articles = [...document.querySelectorAll('*')].filter(e => [...e.childNodes].find(n => n.nodeValue?.match('basket')) );

와:

return [...document.querySelectorAll('*')].filter(e => [...e.childNodes].find(n => n.nodeValue?.match('basket')) );

작동해야하는 것 같습니다. Promise가 올바르게 해결되지 않았습니까?

딱딱한

해당 결과에 evaluateHandle대한 포인터 를 얻기 위해 호출 할 수 있습니다.

const arrayHandle = await page.evaluateHandle(() => {
    buttons = [...document.querySelectorAll('*')].filter(e =>
      [...e.childNodes].find(n => n.nodeValue?.match('basket'))
    );
    return buttons;
  });

공지 사항 arrayHandle배열이 아닙니다. 그것은이다 ElementHandle브라우저의 배열을 가리키는.

측면의 각 버튼을 처리하려면 해당 getProperties함수를 호출하는 핸들을 처리해야 합니다.

const properties = await arrayHandle.getProperties();
await arrayHandle.dispose();
const buttons = [];
for (const property of properties.values()) {
  const elementHandle = property.asElement();
  if (elementHandle)
    buttons.push(elementHandle);
}

예, 꽤 상용구입니다. 그러나 그 핸들을 잡고 평가 함수에 전달할 수 있습니다.

page.evaluate((elements) => elements[0].click(), arrayHandle);

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

노드의 함수에서 데이터를 어떻게 반환합니까?

분류에서Dev

'this'는 브라우저와 노드 환경에서 다르게 작동합니다.

분류에서Dev

함수의 반환 유형이 그렇게 할 수없는 경우 C에서 오류 코드를 어떻게 반환합니까?

분류에서Dev

웹보기에서 다른 브라우저의 링크를로드하려면 어떻게합니까?

분류에서Dev

웹보기에서 다른 브라우저의 링크를로드하려면 어떻게합니까?

분류에서Dev

randomElement ()를 사용하는 경우 Swift의 구조체에서 2 개의 값을 반환하려면 어떻게해야합니까?

분류에서Dev

RaphaelJS에서 경로의 개별 노드를 어떻게 이동합니까?

분류에서Dev

cypher에서 연결된 노드 목록과 문자열의 위치를 어떻게 반환합니까?

분류에서Dev

브라우저 너비 / 높이가 변경 될 때 이미지 그리드의 크기를 동적으로 조정하려면 어떻게해야합니까?

분류에서Dev

sshd의 환경에서 새 SSH 세션으로 환경 변수를 어떻게 전달할 수 있습니까?

분류에서Dev

이메일에서 링크를 열 때 Lotus Notes의 기본 브라우저를 어떻게 변경합니까?

분류에서Dev

이메일에서 링크를 열 때 Lotus Notes의 기본 브라우저를 어떻게 변경합니까?

분류에서Dev

노드 스폰에서 현재의 모든 환경 변수를 어떻게 전달할 수 있습니까?

분류에서Dev

기본 브라우저를 어떻게 변경합니까?

분류에서Dev

기본 브라우저를 어떻게 변경합니까?

분류에서Dev

Linux에서 환경 변수를 노드로 전달하는이 예제는 어떻게 작동합니까?

분류에서Dev

JMockit에서 void 반환 유형으로 메소드를 어떻게 모의합니까?

분류에서Dev

void 반환 유형의 메서드에 대해 빈 JSON 개체를 반환하려면 어떻게해야합니까?

분류에서Dev

Kemal after_all 메서드에서 경로의 반환 값에 어떻게 액세스합니까?

분류에서Dev

Retrofit onResponse에서 메소드의 데이터를 어떻게 반환합니까?

분류에서Dev

ByteBuddy 생성 메서드에서 인수로받은 개체의 (공용) 인스턴스 필드를 MethodCall의 반환 값에 어떻게 설정합니까?

분류에서Dev

브라우저에서 WCF 메서드 호출이 400 개의 잘못된 요청을 반환합니다.

분류에서Dev

하나의 Flask 경로에서 객체와 html 파일을 반환하려면 어떻게해야합니까?

분류에서Dev

하나의 Flask 경로에서 객체와 html 파일을 반환하려면 어떻게해야합니까?

분류에서Dev

정규식을 사용하는 경우 Ivy 코드를 Maven으로 어떻게 변환합니까?

분류에서Dev

이 메서드에서 GUID를 어떻게 반환합니까?

분류에서Dev

팩토리에서 반환 된 객체를 요소의 메서드에 어떻게 바인딩합니까?

분류에서Dev

마스터 노드가 실패 할 경우 Elasticsearch는 어떻게 다른 노드로 전환합니까?

분류에서Dev

개체의 속성 이름을 어떻게 반환합니까?

Related 관련 기사

  1. 1

    노드의 함수에서 데이터를 어떻게 반환합니까?

  2. 2

    'this'는 브라우저와 노드 환경에서 다르게 작동합니다.

  3. 3

    함수의 반환 유형이 그렇게 할 수없는 경우 C에서 오류 코드를 어떻게 반환합니까?

  4. 4

    웹보기에서 다른 브라우저의 링크를로드하려면 어떻게합니까?

  5. 5

    웹보기에서 다른 브라우저의 링크를로드하려면 어떻게합니까?

  6. 6

    randomElement ()를 사용하는 경우 Swift의 구조체에서 2 개의 값을 반환하려면 어떻게해야합니까?

  7. 7

    RaphaelJS에서 경로의 개별 노드를 어떻게 이동합니까?

  8. 8

    cypher에서 연결된 노드 목록과 문자열의 위치를 어떻게 반환합니까?

  9. 9

    브라우저 너비 / 높이가 변경 될 때 이미지 그리드의 크기를 동적으로 조정하려면 어떻게해야합니까?

  10. 10

    sshd의 환경에서 새 SSH 세션으로 환경 변수를 어떻게 전달할 수 있습니까?

  11. 11

    이메일에서 링크를 열 때 Lotus Notes의 기본 브라우저를 어떻게 변경합니까?

  12. 12

    이메일에서 링크를 열 때 Lotus Notes의 기본 브라우저를 어떻게 변경합니까?

  13. 13

    노드 스폰에서 현재의 모든 환경 변수를 어떻게 전달할 수 있습니까?

  14. 14

    기본 브라우저를 어떻게 변경합니까?

  15. 15

    기본 브라우저를 어떻게 변경합니까?

  16. 16

    Linux에서 환경 변수를 노드로 전달하는이 예제는 어떻게 작동합니까?

  17. 17

    JMockit에서 void 반환 유형으로 메소드를 어떻게 모의합니까?

  18. 18

    void 반환 유형의 메서드에 대해 빈 JSON 개체를 반환하려면 어떻게해야합니까?

  19. 19

    Kemal after_all 메서드에서 경로의 반환 값에 어떻게 액세스합니까?

  20. 20

    Retrofit onResponse에서 메소드의 데이터를 어떻게 반환합니까?

  21. 21

    ByteBuddy 생성 메서드에서 인수로받은 개체의 (공용) 인스턴스 필드를 MethodCall의 반환 값에 어떻게 설정합니까?

  22. 22

    브라우저에서 WCF 메서드 호출이 400 개의 잘못된 요청을 반환합니다.

  23. 23

    하나의 Flask 경로에서 객체와 html 파일을 반환하려면 어떻게해야합니까?

  24. 24

    하나의 Flask 경로에서 객체와 html 파일을 반환하려면 어떻게해야합니까?

  25. 25

    정규식을 사용하는 경우 Ivy 코드를 Maven으로 어떻게 변환합니까?

  26. 26

    이 메서드에서 GUID를 어떻게 반환합니까?

  27. 27

    팩토리에서 반환 된 객체를 요소의 메서드에 어떻게 바인딩합니까?

  28. 28

    마스터 노드가 실패 할 경우 Elasticsearch는 어떻게 다른 노드로 전환합니까?

  29. 29

    개체의 속성 이름을 어떻게 반환합니까?

뜨겁다태그

보관