getProperties.ts 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  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 (await (await element)?.getProperty(property as string))?.jsonValue();
  10. export const getRawProperties = async <
  11. T extends HTMLElement = HTMLElement,
  12. K extends keyof T = keyof T
  13. >(
  14. element: Promise<ElementHandle<T>> | ElementHandle<T>,
  15. ...properties: K[]
  16. ) =>
  17. Promise.all(properties.map((property) => getRawProperty(element, property)));
  18. export const getRawPropertyFromMany = async <
  19. T extends HTMLElement = HTMLElement,
  20. K extends keyof T = keyof T
  21. >(
  22. elements: Promise<ElementHandle<T>[]> | ElementHandle<T>[],
  23. property: K
  24. ): Promise<T[K][]> =>
  25. Promise.all(
  26. (await elements).map(
  27. async (element): Promise<any> =>
  28. (['innerText', 'innerHTML'] as K[]).includes(property)
  29. ? await element?.evaluate<[string]>(
  30. (element: T, property: string) => element[property],
  31. property as string
  32. )
  33. : getRawProperty<T, K>(element, property)
  34. )
  35. );