尝试自动填写 google 表单文本框时如何在 Selenium 上修复 "IndexError"? (我使用 inspect element 来查找文本框的 class 名称)

How to fix "IndexError" on Selenium when trying to automate filling out google form text box? (I used inspect element to find class name of text-box)

本质上,我正在尝试 automate/autofill 一个 google 表单,方法是使用 selenium 并检查元素以查找 class 名称。当我尝试将文本输入到 google 表单的“简短回答”部分时,我尤其难以找到“IndexError”问题的解决方案。我是 Python 的初学者,如果这可能是一个非常低级的问题,我很抱歉。

from selenium import webdriver

option = webdriver.ChromeOptions()
option.add_argument("-incognito")

browser = webdriver.Chrome(executable_path="path to selenium")

option = webdriver.ChromeOptions()
option.add_argument("-incognito")
email = "my email address to sign into the google form"

browser = webdriver.Chrome(executable_path="path to selenium", options=option)
browser.get('url of google form')

sign_in = browser.find_elements_by_class_name("whsOnd zHQkBf")
sign_in[0].send_keys(email)

Next = browser.find_elements_by_class_name("VfPpkd-RLmnJb")
Next[0].click()

textboxes = browser.find_elements_by_class_name("quantumWizTextinputPaperinputInput exportInput")
textboxes[0].send_keys("name")
    
radio_buttons = browser.find_elements_by_class_name("freebirdFormviewerComponentsQuestionCheckboxRoot")
radio_buttons[1].click()


submit=browser.find_element_by_class_name("appsMaterialWizButtonPaperbuttonLabel quantumWizButtonPaperbuttonLabel exportLabel")
submit.click()

您确定 sign_in 中确实存储了任何内容吗?在我看来,那些 class 名称是在页面加载时自动生成的,因此可能实际上没有具有 class 名称“whsOnd zHQkBf”的 Web 元素。最好使用 xpath 并使用短格式输入字段的相对路径。这样,如果页面的总体布局发生变化,您仍然可以找到您的 Web 元素,从而使解决方案更加可靠。

已更新:

以下代码直接取自 Waits Selenium Python API 文档,可用于修复特定情况下的“NoSuchElement”异常或“元素不可交互”。

'''

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

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

'''

您可以使用 By.xpath 或任何其他过多的标识符。如果此代码超时,则表示您要查找的元素不存在。