Elemento no visible a pesar de la disponibilidad en el documento en Python Selenium

Enlace a la página: https://contacts.google.com/u/1/?pageId=none

Deseado: quiero seleccionar todos los contactos haciendo clic en el icono resaltado SVG resaltado en la imagen adjunta.

Problema que enfrenta: obtener un elemento de error no visible en svgicon.click() . Aunque el elemento está claramente disponible en DOM visible según la imagen adjunta.

Observación: me he dado cuenta de que si hacemos clic manualmente en el ícono de caret, el código html DropDown se inserta a través de JavaScript y en cualquier otro cuerpo, al hacer clic en él, se eliminará el código html DropDown.

Sé que la siguiente statement de código utilizada para lograr lo deseado es correcta y funciona, pero no está poblando DropDown. Cualquier ayuda es muy apreciada.

 //find & click on SVG icon svgicon = driver.find_element_by_css_selector('div.PFdmz .uzHa0d .RANAid[role="button"]') svgicon.click() //click on all link post dropdown appears wait5.until(EC.presence_of_element_located((By.XPATH, '//div[@class = "jO7h3c" and text() = "All"]'))).click() 

Imagen DOM

Imagen DOM

EDIT 1 – Ejemplo de esfuerzo de Javascript para seleccionar todas las casillas de verificación

 t=0 for _ in range(len(driver.find_elements_by_css_selector('.XXcuqd div[role="checkbox"]'))): cimgs = driver.find_elements_by_css_selector('.XXcuqd div[role="checkbox"]') ActionChains(driver).move_to_element(cimgs[t]).perform() driver.execute_script("arguments[0].click();", cimgs[t]) t = t+1 

Si de alguna manera podemos usar este método para reducir el tiempo necesario para marcar todas las casillas de verificación marcadas (de una vez en lugar de usar Actionchains), esto también solucionará el problema. En cualquier momento tendré más de 10000 contactos para esta actividad.

Por alguna razón necesita hacer doble clic en el icono:

 import selenium from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains import time driver=webdriver.Firefox() # Log into Google. url = "https://accounts.google.com/signin/v2/identifier?hl=en&passive=true&continue=https%3A%2F%2Fwww.google.com%2F&flowName=GlifWebSignIn&flowEntry=ServiceLogin" driver.get(url) time.sleep(1) username = driver.find_element_by_id('identifierId') username.send_keys("REDACTED") time.sleep(1) driver.find_element_by_id('identifierNext').click() time.sleep(1) password = driver.find_element_by_name('password') password.send_keys("REDACTED") time.sleep(1) driver.find_element_by_id('passwordNext').click() time.sleep(1) url="https://contacts.google.com/" driver.get(url) time.sleep(1) # Select the first contact and click on it to open the desired menu. contact = driver.find_element_by_css_selector("div[role='checkbox']") contact.click() time.sleep(1) # Double click the selected action icon to open menu. svgicon = driver.find_element_by_css_selector("div[data-tooltip='Selection actions']") ActionChains(driver).move_to_element(svgicon).double_click().perform() time.sleep(1) # Click the "All" button. selectall = driver.find_element_by_xpath("//*/div[text()='All']") selectall.click() 

En tu primer ejemplo de código,

 svgicon = driver.find_element_by_css_selector('div.PFdmz .uzHa0d .RANAid[role="button"]') 

el selector coincide con cuatro elementos, y la checkbox que busca es la cuarta. Si aún no lo has hecho, por favor intenta

 svgicon = driver.find_elements_by_css_selector('div.PFdmz .uzHa0d .RANAid[role="button"]')[3] 

En lugar de esa línea.

Estoy inmediatamente seguro del ejecutor JS, pero podría echar un vistazo si el código anterior no funciona.

No sé por qué, pero el código de Dan-dev realiza el resultado que necesita, lo he probado y funciona bien para mí. En este caso, solo pondré otra alternativa a lo que he hecho antes, cuando encontré un problema similar como el tuyo que de alguna manera podría funcionar para ti. Aquí está mi código:

 from selenium.webdriver.support.ui import Select #From Dan-dev's code svgicon = driver.find_element_by_css_selector("div[data-tooltip='Selection actions']") ActionChains(driver).move_to_element(svgicon).double_click().perform() #Alternative/Optional Solution driver.execute_script("return arguments[0].removeAttribute('style');", svgicon) selectall = Select(svgicon) for option in selectall.options: selectall.select_by_visible_text('All') 

Bueno, después de invertir más de 15 días en investigación, aprendizaje y SO ayuda comunitaria, nada funcionó como se esperaba, por lo que tuve que elegir la segunda opción (indeseable) para cumplir con el propósito.

Respuesta de trabajo

 # get total contacts count from left side menu displayed number totalcount = driver.find_element_by_css_selector('span.jlpDMe[dir="ltr"]').get_attribute('innerHTML') time.sleep(1) cimg = driver.find_elements_by_css_selector('div.XXcuqd div[role="checkbox"]') #t=1 because **div[data-tooltip='Selection actions']** is also a checkbox & we don't want that to be a part of loop t=1 while t < int(totalcount)+1: driver.execute_script("arguments[0].click();", cimg[t]) t+= 1 

Este método es mucho más rápido que usar Actionchains que había mostrado en EDIT 1: muestra el esfuerzo de Javascript para seleccionar todas las casillas de verificación .

De todos modos, gracias a todos por poner tu mente en resolver un rompecabezas, aunque sigue siendo un rompecabezas para mí. Pero considerando la cantidad de esfuerzos realizados por todos, el propietario de la recompensa es @ Dan-Dev. Gracias @ Dan-Dev y sigue ayudando a gente como nosotros.