如何在XPath中使用多个变量定位元素并点击?
如何在XPath中使用多个变量定位元素并点击?
嘿,我来帮你搞定这个问题!你之前的XPath写法有两处关键错误,咱们一步步来修正:
问题出在哪?
你写的XPath里用了@span='"+ oddstype +"' and @span='"+ oddsnumber +"',这相当于在找同一个元素同时拥有两个span属性,且值分别是Barcelona和1.18——但实际页面里这两个值是属于两个不同的<span>标签,而且它们的属性是class不是span,这就导致定位完全不对啦。
正确的定位方式
根据你给出的页面结构,这两个<span>是同一个<div>的子元素,咱们可以通过父元素关联这两个条件,或者直接通过兄弟元素来定位。这里给你两种靠谱的写法:
写法1:通过父div同时匹配两个子span
先找到包含目标名称和赔率的父div,再点击它(因为通常这种投注项的点击区域是整个div):
oddsnumber = "1.18" oddstype = "Barcelona" # 等待元素可点击,定位到符合条件的父div target_element = WebDriverWait(driver, 20).until( EC.element_to_be_clickable( (By.XPATH, f"//div[contains(@class, 'gl-Participant') and .//span[@class='gl-Participant_Name' and text()='{oddstype}'] and .//span[@class='gl-Participant_Odds' and text()='{oddsnumber}']]") ) ) target_element.click()
写法2:通过兄弟span关联定位
也可以先找到赔率的span,再通过它的兄弟名称span反向定位到父div:
oddsnumber = "1.18" oddstype = "Barcelona" target_element = WebDriverWait(driver, 20).until( EC.element_to_be_clickable( (By.XPATH, f"//span[@class='gl-Participant_Odds' and text()='{oddsnumber}']/preceding-sibling::span[@class='gl-Participant_Name' and text()='{oddstype}']/parent::div") ) ) target_element.click()
小提示
- 用Python的f-string来拼接XPath字符串比加号更清晰,也不容易出错;
- 确保
text()的内容和页面上的完全一致(比如有没有空格、大小写问题),如果有动态空格,可以用contains(text(), '{oddstype}')替代精确匹配。
备注:内容来源于stack exchange,提问作者JakeM
相关产品推荐
相关产品推荐

