XPath在Chrome中有效但在Python Selenium中失效的问题求助
解决Selenium中XPath定位含单引号元素的报错问题
问题原因
你在Python代码里传递给execute_script的XPath表达式被错误转义,出现了"这类HTML实体,这不属于合法的XPath语法,导致document.evaluate执行失败。
解决方案
方案1:修正execute_script中的字符串转义
让传递给JS的XPath和原生JS里的格式一致,调整Python的字符串嵌套与转义方式:
from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from webdriver_manager.chrome import ChromeDriverManager window = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install())) window.get("www.someurl.com") # 用三重单引号包裹JS代码,内部双引号直接转义 window.execute_script(''' singleQuotes = document.evaluate("//div[contains(text(), \"'quotes'\")]", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); singleQuotes = singleQuotes.snapshotItem(0); console.log(singleQuotes); ''')
也可以换用单引号嵌套的方式,避免双引号转义:
window.execute_script(""" singleQuotes = document.evaluate('//div[contains(text(), \'\'quotes\'\')]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); singleQuotes = singleQuotes.snapshotItem(0); console.log(singleQuotes); """)
方案2:直接使用Selenium原生定位方法(更简洁)
没必要通过execute_script调用document.evaluate,Selenium本身支持直接用XPath定位元素:
from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By window = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install())) window.get("www.someurl.com") # 方法A:双引号包裹XPath,内部单引号直接使用 element = window.find_element(By.XPATH, "//div[contains(text(), \"'quotes'\")]") # 方法B:单引号包裹XPath,内部单引号用两个单引号转义 element = window.find_element(By.XPATH, '//div[contains(text(), ''\'quotes''\')]') # 方法C:字符串格式化动态传入目标文本 target_text = "'quotes'" element = window.find_element(By.XPATH, f"//div[contains(text(), '{target_text}')]") print(element)
内容的提问来源于stack exchange,提问作者tonitone120
相关产品推荐
相关产品推荐

