Извлечение файлов cookie с помощью Selenium (Python) из iFrame

#python #selenium #cookies #iframe

#python #selenium #файлы cookie #iframe

Вопрос:

Я могу получать файлы cookie с веб-сайта просто отлично. Но меня интересуют файлы cookie, которые использует чат-бот, например, есть сайты чат-ботов, такие как: <www.kinguin.net> или <www.multibankfx.com> или <coschedule.com>

Если мы перейдем на эти веб-сайты и «проверим их элемент», а затем посмотрим под файлами cookie secure.livechat.inc (это чат-бот), там будет 1 или 2 файла cookie, как показано на рисунке ниже

Здесь, на этом изображении, я просматриваю файлы cookie чат-бота на веб-сайте под названием <www.kinguin.net > и мы можем видеть там один файл cookie, то есть «__livechat».

Итак, этот файл cookie — это то, что я хочу автоматизировать и извлечь с помощью selenium.

мой следующий код возвращает все файлы cookie на веб-сайте, но «_livechat» отсутствует

 import os, sys, json, codecs, subprocess, requests, time, string
from selenium import webdriver  
from selenium.webdriver.common.keys import Keys  
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup as bs
from selenium.common.exceptions import NoSuchElementException
driver = webdriver.Chrome()
host = 'kinguin.net'
driver.get("https://" host)
cookies = driver.get_cookies()
driver.switch_to.default_content()
cookies = driver.get_cookies()
for item in cookies:
    print(item['name'])
 

продолжая, мой следующий код переходит в iFrame чат-бота и получает файлы cookie, но возвращает null

 driver.switch_to.default_content()
elementID = driver.find_element_by_id('chat-widget')
driver.switch_to.frame(0)
cookies = driver.get_cookies()
for item in cookies:
    print(item['name'])
 

@ble Большое спасибо — предлагаемый вами способ полезен только для этого конкретного веб-сайта, а это не то, что я хочу. Извините, если я не смог четко объяснить это в своем предыдущем запросе, но мне нужно общее решение для крупномасштабного набора данных веб-сайта.

Например, если мы посмотрим на <www.ebanx.com > здесь чат-бот отличается, и поэтому я буду искать его по elementID = driver.find_element_by_id('hubspot-messages-iframe-container')

и если я использую ваш код после этого driver.switch_to.frame(elementID)

это выдает ошибку

Исключение NoSuchFrameException: Сообщение: нет такого фрейма: элемент не является фреймом

Ответ №1:

С помощью этой строки кода вы нашли элемент iframe:

 elementID = driver.find_element_by_id('chat-widget')
 

Используйте это, чтобы переключиться на этот iframe, и вы сможете собирать файлы cookie с помощью написанного вами кода

 driver.switch_to.frame(elementID)
 

После завершения переключитесь на содержимое по умолчанию с помощью

 driver.switch_to.default_content()
 

На этой странице есть еще iframes. Самый простой подход — найти элемент с помощью уникального идентификатора, такого как ‘id’ или ‘name’, и сохранить его в переменной, например, ‘elementId’. Я предлагаю переименовать его в ‘iframe_element’, потому что это не ID, вы просто получили элемент по ID.
Кроме того, избегайте поиска по индексу ( driver.switch_to.frame(0) ), если на странице не так много iframes (https://www.guru99.com/handling-iframes-selenium.html )

Комментарии:

1. Большое спасибо — предлагаемый вами способ полезен только для этого конкретного веб-сайта, а это не то, что я хочу. Извините, если я не смог четко объяснить это в своем предыдущем запросе, но мне нужно общее решение для крупномасштабного набора данных веб-сайта. Например, если мы посмотрим на <www.ebanx.com > здесь чат-бот отличается, и поэтому я буду искать его по «‘elementId = driver.find_element_by_id(‘hubspot-messages-iframe-container’)» и, если я использую ваш код после этого «‘driver.switch_to.frame(elementId)»‘ это выдает мне ошибку NoSuchFrameException: Сообщение: нет такого фрейма: элемент не является фреймом

2. можете ли вы создать словарь, например dictionary={‘kinguin.net ‘:’чат-виджет’, …} для всех веб-сайтов, а затем используйте elementId = driver.find_element_by_id(словарь [хост])

3. Это не проблема — ключевое слово здесь не проблема, проблема в том, что я упомянул выше, что оно работает не для всех веб-сайтов (у меня есть миллион веб-сайтов, которые нужно очистить)

4. Я подумал, что это может сработать для вас, если вы определите это так dictionary={'kinguin.net':'chat-widget', 'ebanx.com':''hubspot-messages-iframe-container', ...} для всех веб-сайтов и перейдете к www.kinguin.net , поскольку вы написали host = 'kinguin.net' , что когда дело доходит до этой строки elementID = driver.find_element_by_id(dictionary[host]) , она будет читаться как elementID = driver.find_element_by_id('chat-widget']) … если это вас не устраивает, придерживайтесь driver.switch_to.frame(0) . надеюсь, что кто-то еще сможет вам помочь