Кукловод - получите элемент ввода по xpath, а затем нажмите и введите

Я пытаюсь войти в систему и для этого сделал функцию:

async function login(page, usernameXPATH, passwordXPATH, username, password)
{
  const usernameElement = await page.$x(usernameXPATH);
  await usernameElement[0].click({clickCount: 3});
  await page.type(usernameElement[0], username);

  const passwordElement = await page.$x(passwordXPATH);
  await passwordElement[0].click({clickCount: 3});
  await page.type(passwordElement[0], password);

  await page.keyboard.press('Enter');
}

Но это вызывает ошибку

TypeError: Converting circular structure to JSON
        --> starting at object with constructor 'BrowserContext'
        |     property '_browser' -> object with constructor 'Browser'
        --- property '_defaultContext' closes the circle Are you passing a nested JSHandle?
        at JSON.stringify (<anonymous>)

      at Connection._rawSend (node_modules/puppeteer/src/common/Connection.ts:100:37)
      at CDPSession.send (node_modules/puppeteer/src/common/Connection.ts:259:33)
      at ExecutionContext._evaluateInternal (node_modules/puppeteer/src/common/ExecutionContext.ts:252:44)
      at ExecutionContext.evaluateHandle (node_modules/puppeteer/src/common/ExecutionContext.ts:191:17)
      at ElementHandle.evaluateHandle (node_modules/puppeteer/src/common/JSHandle.ts:183:42)
      at Object.internalHandler.queryOne (node_modules/puppeteer/src/common/QueryHandler.ts:68:38)
      at ElementHandle.$ (node_modules/puppeteer/src/common/JSHandle.ts:778:25)
      at DOMWorld.$ (node_modules/puppeteer/src/common/DOMWorld.ts:171:34)

Если я удалю [0] и использую только usernameElement.click(), то я получаю сообщение об ошибке, что click() не является функцией.

Что я здесь делаю не так?

Объект сообщения, переданный в github.com/puppeteer/puppeteer/blob/…, кажется, имеет внутри циклическую ссылку. Может быть, попробуйте поставить точку останова, чтобы увидеть переданное значение.

Parag 06.04.2021 12:28

Это простой HTML-элемент ... className: 'HTMLInputElement'

harunB10 06.04.2021 12:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
22
1

Ответы 1

Page.type принимает селектор в качестве своего первого аргумента, а не элемент (соответствующий XPath). Скорее используйте elementHandle.type, например:

async function login(page, usernameXPATH, passwordXPATH, username, password)
{
  const usernameElement = await page.$x(usernameXPATH);
  await usernameElement[0].click({clickCount: 3});
  await usernameElement[0].type(username);

  const passwordElement = await page.$x(passwordXPATH);
  await passwordElement[0].click({clickCount: 3});
  await passwordElement[0].type(password);

  await page.keyboard.press('Enter');
}

Другие вопросы по теме