getProperties.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import { ElementHandle } from 'puppeteer';
  2. export const getRawProperty = async <
  3. T extends HTMLElement = HTMLElement,
  4. K extends keyof T = keyof T
  5. >(
  6. element: Promise<ElementHandle<T>> | ElementHandle<T>,
  7. property: K
  8. ): Promise<T[K]> =>
  9. (await (
  10. await (await element)?.getProperty(property as string)
  11. )?.jsonValue()) as T[K];
  12. export const getRawProperties = async <
  13. T extends HTMLElement = HTMLElement,
  14. K extends keyof T = keyof T
  15. >(
  16. element: Promise<ElementHandle<T>> | ElementHandle<T>,
  17. ...properties: K[]
  18. ) =>
  19. Promise.all(properties.map((property) => getRawProperty(element, property)));
  20. export const getRawPropertyFromMany = async <
  21. T extends HTMLElement = HTMLElement,
  22. K extends keyof T = keyof T
  23. >(
  24. elements: Promise<ElementHandle<T>[]> | ElementHandle<T>[],
  25. property: K
  26. ): Promise<T[K][]> =>
  27. Promise.all(
  28. (await elements).map(
  29. async (element): Promise<any> =>
  30. (['innerText', 'innerHTML'] as K[]).includes(property)
  31. ? await element?.evaluate<[string]>(
  32. (element: T, property: string) => element[property],
  33. property as string
  34. )
  35. : getRawProperty<T, K>(element, property)
  36. )
  37. );