Seleccionar específicamente el menú desplegable de formularios de Google usando selenio sin etiqueta de selección en Python

Nov 25 2020

He estado tratando de encontrar una manera de seleccionar una opción desplegable de formularios de Google a través de selenium y python, pero hasta ahora no he tenido éxito.

Intenté varias formas, incluida la clase Seleccionar (que no funciona debido a que el formulario desplegable no usa la etiqueta de selección). Además de XPATH. Pero solo he llegado a hacer clic en el menú desplegable, pero no he podido seleccionar las opciones dentro de dicha lista desplegable. ¡Cualquier ayuda será muy apreciada!

Necesito poder especificar qué opción desplegable elegir según el texto / valor en las diversas opciones.

CÓDIGO:

browser.find_element_by_xpath("//div[@class='quantumWizMenuPaperselectOptionList']").click() 
browser.find_element_by_xpath("//div[@class='freebirdThemedSelectOptionDarkerDisabled']/div[@class='quantumWizMenuPaperselectOption'][@data-value='1.05pm - 3.55pm']").click()

El error que obtengo es que no se encuentra dicho elemento a pesar de que este es el XPATH que encontré al inspeccionar el menú desplegable en consecuencia.

He creado un formulario de ejemplo aquí como referencia: https://forms.gle/prBMqgVVFNv5KWQQA

Esto no ayudó, ya que utiliza la clase Seleccionar, no marque esta pregunta como duplicada como tal

Cómo seleccionar / obtener la opción desplegable en Selenium 2

¿Cómo seleccionar un valor de menú desplegable con Selenium usando Python?

El uso de un webdriverwait tampoco pareció funcionar como se detalla en esta publicación:

Automatizar el menú desplegable en Selenium sin seleccionar

Respuestas

1 SariqShaikh Nov 26 2020 at 07:50

El problema es que el cuadro de selección no aparecerá incluso si su xpath es correcto hasta que coloque el cursor sobre ese elemento, al colocar el cursor sobre ese elemento se puede hacer clic. Puede usar el siguiente código para desplazarse sobre ese elemento del cuadro de selección y luego intentar hacer clic y seleccionar el elemento

selectBox = WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.XPATH, "//div[@role='listbox']")))
action = ActionChains(browser);
action.move_to_element(selectBox).perform()

Código completo aquí:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
url = 'https://docs.google.com/forms/d/e/1FAIpQLScosZjmDrvgUvh77tXsaAb24hKVgaBnjJfJz2BX1PvoqIO1Ow/viewform'
text = '1.05pm-3.55pm'
browser.maximize_window()
browser.get(url)
selectBox = WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.XPATH, "//div[@role='listbox']")))
action = ActionChains(browser);
action.move_to_element(selectBox).perform()
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@role='listbox']")))
selectBox.click()

selectionXpath = "//div[@class='exportSelectPopup quantumWizMenuPaperselectPopup appsMaterialWizMenuPaperselectPopup']//span[@class='quantumWizMenuPaperselectContent exportContent' and text()='"+text+"']"
selection = WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.XPATH, selectionXpath)))
selection.click()

Tenga en cuenta que no he verificado que esta forma de selección conserve la información en el formulario ya que no he enviado el formulario. Puedes probarlo y verificarlo.