Несколько записей из БД обработать в одном браузере через модуль selenium

Сначала укажу код:

async def click_one(browser):
    actions = ActionChains(browser)
    actions.send_keys(Keys.DOWN).perform()
    actions.send_keys(Keys.ENTER).perform()

async def wait_for_element(browser, locator, timeout: int = 1000):
    wait = WebDriverWait(browser, timeout)
    element = wait.until(EC.presence_of_element_located(locator))
    return element

async def requests():
    async with aiosqlite.connect(db_path) as conn:
        async with conn.cursor() as cursor:
            await cursor.execute("SELECT cad_n, id, name FROM requests WHERE comment='Запросить'")
            results = await cursor.fetchall()
            for result in results:
                service = Service(chromedriver_path)
                options = Options()
                options.add_experimental_option('excludeSwitches', ['enable-logging'])
                options.add_experimental_option("detach", True)
                options.add_argument("start-maximized")
                options.add_extension(browser_plug_in)
                browser = webdriver.Chrome(service=service, options=options)
                browser.get('https://lk.rosreestr.ru/eservices/request-info-from-egrn/real-estate-object-or-its-rightholder')
                await asyncio.sleep(5)
                if (await wait_for_element(browser, (By.XPATH, '//*[@id="login"]'))):
                        (await wait_for_element(browser, (By.XPATH, '//*[@id="login"]'))).send_keys(LOGIN)
                        (await wait_for_element(browser, (By.XPATH, '//*[@id="password"]'))).send_keys(PASSWORD)
                        (await wait_for_element(browser,(By.CSS_SELECTOR, 'body > esia-root > div > esia-login > div > div.form-container.outline-none > form > div:nth-child(4) > button'))).click()
                        await asyncio.sleep(5)
                if (await wait_for_element(browser,(By.XPATH, '/html/body/esia-root/div/esia-login/div/div/esia-enter-mfa/esia-otp/div/form/div/esia-code-input/div/code-input/span[1]/input'))):
                    await bot.send_message(1920542702, 'Введи код из СМС')
                    await asyncio.sleep(5)
                    while True:
                        if (await wait_for_element(browser, (By.XPATH, '//*[@id="personal-cabinet-root"]/div/div[1]/div/div/div[2]/button[2]'))):
                            await asyncio.sleep(5)
                            break
                        await asyncio.sleep(5)
                await requests_v(browser=browser, result=result, conn=conn, cursor=cursor)
            if len(results) == 0:
                pass

async def requests_v(browser,result,conn,cursor):
    await asyncio.sleep(5)
    (await wait_for_element(browser, (By.CSS_SELECTOR, '#personal-cabinet-root > div > div.login-page > div > div > div.role-selector__list > button:nth-child(2)'))).click()
    (await wait_for_element(browser,(By.XPATH, '//*[@id="applicantCategory"]'))).send_keys('Органы государственной статистики')
    await click_one(browser)
    (await wait_for_element(browser,(By.XPATH, '//*[@id="rorganizationOrGovernmentArray[0].regDate"]'))).send_keys('09.11.2015')
    (await wait_for_element(browser,(By.XPATH, '//*[@id="userAuthorityConfirmationDocument.documentType"]'))).send_keys('Доверенность')
    await click_one(browser)
    (await wait_for_element(browser,(By.XPATH, '//*[@id="userAuthorityConfirmationDocument.documentNumber"]'))).send_keys('Сл-60/23')
    (await wait_for_element(browser,(By.XPATH, '//*[@id="userAuthorityConfirmationDocument.documentIssueDate"]'))).send_keys('22.03.2023')
    (await wait_for_element(browser,(By.XPATH, '//*[@id="userAuthorityConfirmationDocument.issuingAuthority"]'))).send_keys('Министерство')
    (await wait_for_element(browser,(By.CSS_SELECTOR, '#userAuthorityConfirmationDocument\.file'))).send_keys(filePath)
    (await wait_for_element(browser,(By.CSS_SELECTOR, '#userAuthorityConfirmationDocument\.signature'))).send_keys(filesig)
    (await wait_for_element(browser,(By.CSS_SELECTOR, '#react-select-4-input'))).send_keys(result[0])
    await asyncio.sleep(5)
    await click_one(browser)
    (await wait_for_element(browser,(By.XPATH, '//*[@id="react-select-6-input"]'))).send_keys('Выписка из Единого государственного реестра недвижимости об объекте недвижимости')
    await click_one(browser)
    (await wait_for_element(browser,(By.XPATH, '//*[@id="requestAboutObject.deliveryActionEmail"]'))).send_keys('@yandex.ru')
    (await wait_for_element(browser,(By.XPATH, '//*[@id="realEstateItems"]/div/div[2]/div/label/div/div[1]/div/div[2]/div[2]'))).click()
    (await wait_for_element(browser,(By.XPATH, '//*[@id="main-page-wrapper"]/div[2]/div/div[3]/div[2]/div[4]/button'))).click()  # первая кнопка далее
    (await wait_for_element(browser,(By.XPATH, '//*[@id="main-page-wrapper"]/div[2]/div/div[2]/div[2]/div[3]/button[2]'))).click()  # вторая кнопка далее
    await asyncio.sleep(2)
    (await wait_for_element(browser,(By.CLASS_NAME, 'certificate-selector__list-option'))).click()
    (await wait_for_element(browser,(By.CSS_SELECTOR, 'button.rros-ui-lib-button.rros-ui-lib-button--primary[data-cy="select-certificate-button"]'))).click()
    await asyncio.sleep(10)
    await cursor.execute(f"UPDATE requests SET comment == 'Запрошен' WHERE cad_n == '{result[0]}' AND id == '{result[1]}'")
    await conn.commit()
    browser.get('https://lk.rosreestr.ru/eservices/request-info-from-egrn/real-estate-object-or-its-rightholder')

Проблема в том, что мне нужно, что бы в одном браузере обрабатывались все записи из БД. Текущий код обрабатывает первую запись и после открывает еще один браузер.

Пробовал перекидывать

async with aiosqlite.connect(db_path) as conn:
        async with conn.cursor() as cursor:
            await cursor.execute("SELECT cad_n, id, name FROM requests WHERE comment='Запросить'")
            results = await cursor.fetchall()
            for result in results:

В начало функции requests_v() и в конце этой функции ставил browser.back() (как я понимаю возвращает предыдущую страницу), но проблема та же... Подскажите пожалуйста, как мне это сделать?


Ответы (2 шт):

Автор решения: Gawain

Вам нужно вынести инициализацию драйвера за цикл for

service = Service(chromedriver_path)
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_experimental_option("detach", True)
options.add_argument("start-maximized")
options.add_extension(browser_plug_in)
browser = webdriver.Chrome(service=service, options=options)
results = await cursor.fetchall()

for result in results:
    ...
→ Ссылка
Автор решения: Михаил Ширшов

Получилось вот таким образом:

async def click_one(browser):
    actions = ActionChains(browser)
    actions.send_keys(Keys.DOWN).perform()
    actions.send_keys(Keys.ENTER).perform()

async def wait_for_element(browser, locator, timeout: int = 1000):
    wait = WebDriverWait(browser, timeout)
    element = wait.until(EC.presence_of_element_located(locator))
    return element

async def requests():
    async with aiosqlite.connect(db_path) as conn:
        async with conn.cursor() as cursor:
            await cursor.execute("SELECT cad_n, id, name FROM requests WHERE comment='Запросить'")
            results = await cursor.fetchall()
            if len(results) == 0:
                pass
            else:
                service = Service(chromedriver_path)
                options = Options()
                options.add_experimental_option('excludeSwitches', ['enable-logging'])
                options.add_experimental_option("detach", True)
                options.add_argument("start-maximized")
                options.add_extension(browser_plug_in)
                browser = webdriver.Chrome(service=service, options=options)
                browser.get('https://lk.rosreestr.ru/eservices/request-info-from-egrn/real-estate-object-or-its-rightholder')
                await asyncio.sleep(5)
                if (await wait_for_element(browser, (By.XPATH, '//*[@id="login"]'))):
                        (await wait_for_element(browser, (By.XPATH, '//*[@id="login"]'))).send_keys(LOGIN)
                        (await wait_for_element(browser, (By.XPATH, '//*[@id="password"]'))).send_keys(PASSWORD)
                        (await wait_for_element(browser,(By.CSS_SELECTOR, 'body > esia-root > div > esia-login > div > div.form-container.outline-none > form > div:nth-child(4) > button'))).click()
                        await asyncio.sleep(5)
                if (await wait_for_element(browser,(By.XPATH, '/html/body/esia-root/div/esia-login/div/div/esia-enter-mfa/esia-otp/div/form/div/esia-code-input/div/code-input/span[1]/input'))):
                    await bot.send_message(1920542702, 'Введи код из СМС')
                    await asyncio.sleep(5)
                    while True:
                        if (await wait_for_element(browser, (By.XPATH, '//*[@id="personal-cabinet-root"]/div/div[1]/div/div/div[2]/button[2]'))):
                            await asyncio.sleep(5)
                            break
                        await asyncio.sleep(5)
                # /html/body/esia-root/esia-reaction/div/div/div/div/p/text()
                await asyncio.sleep(5)
                (await wait_for_element(browser, (By.CSS_SELECTOR, '#personal-cabinet-root > div > div.login-page > div > div > div.role-selector__list > button:nth-child(2)'))).click()
            for result in results:
                await requests_v(browser=browser, result=result, conn=conn, cursor=cursor)

async def requests_v(browser,result,conn,cursor):
    (await wait_for_element(browser,(By.XPATH, '//*[@id="applicantCategory"]'))).send_keys('Органы государственной статистики')
    await click_one(browser)
    (await wait_for_element(browser,(By.XPATH, '//*[@id="rorganizationOrGovernmentArray[0].regDate"]'))).send_keys('09.11.2015')
    (await wait_for_element(browser,(By.XPATH, '//*[@id="userAuthorityConfirmationDocument.documentType"]'))).send_keys('Доверенность')
    await click_one(browser)
    (await wait_for_element(browser,(By.XPATH, '//*[@id="userAuthorityConfirmationDocument.documentNumber"]'))).send_keys('Сл-326219160/23')
    (await wait_for_element(browser,(By.XPATH, '//*[@id="userAuthorityConfirmationDocument.documentIssueDate"]'))).send_keys('22.03.2023')
    (await wait_for_element(browser,(By.XPATH, '//*[@id="userAuthorityConfirmationDocument.issuingAuthority"]'))).send_keys('Министерство имущественных и земельных отношений нижегородской области')
    (await wait_for_element(browser,(By.CSS_SELECTOR, '#userAuthorityConfirmationDocument\.file'))).send_keys(filePath)
    (await wait_for_element(browser,(By.CSS_SELECTOR, '#userAuthorityConfirmationDocument\.signature'))).send_keys(filesig)
    (await wait_for_element(browser,(By.CSS_SELECTOR, '#react-select-4-input'))).send_keys(result[0])
    await asyncio.sleep(5)
    await click_one(browser)
    (await wait_for_element(browser,(By.XPATH, '//*[@id="react-select-6-input"]'))).send_keys('Выписка из Единого государственного реестра недвижимости об объекте недвижимости')
    await click_one(browser)
    (await wait_for_element(browser,(By.XPATH, '//*[@id="requestAboutObject.deliveryActionEmail"]'))).send_keys('[email protected]')
    (await wait_for_element(browser,(By.XPATH, '//*[@id="realEstateItems"]/div/div[2]/div/label/div/div[1]/div/div[2]/div[2]'))).click()
    (await wait_for_element(browser,(By.XPATH, '//*[@id="main-page-wrapper"]/div[2]/div/div[3]/div[2]/div[4]/button'))).click()  # первая кнопка далее
    (await wait_for_element(browser,(By.XPATH, '//*[@id="main-page-wrapper"]/div[2]/div/div[2]/div[2]/div[3]/button[2]'))).click()  # вторая кнопка далее
    await asyncio.sleep(2)
    (await wait_for_element(browser,(By.CLASS_NAME, 'certificate-selector__list-option'))).click()
    (await wait_for_element(browser,(By.CSS_SELECTOR, 'button.rros-ui-lib-button.rros-ui-lib-button--primary[data-cy="select-certificate-button"]'))).click()
    await asyncio.sleep(10)
    await cursor.execute(f"UPDATE requests SET comment == 'Запрошен' WHERE cad_n == '{result[0]}' AND id == '{result[1]}'")
    await conn.commit()
    browser.get('https://lk.rosreestr.ru/eservices/request-info-from-egrn/real-estate-object-or-its-rightholder')
→ Ссылка