Developer Advocate, eternal learner, author
У својој претходној компанији, развио сам групни посао који је пратио метрику на друштвеним медијима, као што су Твитер, ЛинкедИн, Мастодон, Блуески, Реддит, итд. Онда сам схватио да могу да га дуплирам за своју „личност“. Проблем је у томе што неки медији не пружају ХТТП АПИ за метрику коју желим. Ево метрике које желим на ЛинкедИн-у:
ЛинкедИн метричка контролна табла
Дуго сам тражио, али нисам нашао приступ АПИ-ју за горњу метрику. Сваког јутра сам дуго времена ручно стругао метрику и коначно одлучио да аутоматизујем овај досадан задатак. Ево шта сам научио.
Посао је у Питхон-у, тако да желим да останем у истој технолошкој групи. После брзог истраживања, пронашао сам Плаивригхт , алатку за аутоматизацију претраживача са неколико језичких АПИ-ја, укључујући Питхон. Примарни случај употребе Плаивригхт-а је тестирање од краја до краја, али такође може да управља прегледачем ван контекста тестирања.
Користим Поетри за управљање зависностима. Инсталирање Плаивригхт-а је једноставно као:
poetry add playwright
У овом тренутку, Плаивригхт је спреман за употребу. Нуди два различита АПИ-ја, један синхрони и један асинхрони . Због мог случаја употребе, први укус је више него довољан.
Волим да постепено приступам развоју.
Ево извода АПИ-ја:
Извод из АПИ модела
Преводи се у следећи код:
from playwright.sync_api import Browser, Locator, Page, sync_playwright with (sync_playwright() as pw): #1 browser: Browser = pw.chromium.launch() #2 page: Page = browser.new_page() #3 page.goto('https://www.linkedin.com/login') #4 page.locator('#username').press_sequentially(getenv('LINKEDIN_USERNAME')) #5 page.locator('#password').press_sequentially(getenv('LINKEDIN_PASSWORD')) #5 page.locator('button[type=submit]').press('Enter') #6 page.goto('https://www.linkedin.com/dashboard/') #4 metrics_container: Locator = page.locator('.pcd-analytic-view-items-container') metrics: List[Locator] = metrics_container.locator('p.text-body-large-bold').all() #7 impressions = atoi(metrics[0].inner_text()) #8 # Get other metrics browser.close() #9
Набавите предмет playwright
.
Покрените инстанцу претраживача. Доступно је више типова претраживача; Одабрао сам Цхромиум из хира. Имајте на уму да сте претходно требали инсталирати одређени претраживач, тј . playwright install --with-deps chromium
.
Подразумевано, претраживач се отвара без главе ; не појављује се. Саветовао бих да га покренете видљиво на почетку ради лакшег отклањања грешака: headless = True
.
Отворите нови прозор прегледача.
Идите на нову локацију.
Пронађите наведена поља за унос и попуните их мојим акредитивима.
Пронађите одређено дугме и притисните га.
Пронађите све наведене елементе.
Добијте унутрашњи текст првог елемента.
Затворите претраживач да бисте очистили.
Горе наведено је радило како се очекивало. Једина мана је што сам добијао е-пошту од ЛинкедИн-а сваки пут када сам покренуо скрипту:
Здраво Николас,
Успешно сте активирали Запамти ме на новом уређају ХеадлессЦхроме, <ОС> у <град>, <регион>, <земља > . Сазнајте више о томе како Запамти ме ради на уређају.
Такође сам упознао Фабијена Вошела на конференцији ЈаваЦро . Специјализовао се за веб скрапинг и рекао ми је да већина људи у овој области користи профиле прегледача. Заиста, ако се пријавите на ЛинкедИн, добићете токен за аутентификацију сачуван као колачићи и нећете морати поново да га аутентификујете пре него што истекне. На срећу, Плаивригхт нуди такву функцију својом методом launch_persistent_context
.
Горње launch
можемо заменити следећим:
with sync_playwright() as pw: playwright_profile_dir = f'{Path.home()}/.social-metrics/playwright-profile' context: BrowserContext = pw.chromium.launch_persistent_context(playwright_profile_dir) #1 try: #2 page: Page = context.new_page() #3 page.goto('https://www.linkedin.com/dashboard/') #4 if 'session_redirect' in page.url: #4 page.locator('#username').press_sequentially(getenv('LINKEDIN_USERNAME')) page.locator('#password').press_sequentially(getenv('LINKEDIN_PASSWORD')) page.locator('button[type=submit]').press('Enter') page.goto('https://www.linkedin.com/dashboard/') metrics_container: Locator = page.locator('.pcd-analytic-view-items-container') # Same as in the previous snippet except Exception as e: #2 logger.error(f'Could not fetch metrics: {e}') finally: #5 context.close()
Плаивригхт ће ускладиштити профил у наведеној фасцикли и поново га користити током покретања.
Побољшајте руковање изузетцима.
BrowserContext
такође може да отвара странице.
Покушавамо да дођемо до контролне табле. ЛинкедИн ће нас преусмерити на страницу за пријаву ако нисмо аутентификовани; онда можемо да потврдимо аутентичност.
Затворите контекст без обзира на исход.
У овом тренутку, потребно је само да се аутентификујемо са оба акредитива први пут. О наредним трчањима, зависи.
Био сам изненађен када сам видео да горњи код не ради поуздано. Успело је у првој вожњи, а понекад иу наредним. Пошто складиштим профил прегледача у свим радњама, када треба да се аутентификујем, ЛинкедИн тражи само лозинку, а не и пријаву! Пошто код покушава да унесе пријаву, у овом случају не успева. Решење је прилично једноставно:
username_field = page.locator('#username') if username_field.is_visible(): username_field.press_sequentially(getenv('LINKEDIN_USERNAME')) page.locator('#password').press_sequentially(getenv('LINKEDIN_PASSWORD'))
Иако нисам стручњак за Питхон, успео сам да постигнем оно што сам желео са Дрампистом. Више сам волео да користим АПИ за синхронизацију јер он чини код мало лакшим за размишљање, а немам никакве захтеве за перформансама. Користио сам само основне функције које нуди Плаивригхт. Плаивригхт дозвољава снимање видео записа у контексту тестова, што је веома корисно када тест не успе током извршавања ЦИ цевовода.
Да идемо даље:
Првобитно објављено на А Јава Геек 19. јануара 2024