Python: Pyppeteer нажав на всплывающее окно
Я пытаюсь принять согласие на использование файлов cookie для всплывающего окна, созданного на этой странице. Я пытался использовать waitForSelector
но ни один из селекторов, которые я использовал, кажется, не виден безголовому браузеру. Я хотел бы на самом деле переключиться на "ДА", а затем отправить форму. Я думаю, это отображается на window.onload
так что, возможно, это нужно будет сделать в JavaScript?
import asyncio
import time
from pyppeteer import launch
from pyppeteer.errors import TimeoutError
from urllib.parse import urlparse
URLS = [
'https://www.trustarc.com/'
]
start = time.time()
async def fetch(url, browser):
page = await browser.newPage()
try:
#await page.setRequestInterception(True)
page.on('request', callback)
await page.goto(url, {'waitUntil': 'networkidle0'})
await page.screenshot({'path': f'img/{urlparse(url)[1]}.png', 'fullPage': True})
except TimeoutError as e:
print(f'Timeout for: {url}')
finally:
await page.close()
async def callback(req):
print(f'Request: {req.url}')
async def run():
browser = await launch(headless=True, args=['--no-sandbox'])
tasks = []
for url in URLS:
task = asyncio.ensure_future(fetch(url, browser))
tasks.append(task)
ret = await asyncio.gather(*tasks)
await browser.close()
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(run())
loop.run_until_complete(future)
print(f'It took {time.time()-start} seconds.')
2 ответа
Если всплывающая рамка настроек cookie не открывается автоматически, ее можно открыть вручную, нажав кнопку в правом нижнем углу веб-страницы.
Параметры файлов cookie находятся в iframe
, поэтому вам придется подождать, пока содержимое кадра загрузится, прежде чем выбрать "ДА" для Функциональных куки-файлов и рекламных куки-файлов.
После отправки настроек вам нужно будет дождаться и закрыть подтверждающее сообщение, чтобы продолжить пользоваться сайтом.
Полный пример:
// Navigate to the website
await page.goto( 'https://www.trustarc.com/', { 'waitUntil' : 'networkidle0' } );
// Open the Cookie Preferences pop-up (if necessary)
if ( await page.$( '.truste_overlay' ) === null )
{
await page.click( '#teconsent > a' );
}
// Wait for the Cookie Preferences frame and content to load
const cookies_frame = page.frames()[1];
await cookies_frame.waitForSelector( '.active', { 'visible' : true } );
// Fill out and submit form
await cookies_frame.evaluate( () =>
{
const yes_buttons = document.getElementsByClassName( 'off' );
const submit_button = document.getElementsByClassName( 'submit' )[0];
yes_buttons[0].click();
yes_buttons[1].click();
submit_button.click();
});
// Wait for and close confirmation
const close_button = await cookies_frame.waitForSelector( '#gwt-debug-close_id' );
await close_button.click();
Если кто-то найдет это полезным, это моя реализация Python, основанная на принятом ответе:
import asyncio
import time
from pyppeteer import launch
from pyppeteer.errors import TimeoutError
from urllib.parse import urlparse
URLS = [
'https://www.trustarc.com/'
]
start = time.time()
async def fetch(url, browser):
page = await browser.newPage()
try:
#await page.setRequestInterception(True)
#page.on('request', callback)
await page.goto(url, {'waitUntil': 'networkidle0'})
if not await page.J('.truste_overlay'):
await page.click('#teconsent > a')
cookies_frame = page.frames[1]
await cookies_frame.waitForSelector( '.active', {'visible': True})
await cookies_frame.evaluate('''() =>
{
const yes_buttons = document.getElementsByClassName( 'off' );
const submit_button = document.getElementsByClassName( 'submit' )[0];
yes_buttons[0].click();
yes_buttons[1].click();
submit_button.click();
}''')
close_button = await cookies_frame.waitForSelector( '#gwt-debug-close_id' )
await close_button.click()
await page.screenshot({'path': f'img/{urlparse(url)[1]}.png', 'fullPage': True})
except TimeoutError as e:
print(f'Timeout for: {url}')
finally:
await page.close()
async def callback(req):
print(f'Request: {req.url}')
async def run():
browser = await launch(headless=True, args=['--no-sandbox'])
tasks = []
for url in URLS:
task = asyncio.ensure_future(fetch(url, browser))
tasks.append(task)
ret = await asyncio.gather(*tasks)
await browser.close()
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(run())
loop.run_until_complete(future)
print(f'It took {time.time()-start} seconds.')