Wybieranie listy rozwijanej formularza Google przy użyciu selenu bez znacznika wyboru w Pythonie

Nov 25 2020

Próbowałem znaleźć sposób na wybranie opcji rozwijanej z formularzy Google poprzez selen i Python, ale jak dotąd nie udało mi się.

Wypróbowałem kilka sposobów, w tym klasę Select (która nie działa, ponieważ formularz rozwijany nie używa tagu select). Oprócz XPATH. Ale dotarłem tylko do kliknięcia listy rozwijanej, ale nie mogąc wybrać opcji na wspomnianej liście rozwijanej. Każda pomoc byłaby bardzo mile widziana!

Muszę być w stanie określić, którą opcję rozwijaną wybrać na podstawie tekstu / wartości w różnych opcjach.

KOD:

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

Błąd, który otrzymuję, polega na tym, że nie znaleziono takiego elementu, mimo że jest to XPATH, który znalazłem odpowiednio po sprawdzeniu menu rozwijanego.

Utworzyłem tutaj przykładowy formularz w celach informacyjnych: https://forms.gle/prBMqgVVFNv5KWQQA

To nie pomogło, ponieważ używa klasy Select, proszę nie oznaczać tego pytania jako duplikatu

Jak wybrać / uzyskać rozwijaną opcję w Selenium 2

Jak wybrać wartość menu rozwijanego za pomocą Selenium przy użyciu Pythona?

Używanie webdriverwait również nie wydawało się działać tak, jak opisano w tym poście:

Zautomatyzuj rozwijane menu w Selenium bez wyboru

Odpowiedzi

1 SariqShaikh Nov 26 2020 at 07:50

Problem polega na tym, że pole wyboru nie wyskakuje, nawet jeśli twoja ścieżka xpath jest poprawna, dopóki nie najedziesz na ten element, najechanie kursorem na ten element sprawia, że ​​jest on klikalny. Możesz użyć poniższego kodu, aby najechać kursorem na element pola wyboru, a następnie spróbować kliknąć i wybrać element

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

Pełny kod tutaj:

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

Zwróć uwagę, że nie zweryfikowałem, czy ten sposób wyboru zachowuje informacje w formularzu, ponieważ nie wysłałem formularza. Możesz to przetestować, zweryfikować.