Python+Selenium如何定位点击含唯一data-order-group-id属性的REPEAT ORDER按钮
解决方法
你不需要依赖唯一的data-order-group-id属性定位单个按钮,直接通过所有REPEAT ORDER按钮共有的通用特征批量匹配所有元素即可,以下是可直接使用的代码示例:
方法1:通过按钮专属class定位(最推荐,性能最高)
所有目标按钮都带有repeat-order-button专属类名,直接用该类名匹配所有按钮即可:
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.Chrome() # 替换为你的目标页面地址 driver.get("你的页面URL") # 等待所有按钮加载完成,最长等待10秒 wait = WebDriverWait(driver, 10) repeat_buttons = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "repeat-order-button"))) # 循环点击所有按钮 for btn in repeat_buttons: btn.click() # 如果点击后页面会跳转/刷新,需要在这里添加等待逻辑,回到列表页后重新获取按钮列表再继续循环,避免元素失效报错
方法2:通过属性存在匹配
如果担心class会变动,可以匹配所有带data-order-group-id属性的按钮:
# 替换上述代码中的元素定位行即可 repeat_buttons = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "button[data-order-group-id]")))
方法3:通过按钮文本匹配
如果前面的特征都不可用,可以用文本匹配定位:
# 替换上述代码中的元素定位行即可 repeat_buttons = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//button[normalize-space(text())='REPEAT ORDER']")))
特殊场景注意
如果点击单个按钮后会触发页面刷新/跳转,不要直接遍历第一次获取的按钮列表,会触发StaleElementReferenceException错误,此时可以先提取所有按钮的data-order-group-id存到列表,再循环遍历id逐个定位点击:
# 先存储所有订单的唯一id order_ids = [btn.get_attribute("data-order-group-id") for btn in repeat_buttons] # 逐个定位点击 for order_id in order_ids: btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, f'button[data-order-group-id="{order_id}"]'))) btn.click() # 这里添加回到订单列表页的逻辑和对应等待
内容的提问来源于stack exchange,提问作者user14178341
相关产品推荐
相关产品推荐

