Sélection de la liste déroulante du formulaire Google en utilisant le sélénium sans balise de sélection en python

Nov 25 2020

J'ai essayé de trouver un moyen de sélectionner une option de liste déroulante parmi les formulaires Google via le sélénium et le python, mais j'ai jusqu'à présent échoué.

J'ai essayé plusieurs méthodes, y compris la classe Select (qui ne fonctionne pas en raison du formulaire déroulant n'utilisant pas la balise select). Ainsi que XPATH. Mais je suis seulement arrivé à cliquer sur le menu déroulant sans pouvoir sélectionner les options dans ladite liste déroulante. Toute aide serait grandement appréciée!

Je dois être en mesure de spécifier quelle option de liste déroulante choisir en fonction du texte / de la valeur dans les différentes options.

CODE:

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

L'erreur que j'obtiens est qu'aucun élément de ce type n'est trouvé même s'il s'agit du XPATH que j'ai trouvé en inspectant le menu déroulant en conséquence.

J'ai créé un exemple de formulaire ici pour référence: https://forms.gle/prBMqgVVFNv5KWQQA

Cela n'a pas aidé car il utilise la classe Select, veuillez ne pas marquer cette question comme un doublon en tant que tel

Comment sélectionner / obtenir l'option déroulante dans Selenium 2

Comment sélectionner une valeur de menu déroulant avec Selenium en utilisant Python?

L'utilisation d'un webdriverwait ne semble pas non plus faire l'affaire comme détaillé dans cet article:

Automatiser le menu déroulant dans Selenium sans sélectionner

Réponses

1 SariqShaikh Nov 26 2020 at 07:50

Le problème est que la boîte de sélection ne s'affiche pas même si votre xpath est correct jusqu'à ce que vous survoliez cet élément, survoler cet élément le rend cliquable. Vous pouvez utiliser le code ci-dessous pour survoler cet élément de la zone de sélection et essayer de cliquer et de sélectionner l'élément

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

Code complet ici:

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

Notez que je n'ai pas vérifié que ce mode de sélection préserve les informations du formulaire car je n'ai pas soumis le formulaire. Vous pouvez le tester, le vérifier.