Estoy usando selenium python webdriver para navegar por algunas páginas. Quiero inyectar un código JavaScript en una página antes de que se carguen y ejecuten otros códigos Javascript. Por otro lado, necesito que mi código JS se ejecute como el primer código JS de esa página. ¿Hay alguna manera de hacer eso con Selenium?
Lo busqué en Google durante un par de horas, ¡pero no pude encontrar ninguna respuesta adecuada!
Selenium ahora es compatible con la API de Chrome Devtools Protocol (CDP), por lo que es realmente fácil ejecutar un script en cada carga de página. Aquí hay un código de ejemplo para eso:
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'alert("Hooray! I did it!")'})Y ejecutará ese script para CADA carga de página. Más información sobre esto se puede encontrar en:
Desde la versión 1.0.9, selenium-wire ha ganado la funcionalidad de modificar las respuestas a las solicitudes. A continuación se muestra un ejemplo de esta funcionalidad para inyectar un script en una página antes de que llegue a un navegador web.
import os from seleniumwire import webdriver from gzip import compress, decompress from urllib.parse import urlparse from lxml import html from lxml.etree import ParserError from lxml.html import builder script_elem_to_inject = builder.SCRIPT('alert("injected")') def inject(req, req_body, res, res_body): # various checks to make sure we're only injecting the script on appropriate responses # we check that the content type is HTML, that the status code is 200, and that the encoding is gzip if res.headers.get_content_subtype() != 'html' or res.status != 200 or res.getheader('Content-Encoding') != 'gzip': return None try: parsed_html = html.fromstring(decompress(res_body)) except ParserError: return None try: parsed_html.head.insert(0, script_elem_to_inject) except IndexError: # no head element return None return compress(html.tostring(parsed_html)) drv = webdriver.Firefox(seleniumwire_options={'custom_response_handler': inject}) drv.header_overrides = {'Accept-Encoding': 'gzip'} # ensure we only get gzip encoded responsesEn general, otra forma de controlar un navegador de forma remota y poder inyectar un script antes de que se cargue el contenido de las páginas sería usar una biblioteca basada en un protocolo completamente separado, por ejemplo: Chrome DevTools Protocol. El más destacado que conozco es dramaturgo .