No se puede encontrar el_elemento_by_id cuando el elemento se crea a través de execute_script

Actualmente estoy usando python 3.6.5, selenium versión 3.14.0

Si he creado un elemento web como el siguiente:

driver.execute_script("""var body = document.getElementsByTagName('body').item(0);var div = document.createElement('div');div.setAttribute('id', 'ZZZ');body.appendChild(div);""") 

No pude usar algo como lo siguiente:

  wait.until( expected_conditions.presence_of_element_located( (By.ID, 'ZZZ') ) ) 

He comprobado dos veces que el elemento se haya creado correctamente pero utilizando las API proporcionadas por el paquete selenium (por ejemplo, find_element_by_id, y scripts como arriba) no pude localizar el elemento.

Pregunta: ¿Hay algo más que deba hacer después de inyectar nuevos elementos después de execute_script? ¿O actualmente, no es posible?

Aunque puedo obtener el elemento a través de lo siguiente:

 new_element = driver.execute_script('return document.getElementById("ZZZ");') 

Pero esto será difícil para mí si no pudiera usar las API predeterminadas proporcionadas por el paquete de selenium (por ejemplo, find_element_by_id)

El siguiente código funciona para mí:

 driver.get('http://www.google.com') elem = driver.find_element_by_name("q") driver.execute_script("var body = document.getElementsByTagName('body').item(0);var div = document.createElement('div');div.setAttribute('id', 'ZZZ');body.appendChild(div);") element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "ZZZ")) ) driver.quit() 

La respuesta de @KireetiAnnamaraj fue simplemente perfecta. Además, si desea validar que la presencia del elemento agregado dentro del HTML puede print() el outerHTML del elemento utilizando la siguiente solución:

  • Bloque de código:

     from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC options = webdriver.ChromeOptions() options.add_argument("start-maximized") options.add_argument('disable-infobars') driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe') driver.get('http://www.google.com') elem = driver.find_element_by_name("q") driver.execute_script("var body = document.getElementsByTagName('body').item(0);var div = document.createElement('div');div.setAttribute('id', 'ZZZ');body.appendChild(div);") element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "ZZZ"))) print(element.get_attribute("outerHTML")) driver.quit() 
  • Salida de consola: