Selecionando especificamente o menu suspenso de formulário do Google usando selênio sem a tag de seleção em python

Nov 25 2020

Tenho tentado encontrar uma maneira de selecionar uma opção suspensa de formulários do Google por meio de selênio e python, mas até agora não tive sucesso.

Tentei várias maneiras, incluindo a classe Select (que não funciona devido ao formulário suspenso não usar a tag select). Bem como XPATH. Mas só cheguei a clicar na lista suspensa, mas não consegui selecionar as opções dentro da lista suspensa. Qualquer ajuda seria muito apreciada!

Preciso ser capaz de especificar qual opção suspensa escolher com base no texto / valor das várias opções.

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()

O erro que recebo é que nenhum elemento desse tipo foi encontrado, embora este seja o XPATH que encontrei ao inspecionar o menu suspenso de acordo.

Criei um formulário de exemplo aqui para referência: https://forms.gle/prBMqgVVFNv5KWQQA

Isso não ajudou, pois usa a classe Select, por favor, não sinalize esta questão como uma duplicata como tal

Como selecionar / obter a opção suspensa no Selenium 2

Como selecionar um valor de menu drop-down com Selenium usando Python?

Usar um webdriverwait também não pareceu funcionar, conforme detalhado nesta postagem:

Automatize o menu suspenso no Selenium sem selecionar

Respostas

1 SariqShaikh Nov 26 2020 at 07:50

O problema é que a caixa de seleção não aparecerá mesmo se seu xpath estiver correto até que você passe o mouse sobre esse elemento, passar o mouse sobre esse elemento o torna clicável. Você pode usar o código abaixo para passar o mouse sobre o elemento da caixa de seleção e depois tentar clicar e selecionar o 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 aqui:

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()

Observe que não verifiquei que esta forma de seleção preserva as informações do formulário, pois não enviei o formulário. Você pode testar e verificar.