{} 中元素的 XPATH 语法,Selenium for Python
XPATH syntax for element in {} with Selenium for Python
我目前正在尝试在 Python 中使用 Selenium 单击网页上的每个按钮,每个按钮的 class 和文本始终相同,但每个按钮都有不同的 ID。然而,这些 ID 在 {} 的“数据参数”中,我无法弄清楚如何获得 xpath 的正确语法。
以下是其中一个按钮的网站片段:
<span class="contains-icon-details gc-btn gc-btn--s" data-isneededpromise="false" data-parameters="{"partner":"gs", "realId": "8da1d6a9-44d1-4556-bc12-92699749a30a", "tnId": "102086182829", "type": "details"}">More Details</span>
似乎 realId 和 tnId 是唯一的,所以我需要找到其中之一的按钮。
这个有效:
driver.find_element_by_xpath("//span[@class='contains-icon-details gc-btn gc-btn--s']").click()
但当然只针对第一个按钮,因为 class 始终相同。
我试过这样的事情:
driver.find_element_by_xpath("//*[contains(@tnId, '102086182829')]").click()
但我明白了
Unable to locate element: //*[contains(@tnId, '102086182829')]
所以绝对不是正确的语法。
我试图在网上找到解决方案,但到目前为止还没有成功。谁能指出我正确的方向?提前致谢。
如果 realId
值或 tnId
值是唯一的,您的 XPath 可以是
driver.find_element_by_xpath("//*[contains(@data-parameters, '8da1d6a9-44d1-4556-bc12-92699749a30a')]").click()
或
driver.find_element_by_xpath("//*[contains(@data-parameters, '102086182829)]").click()
您应该按“数据参数”属性进行过滤。
尝试
driver.find_element_by_xpath("//span[contains(@data-parameters, '102086182829')]").click()
这是您所需要的肮脏实现。最好提取数据参数字段,反序列化 JSON 并检查所需的字段;
spans = driver.find_element_by_xpath("//span[@class='contains-icon-details gc-btn gc-btn--s']")
for span in spans:
data_parameters = span.get_attribute("data-parameters")
try:
data_parameters = json.loads(data_parameters)
except:
continue
if 'tnId' in data_parameters and data_parameters['tnId'] == "102086182829":
span.click()
break
我目前正在尝试在 Python 中使用 Selenium 单击网页上的每个按钮,每个按钮的 class 和文本始终相同,但每个按钮都有不同的 ID。然而,这些 ID 在 {} 的“数据参数”中,我无法弄清楚如何获得 xpath 的正确语法。 以下是其中一个按钮的网站片段:
<span class="contains-icon-details gc-btn gc-btn--s" data-isneededpromise="false" data-parameters="{"partner":"gs", "realId": "8da1d6a9-44d1-4556-bc12-92699749a30a", "tnId": "102086182829", "type": "details"}">More Details</span>
似乎 realId 和 tnId 是唯一的,所以我需要找到其中之一的按钮。
这个有效:
driver.find_element_by_xpath("//span[@class='contains-icon-details gc-btn gc-btn--s']").click()
但当然只针对第一个按钮,因为 class 始终相同。
我试过这样的事情:
driver.find_element_by_xpath("//*[contains(@tnId, '102086182829')]").click()
但我明白了
Unable to locate element: //*[contains(@tnId, '102086182829')]
所以绝对不是正确的语法。
我试图在网上找到解决方案,但到目前为止还没有成功。谁能指出我正确的方向?提前致谢。
如果 realId
值或 tnId
值是唯一的,您的 XPath 可以是
driver.find_element_by_xpath("//*[contains(@data-parameters, '8da1d6a9-44d1-4556-bc12-92699749a30a')]").click()
或
driver.find_element_by_xpath("//*[contains(@data-parameters, '102086182829)]").click()
您应该按“数据参数”属性进行过滤。
尝试
driver.find_element_by_xpath("//span[contains(@data-parameters, '102086182829')]").click()
这是您所需要的肮脏实现。最好提取数据参数字段,反序列化 JSON 并检查所需的字段;
spans = driver.find_element_by_xpath("//span[@class='contains-icon-details gc-btn gc-btn--s']")
for span in spans:
data_parameters = span.get_attribute("data-parameters")
try:
data_parameters = json.loads(data_parameters)
except:
continue
if 'tnId' in data_parameters and data_parameters['tnId'] == "102086182829":
span.click()
break