DaysOfCode의 날

Patricia Arquette
풀어 주다: 2024-10-04 06:19:02
원래의
302명이 탐색했습니다.

Day of DaysOfCode

안녕하세요! 오랫만에 글이네요.
최근 저는 루프 내에서 요소 참조 손실과 관련된 문제를 해결해 왔으며 마침내 여러분 모두와 공유하고 싶은 해결책을 찾았습니다.

내가 이루고 싶었던 것

  • 특정 웹페이지의 버튼 요소를 수집합니다.
  • 각 버튼을 클릭하면 다른 페이지로 이동합니다.
  • 새 페이지에서 특정 작업을 수행한 후 첫 번째 페이지로 돌아갑니다.
  • 모든 버튼을 클릭할 때까지 2단계와 3단계를 반복하세요.

초기 코드의 단순화된 버전은 다음과 같습니다.

const someElements = await page.$$("xpath/ .//foo[@name='hoge']");

for (let i=0; i < someElements.length; i++) {
    await Promise.all([
        someElements[i].click(),
        page.waitForNavigation({ waitUntil: ["load", 'networkidle0'] }),
    /* There are particular processes and going back process */
    ]);
};
로그인 후 복사

어떤 오류가 발생했나요?

forst 루프 반복 후 스크립트가 버튼 요소를 찾을 수 없었습니다. 다음 오류가 계속 발생했습니다.
ProtocolError: 프로토콜 오류(DOM.describeNode): 에서 지정된 ID를 가진 컨텍스트를 찾을 수 없습니다.

내가 해결한 방법

루프 내에서 버튼 요소 목록을 다시 선언하여 이 문제를 해결했습니다.
수정된 코드는 다음과 같습니다.

const someElements1 = await page.$$("xpath/ .//foo[@name='hoge']");

for (let i=0; i < someElements.length; i++) {
    const someElements2 = await page.$$("xpath/ .//foo[@name='hoge']"); // added row
    await Promise.all([
        someElements2[i].click(),
        page.waitForNavigation({ waitUntil: ["load", 'networkidle0'] }),
    /* There are particular processes and going back process */
    ]);
};
로그인 후 복사

초기 페이지에서 다른 곳으로 이동할 때 원래 someElements 참조가 손실된다고 가정했기 때문에 재선언 줄을 추가했습니다. 변경 후 오류가 해결되었습니다. 그러나 이 접근 방식이 최고의 코딩 방법을 엄격하게 준수하는지 잘 모르겠습니다.

페이지 간을 탐색할 때 루프에서 .click() 문제가 발생하는 경우 루프 자체 내에서 요소를 다시 선언하는 것이 좋습니다. 이 간단한 변경으로 문제 해결 시간을 많이 절약할 수 있습니다!

위 내용은 DaysOfCode의 날의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿