Вопрос об оценке элемента xpath Puppeteer

Я работаю над кодом кукловода и столкнулся с проблемой, которую хочу лучше понять.

При работе с XPaths у меня возникают проблемы с пониманием того, почему этот код работает:

   await page.goto(url)
   //identify element with absolute xpath then click
   const b = (await page.$x("<absolute XPath>"))[0]
   //Works!
   b.click()

   //But this won't work
   const b = (await page.$x("<absolute XPath>"))
   b.click()

   //And this won't work
   b.click()
   const b = await page.$x("<absolute XPath>")

Почему заключение оператора await page.$x в круглых скобках работает? Что там происходит?

Когда я удаляю круглые скобки, удаляю индекс массива, любые изменения... и т. д., я получаю стандартные ошибки, такие как, например, "щелчок не является функцией b". У меня сложилось впечатление, что я оцениваю абсолютный XPath... один элемент. Откуда взялся массив? И что происходит, когда все это заключено в круглые скобки и указан элемент массива, который вычисляет это идеально и прямо к нужному элементу без проблем?

Буду признателен за любую информацию или ссылки на нужную информацию. Я надеюсь, что это не то, что я пропустил в документах

это не скобки, а [0] все меняет. xpath может найти много элементов, поэтому он всегда возвращает список (даже если он находит только один элемент или ничего), и вам нужно использовать [0], чтобы получить первый элемент из списка - вы не можете сделать list.click() . Вы должны сделать first = list[0] и позже first.click()

furas 18.03.2022 03:04

Вы действительно хотите переключиться на css, когда это возможно, из соображений производительности, а также потому, что код будет чище.

pguardiario 19.03.2022 04:25
Веб-скраппинг с помощью PHP: Пошаговое руководство
Веб-скраппинг с помощью PHP: Пошаговое руководство
Веб-скрейпинг становится все более популярным и сегодня является одной из актуальных тем в IT-сообществе. В результате несколько библиотек помогают...
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Скраппинг поиска Apple App Store с помощью Python
Скраппинг поиска Apple App Store с помощью Python
📌Примечание: В этой статье я покажу вам, как скрапировать поиск Apple App Store и получить точно такой же результат, как на Apple iMac, потому что...
1
2
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это не parenthesis, но [0] все меняет.

xpath может найти много элементов, поэтому он всегда возвращает список/массив, даже если он находит только один элемент или ничего, и вам нужно использовать [0], чтобы получить первый элемент из списка. Или вы можете использовать другой индекс для получения другого элемента из списка (если список длиннее). (Конечно, список может быть пустым и [0] может вызвать ошибку)

Вы не можете сделать list.click(). Вы должны сделать first = list[0] и позже first.click(). Или вы можете использовать forEach для выполнения click для всех элементов в списке.

Нужно только parenthesis выполнять команды в правильном порядке - сначала await, потом [0].

Если вы не используете parenthesis, он попытается сначала выполнить [0], а затем await.

Так что вы могли бы переписать его на несколько строк

const all_results = await page.$x("<XPath>")

const first = all_results[0]

first.click()

или пиши короче

const all_results = await page.$x("<XPath>")

all_results[0].click()

или

const first = (await page.$x("<XPath>"))[0]

first.click()

Если бы вы использовали console.info(b), вы бы увидели, что у вас действительно есть в этой переменной в разных версиях.


КСТАТИ:

То же самое может быть и с селектором CSS — page.$("<css selection>") — он также возвращает список/массив.


Обновлено:

Как @ggorlen он упомянул в комментарии, вы можете назначить первый элемент, используя массив слева.

[first] = await page.$x("<XPath>")

first.click()

Есть еще const [el] = await page.$x("...").

ggorlen 18.03.2022 03:33

@ggorlen спасибо, я не специалист по puppeteer и javascript - я использую xpath в Python.

furas 18.03.2022 03:35

Большое спасибо вам обоим!!! Красиво объяснил, теперь понял!

tayl0rt 18.03.2022 06:54

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