Pythonでselectタグなしでseleniumを使用して特にgoogleフォームのドロップダウンを選択する

Nov 25 2020

私はグーグルフォームからセレンとパイソンを介してドロップダウンオプションを選択する方法を見つけようとしてきましたが、これまでのところ成功していません。

Selectクラス(ドロップダウンフォームがselectタグを使用していないために機能しない)を含むいくつかの方法を試しました。XPATHと同様に。しかし、ドロップダウンをクリックするだけで、ドロップダウンリスト内のオプションを選択することはできません。どんな助けでも大歓迎です!

さまざまなオプションのテキスト/値に基づいて、選択するドロップダウンオプションを指定できる必要があります。

コード:

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

私が得るエラーは、これがドロップダウンメニューをそれに応じて調べて見つけたXPATHであるにもかかわらず、そのような要素が見つからないということです。

参考のために、ここにサンプルフォームを作成しました。 https://forms.gle/prBMqgVVFNv5KWQQA

Selectクラスを使用しているため、これらは役に立ちませんでした。この質問に重複としてフラグを立てないでください。

Selenium2でドロップダウンオプションを選択/取得する方法

Pythonを使用してSeleniumでドロップダウンメニュー値を選択するにはどうすればよいですか?

webdriverwaitを使用しても、この投稿で詳しく説明されているようにうまくいかなかったようです。

選択せずにSeleniumのドロップダウンメニューを自動化

回答

1 SariqShaikh Nov 26 2020 at 07:50

問題は、xpathが正しい場合でも、その要素にカーソルを合わせるまで選択ボックスがポップアップしないことです。その要素にカーソルを合わせると、クリック可能になります。以下のコードを使用して、その選択ボックス要素にカーソルを合わせ、要素をクリックして選択してみてください。

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

ここに完全なコード:

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

フォームを送信していないため、この選択方法でフォームの情報が保持されることを確認していないことに注意してください。あなたはそれをテストして検証することができます。