Uso de Selenium en Python para guardar una página web en Firefox

Estoy intentando utilizar Selenium en Python para guardar páginas web en MacOS Firefox .

Hasta ahora, he logrado hacer clic en COMMAND + S para abrir la SAVE AS window . Sin embargo,

No se como

  1. cambiar el directorio del archivo,
  2. cambiar el nombre del archivo, y
  3. haga clic en el botón GUARDAR COMO.

¿Alguien podría ayudar?

A continuación se muestra el código que utilizo para hacer clic en COMMAND + S :

 ActionChains(browser).key_down(Keys.COMMAND).send_keys("s").key_up(Keys.COMMAND).perform() 

Además, la razón por la que uso este método es que encuentro un Error de encoding de Unicode cuando:

  1. escribe el page_source a un archivo html y
  2. almacenar información desechada en un archivo csv.

Escribir en un archivo html:

 file_object = open(completeName, "w") html = browser.page_source file_object.write(html) file_object.close() 

Escribir en un archivo csv:

 csv_file_write.writerow(to_write) 

Error:

UnicodeEncodeError: el codec ‘ascii’ no puede codificar el carácter u ‘\ xf8’ en la posición 1: ordinal no está dentro del rango (128)

Lo que estás tratando de lograr es imposible de hacer con Selenium. El diálogo que se abre no es algo con lo que Selenium pueda interactuar.

Lo más page_source que podría hacer es recolectar el page_source que le brinda el HTML completo de una sola página y guardarlo en un archivo.

 import codecs completeName = os.path.join(save_path, file_name) file_object = codecs.open(completeName, "w", "utf-8") html = browser.page_source file_object.write(html) 

Si realmente necesita guardar todo el sitio web, debería utilizar una herramienta como AutoIT. Esto permitirá interactuar con el diálogo de guardado.

No se puede interactuar con los diálogos del sistema como el diálogo de guardar archivo. Si quieres guardar la página html puedes hacer algo como esto:

 page = driver.page_source file_ = open('page.html', 'w') file_.write(page) file_.close() 
 with open('page.html', 'w') as f: f.write(driver.page_source) 

Este es un ejemplo completo y funcional de la respuesta que RemcoW proporcionó:

Primero debe instalar un controlador web, por ejemplo, pip install selenium chromedriver_installer .

 #!/usr/bin/env python # -*- coding: utf-8 -*- # core modules import codecs import os # 3rd party modules from selenium import webdriver def get_browser(): """Get the browser (a "driver").""" # find the path with 'which chromedriver' path_to_chromedriver = ('/usr/local/bin/chromedriver') browser = webdriver.Chrome(executable_path=path_to_chromedriver) return browser save_path = os.path.expanduser('~') file_name = 'index.html' browser = get_browser() url = "https://martin-thoma.com/" browser.get(url) complete_name = os.path.join(save_path, file_name) file_object = codecs.open(complete_name, "w", "utf-8") html = browser.page_source file_object.write(html) browser.close() 

esto se puede lograr con la biblioteca pyautogui pero si tiene que guardar varias páginas en un bucle, no puede ejecutar ninguna otra tarea en la pantalla.

 import pyautogui import time pyautogui.hotkey('ctrl', 's') time.sleep(1) pyautogui.typewrite("file name") time.sleep(1) pyautogui.hotkey('enter')