Mi código Python Selenium a continuación descarga un archivo de forma de Río de Janeiro.
import time, os from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import Select options = webdriver.ChromeOptions() preferences= {"download.default_directory": os.getcwd(), "directory_upgrade": True} options.add_experimental_option("prefs", preferences) #options.headless = True options.add_experimental_option('excludeSwitches', ['enable-logging']) url = "https://www.data.rio/datasets/limite-bairro/explore?location=-22.900784%2C-43.509500%2C10.83" # Path of my WebDriver driver = webdriver.Chrome(ChromeDriverManager().install(), options=options) wait = WebDriverWait(driver, 10) # to maximize the browser window driver.maximize_window() #get method to launch the URL driver.get(url) wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#ember104"))).click() time.sleep(10) driver.execute_script('document.querySelector("#ember50 > div > div > div:nth-child(1) > div.download-panel > div > div:nth-child(8) > hub-download-card").shadowRoot.querySelector("calcite-card > div > calcite-dropdown > calcite-button").click()') time.sleep(10) driver.execute_script('document.querySelector("#ember50 > div > div > div:nth-child(1) > div.download-panel > div > div:nth-child(8) > hub-download-card").shadowRoot.querySelector("calcite-card > div > calcite-dropdown > calcite-dropdown-group > calcite-dropdown-item:nth-child(1)").click()')
Mientras funciona, quiero saber cómo usar esta sintaxis dentro del marco de las condiciones esperadas, es decir, en lugar de tener que decirle a Selenium que duerma durante diez segundos, ¿cómo usaría
wait.until()
con Javascript, por lo que no necesito establecer explícitamente el tiempo de espera de diez segundos; después de todo, ¿qué sucede si tomó menos de diez segundos? ¿Alguna idea de cómo podría hacer esto?
Puede pasar el elemento web devuelto a través de execute_script() como un argumento para las condiciones esperadas de element_to_be_clickable() e invocar el clic de la siguiente manera:
wait = WebDriverWait(driver, 10) wait.until(EC.element_to_be_clickable(driver.execute_script("return document.querySelector("#ember50 > div > div > div:nth-child(1) > div.download-panel > div > div:nth-child(8) > hub-download-card").shadowRoot.querySelector("calcite-card > div > calcite-dropdown > calcite-button")"))).click()