如何用Selenium处理带多属性div标签的下拉列表并选中指定选项
解决方案
你可以直接通过XPath的多属性匹配规则完成目标选项的定位,除了role属性之外,把你提到的data-makeup-index属性也加入匹配条件即可,还可以额外补充文本匹配规则进一步提高定位准确性,避免索引变动导致定位失效。
修正后的可运行代码
import bs4 from bs4 import BeautifulSoup import selenium from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.support.ui import Select from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait # 注意要导入By类,否则会抛出未定义异常 from selenium.webdriver.common.by import By driver = webdriver.Chrome(ChromeDriverManager().install()) url = 'https://www.ebay.com/b/Food-Beverages/14308/bn_1642947?listingOnly=1&rt=nc' driver.get(url) # 增加显式等待,避免元素未加载完成就操作导致报错 wait = WebDriverWait(driver, 10) button = wait.until(EC.element_to_be_clickable((By.ID, 'gh-shipto-click'))) button.click() button2 = wait.until(EC.element_to_be_clickable((By.ID, 'gh-shipto-click-body-cnt'))) button2.click() # 按data-makeup-index定位目标选项,修改target_index的值即可切换不同选项 target_index = "3" target_option = wait.until(EC.element_to_be_clickable((By.XPATH, f"//div[@role='menuitemradio' and @data-makeup-index='{target_index}']"))) # 若需要按国家名称定位,可以替换为下面的XPath,修改引号内的国家名即可 # target_option = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@role='menuitemradio' and contains(normalize-space(text()),'China')]"))) target_option.click()
注意事项
- 可根据实际需求修改
target_index的取值,对应你要选择的选项的data-makeup-index属性值 - 显式等待逻辑可以大幅降低页面加载慢、渲染延迟导致的操作失败概率,提高脚本稳定性
- 若选项索引可能发生变动,建议同时匹配
data-makeup-index和选项文本两个条件,进一步降低定位错误概率
内容的提问来源于stack exchange,提问作者Nok
相关产品推荐
相关产品推荐

