Несколько записей из БД обработать в одном браузере через модуль 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')