Playwright python 代码在本地使用无头浏览器,但在 AWS Lambda 中失败

Playwright python code works locally with headless browser but fails in AWS Lambda

提问人:Mohanraj M 提问时间:10/28/2023 最后编辑:Mohanraj M 更新时间:10/29/2023 访问量:88

问:

我开发了一个 Playwright 脚本,该脚本使用无外设浏览器在我的本地计算机上成功运行,但当我将其部署到 AWS Lambda 时,它无法按预期工作。Lambda 函数超时,并且自动化未按预期完成。

    async def run(self) -> None:
    async with async_playwright() as playwright:
        lead_create_status = "not_created"
        lead_id = "null"

        custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"

        identifier_logger = self.logger_generator.get_logger(YesBankCc.IDENTIFIER)
        browser = await playwright.chromium.launch(headless=True, args=["--single-process"])
        wait_until = "load"
        # context = await browser.new_context(user_agent=custom_user_agent,
        #                                     geolocation={"longitude": 72.877655, "latitude": 19.075983},
        #                                     permissions=["geolocation"])
        geolocator = Nominatim(user_agent="MyApp")

        location = geolocator.geocode("Mumbai")

        print("The latitude of the location is: ", location.latitude)
        print("The longitude of the location is: ", location.longitude)
        context = await browser.new_context(
            ignore_https_errors=True,
            # java_script_enabled=True,
            user_agent=custom_user_agent,
            viewport={"width": 1920, "height": 1080},
            geolocation={"longitude": location.longitude, "latitude": location.latitude},
            permissions=["geolocation"], )

        identifier_logger.debug("New context created...")
        page = await context.new_page()
        page.set_default_timeout(120000)
        identifier_logger.debug("New page created...")

        # Navigate to login page
        identifier_logger.debug("Navigating to login page...")
        await page.goto(url=self._portal_info["crm_url"], wait_until="load")

        print(f'URL = {self._portal_info["crm_url"]}')

        identifier_logger.info("Successfully navigated to login page")
        identifier_logger.debug("Filling in login details...")

        await sleep(10)
        identifier_logger.debug("Waited for 10 seconds")

        identifier_logger.debug("Going to click mobile number field")

        await page.locator('[id="username"]').click()

        # await page.get_by_placeholder('Enter Mobile Number').click()
        identifier_logger.debug("Clicked enter mobile number field")

        await page.locator('[id="username"]').fill(value=str(self._portal_info["crm_username"]))

        # await page.get_by_placeholder('Enter Mobile Number').fill(value=str(self._portal_info["crm_username"]))
        identifier_logger.debug("Filled enter mobile number field")
        await page.wait_for_load_state('domcontentloaded')
        await page.locator(
            '[class="btn-primary btndisable mat-button mat-button-base ng-star-inserted"]').click()
        identifier_logger.debug("Send OTP button clicked")
        identifier_logger.debug("Login OTP Sent successfully...")

请注意,我们在 docker 镜像中使用此脚本,在该镜像中,我们有一个 lambda 处理程序和镜像内的 lambda 层。我们有一个内部中间件系统来照顾它的工作,它也可以完美地运行在我的本地 Linux 机器上运行的大多数自动化任务。但是这个网站自动化脚本需要纬度和经度才能在本地计算机上无头运行,但该代码在 lambda 中不起作用

我的问题是:

  1. 使用 Playwright 时是否有任何已知的限制或差异 在 AWS Lambda 中与本地环境相比?

  2. 什么原因可能导致 Lambda 函数超时,我该如何操作 排查并解决此问题?

  3. 我应该有什么特定的配置或注意事项吗 在 AWS Lambda 函数中部署 Playwright 代码时是否了解?

我非常感谢有关如何使我的 Playwright 代码在 AWS Lambda 中顺利运行的任何见解或建议。谢谢你的帮助!

环境详细信息:

AWS Lambda 运行时:Python 3.9、 剧作家版本:1.35.0, AWS 区域:ap-south-1

python amazon-web-services aws-lambda 剧作家 playwright-python

评论


答: 暂无答案