30 lines
900 B
TypeScript
30 lines
900 B
TypeScript
import { Effect } from 'effect'
|
|
import type { Page } from 'puppeteer'
|
|
import { CrawlerElementNotFoundError } from '../..'
|
|
|
|
const STOCK_LEVEL_BADGE_SELECTOR =
|
|
'.modellfilter_row > .modellfilter_head > .colored_label_wrapper'
|
|
|
|
export const getStockLevel = (page: Page) =>
|
|
Effect.gen(function* () {
|
|
return yield* Effect.tryPromise({
|
|
try: () =>
|
|
page.evaluate((STOCK_LEVEL_BADGE_SELECTOR) => {
|
|
const stockLevelBadge: HTMLDivElement | null = document.querySelector(
|
|
STOCK_LEVEL_BADGE_SELECTOR,
|
|
)
|
|
|
|
if (!stockLevelBadge) {
|
|
throw new Error('Could not find stock level')
|
|
}
|
|
|
|
return stockLevelBadge.innerText
|
|
}, STOCK_LEVEL_BADGE_SELECTOR),
|
|
catch: (cause) =>
|
|
new CrawlerElementNotFoundError({
|
|
message: `Could not parse stock level, ${cause}`,
|
|
cause,
|
|
}),
|
|
})
|
|
})
|