求助:使用Selenium自动随机选择Google表单单选按钮的XPath问题
解决Selenium操作Google表单单选按钮的问题
原代码的问题点
- 定位颜色选项时,错误混用定位方式:用
"class name"作为定位策略,却传入了XPath表达式,完全不符合Selenium的定位规则。 - 单选按钮不能通过
send_keys()选择,必须点击对应的选项元素才能完成选择。 - 提交表单后没有回到新的表单页面,循环执行第二次时会找不到输入字段,因为此时页面停留在提交成功的提示页。
修复后的完整代码
from selenium import webdriver from selenium.webdriver.common.by import By from faker import Faker import random import time driver = webdriver.Chrome() driver.get("https://forms.gle/PL3W5TxZVVJHRa1W9") faker = Faker() colors = ["Green", "Blue", "Black", "Red"] # 注意文本要和表单上的完全匹配(大小写一致) for i in range(20): # 生成测试数据 name = faker.name() age = random.randint(18, 99) country = faker.country() email = faker.email() selected_color = random.choice(colors) # 填写姓名、年龄、国家、邮箱 name_field = driver.find_element(By.XPATH, '//*[@id="mG61Hd"]/div[2]/div/div[2]/div[1]/div/div/div[2]/div/div[1]/div/div[1]/input') name_field.send_keys(name) age_field = driver.find_element(By.XPATH, '//*[@id="mG61Hd"]/div[2]/div/div[2]/div[2]/div/div/div[2]/div/div[1]/div/div[1]/input') age_field.send_keys(str(age)) country_field = driver.find_element(By.XPATH, '//*[@id="mG61Hd"]/div[2]/div/div[2]/div[3]/div/div/div[2]/div/div[1]/div/div[1]/input') country_field.send_keys(country) email_field = driver.find_element(By.XPATH, '//*[@id="mG61Hd"]/div[2]/div/div[2]/div[4]/div/div/div[2]/div/div[1]/div/div[1]/input') email_field.send_keys(email) # 随机选择颜色单选按钮 # 通过选项的aria-label属性定位(表单上的颜色文本要和colors列表里的完全一致) color_option = driver.find_element(By.XPATH, f'//div[@aria-label="{selected_color}"]') color_option.click() # 提交表单 submit_button = driver.find_element(By.CSS_SELECTOR, "[type='submit']") submit_button.click() # 等待页面加载,然后点击"提交另一份响应"回到表单页面 time.sleep(1) another_response_btn = driver.find_element(By.XPATH, '//a[contains(text(), "提交另一份响应")]') another_response_btn.click() time.sleep(1) driver.quit()
关键修复说明
- 单选按钮定位:Google表单的每个单选按钮选项,都会有一个
aria-label属性对应选项的文本,直接通过这个属性定位对应的元素并点击即可完成选择。注意要保证colors列表里的文本和表单上显示的完全一致(包括大小写)。 - 表单重置:提交成功后,必须点击页面上的"提交另一份响应"按钮,才能回到空白表单继续填写,否则循环后续的元素定位都会失败。
- 定位方式规范:统一使用
By类来指定定位策略,代码更清晰规范,避免原代码中混用定位方式的错误。
内容的提问来源于stack exchange,提问作者Rishav Pandit
相关产品推荐
相关产品推荐

