Xpath - 复杂路径:如何通过引用不同 parent 中的另一个元素来查找元素?
Xpath - Complex Path: How to find a element by referencing another element in a different parent?
所以,我面临一个挑战,问题是网页有一种列表,其中有一些元素,旁边有文本和按钮,如下所示:
objective是通过引用特定的文本来点击按钮(因为所有按钮的文本都是一样的-"Button"),例如只点击[=的按钮51=] 和 "Element C"
我分析了 HTML 代码,尝试将 xpath 定位到我想要的按钮有点复杂(至少对我而言)
本质上,我会有一个变量来存储元素文本的字符串("Element A"、"Element B"...),然后我应该单击按钮链接到他们
HTML 代码看起来像这样(这些字符串是 类,仅供参考,但它们代表每个节点,如 div 或跨度和嵌套子节点;抱歉画得乱七八糟)
所以,我在这里迷路了,我试图寻找 parent 和祖先轴,但真的不太清楚如何正确实现正确的 xpath,
就像我正在尝试完成的参考一样,尽管我确定它不是正确的语法
//span[(text()='Element A')]/(查找包含元素文本和元素按钮的主 parent)/(查找 "Button" 里面的文本 parent 其中有 "Element A")
问题是,因为 lsit 上有很多元素,每个大师 parent 都不一样,这就是为什么我使用元素文本 ("Element A", "Element B"。 ..) 针对特定的 "Button"
非常感谢任何建议!
也许有一些使用轴或谓词的技巧?
谢谢!
HTML 页面的可操作部分,因为放置所有 HTML 代码不太实用,它很大
因此,例如,我所指的元素是:
- 塞娜的传奇地狱之刃 2
- 地狱之刃:赛娜的牺牲和赛娜的传奇
- 地狱之刃赛娜的牺牲
然后我需要根据我定位的元素文本定位所需的按钮(带有文本 "Share"),例如:Hellblade Senua's Sacrifice
<div aria-busy="false" class="o8kakjsu role="listbox">
<div class="a8s20v7p k5wvi7nf buofh1pr pfnyh3mw l9j0dhe7 du4w35lb">
<div>
<div class="rq0escxv">
<div class="rq0escxv">
<div class="rq0escxv ">
<div class="cbu4d94t e5nlhep0 aodizinl">
<div class="buofh1pr">
<div class="dati1w0a">
<div class="j83agx80 ">
<div class="knvmm38d">
<h2 class=" " dir="auto">
<div class="l9j0dhe7 stjgntxs ni8dbmo4" style="display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;">All</div>
</h2>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="muag1w35 b20td4e0">
<div data-vc-ignore-dynamic="1" style="padding-left: 8px; padding-right: 8px;">
<div class=" a8c37x1j">
<div class="">
<div class="">
<div class="">
<a aria-label="Senua's Saga Hellblade 2 Sacrifice" class="oajrlxb2" tabindex="0">
<div class="q9uorilb l9j0dhe7 pzggbiyp du4w35lb">
<svg class="" data-vc-ignore-dynamic="1" role="none" style="height: 40px; width: 40px;">
<mask id="jsc_c_4e">
<rect cy="20" fill="white" height="40" rx="8" ry="8" width="40" x="0" y="0"></rect>
</mask>
<g mask="url(#jsc_c_4e)">
<image x="0" y="0" height="100%"></image>
<rect class="mlqo0dh0 georvekb s6kb5r3f" cy="20" fill="white" height="40" rx="8" ry="8" width="40" x="0" y="0"></rect>
</g>
</svg>
</div>
</a>
</div>
</div>
<div class="ow4ym5g4 btwxx1t3 l9j0dhe7">
<div class="gs1a9yip">
<div class="" id="jsc_c_4d">
<div class="j83agx80 cbu4d94t ew0dbk1b irj2b8pg">
<div class="qzhwtbm6 knvmm38d"><span class="" dir="auto">Senua's Saga Hellblade 2 Sacrifice</span></div>
<div class="qzhwtbm6 knvmm38d"><span class="" dir="auto">Group</span></div>
</div>
</div>
</div>
<div class="bi6gxh9e ozuftl9m aov4n071 l9j0dhe7 o8rfisnq" aria-labelledby="jsc_c_4d">
<div class="bp9cbjyn j83agx80 btwxx1t3">
<div class="">
<div aria-label="Share" class="oajrlxb2 oo1teu6h " role="button" tabindex="0">
<div class="c4xchbtz by2jbhx6">
<div class="rq0escxv l9j0dhe7 "><span class="oi732d6d " dir="auto">Share</span></div>
</div>
<div class="" data-novc="1"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div data-vc-ignore-dynamic="1" style="padding-left: 8px; padding-right: 8px;">
<div class="ue3kfks5 pw54ja7n uo3d90p7 l82x9zwi a8c37x1j">
<div class="scb9dxdr">
<div class="nqmvxvec tvfksri0 aov4n071 l9j0dhe7">
<div class="">
<a aria-label="Hellblade: Senua's Sacrifice & Senua's Saga" class="oajrlxb2 tabindex="0">
<div class=" du4w35lb">
<svg class="pzggbiyp" data-vc-ignore-dynamic="1" role="none" style="height: 40px; width: 40px;">
<mask id="jsc_c_4g">
<rect cy="20" fill="white" height="40" rx="8" ry="8" width="40" x="0" y="0"></rect>
</mask>
<g mask="url(#jsc_c_4g)">
<image x="0" y="0" height="100%" ></image>
<rect class="mlqo0dh0 georvekb s6kb5r3f" cy="20" fill="white" height="40" rx="8" ry="8" width="40" x="0" y="0"></rect>
</g>
</svg>
</div>
</a>
</div>
</div>
<div class="btwxx1t3 l9j0dhe7">
<div class="">
<div class="" id="jsc_c_4f">
<div class=" ew0dbk1b irj2b8pg">
<div class="" dir="auto">Hellblade: Senua's Sacrifice & Senua's Saga</span></div>
<div class="qzhwtbm6 knvmm38d"><span class="hzawbc8m" dir="auto">group</span></div>
</div>
</div>
</div>
<div class="bi6gxh9e ozuftl9m aov4n071 l9j0dhe7 o8rfisnq" aria-labelledby="jsc_c_4f">
<div class="bp9cbjyn j83agx80 btwxx1t3">
<div class="">
<div aria-label="Share" class=" tv7at329" role="button" tabindex="0">
<div class="">
<div class=""><span class=" g0qnabr5" dir="auto">Share</span></div>
</div>
<div class="" data-novc="1"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div data-vc-ignore-dynamic="1" style="padding-left: 8px; padding-right: 8px;">
<div class="ue3kfks5 pw54ja7n uo3d90p7 l82x9zwi a8c37x1j">
<div class="">
<div class="nqmvxvec j83agx80 cbu4d94t bi6gxh9e tvfksri0 aov4n071 l9j0dhe7">
<div class="">
<a aria-label="AutoHotkey" class="oajrlxb2" tabindex="0">
<div class="q9uorilb l9j0dhe7 pzggbiyp du4w35lb">
<svg class="pzggbiyp" data-vc-ignore-dynamic="1" role="none" style="height: 40px; width: 40px;">
<mask id="jsc_c_4i">
<rect cy="20" fill="white" height="40" rx="8" ry="8" width="40" x="0" y="0"></rect>
</mask>
<g mask="url(#jsc_c_4i)">
<image x="0" y="0" "></image>
<rect class="mlqo0dh0 georvekb s6kb5r3f" cy="20" fill="white" height="40" rx="8" ry="8" width="40" x="0" y="0"></rect>
</g>
</svg>
</div>
</a>
</div>
</div>
<div class="">
<div class=" du4w35lb rj1gh0hx f10w8fjw pybr56ya">
<div class="" id="jsc_c_4h">
<div class="j83agx80 cbu4d94t ew0dbk1b irj2b8pg">
<div class="qzhwtbm6 knvmm38d"><span class="" dir="auto">AutoHotkey</span></div>
<div class="" dir="auto">Public group</span></div>
</div>
</div>
</div>
<div class="" aria-labelledby="jsc_c_4h">
<div class="bp9cbjyn j83agx80 btwxx1t3">
<div class="">
<div aria-label="Share" class="oajrlxb2" role="button" tabindex="0">
<div class="">
<div class=""><span class="" dir="auto">Share</span></div>
</div>
<div class="" data-novc="1"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
研究了很久,终于搞定了!
观看本教程:https://www.youtube.com/watch?v=a6B6XYbviRI
从那里我能够更好地理解 XPath 逻辑以及如何应对我的挑战,最后的 Xpath 是这个:
//span[(text()="Element A")]/parent::div/parent::div/parent::div/parent::div/parent::div//*[(text()="Button")]
对于那些不了解 Xpath 的人来说,这就像取一个起点(一个元素)并从那里精确导航(例如 parents 或您的情况)并以目标元素
如果有人知道如何做得更好,请!评论出来!
根据您的示例,这是您应该使用的。 "Hellblade: Senua's Sacrifice & Senua's Saga" 示例:
//div[.="Hellblade: Senua's Sacrifice & Senua's Saga"]/following::span[.="Share"][1]
我们寻找包含字符串变量的元素,然后是包含按钮文本的第一个元素。
所以,这应该可以为您的页面提供帮助:
//span[.="Element A"]/following::*[.="Button"][1]
所以,我面临一个挑战,问题是网页有一种列表,其中有一些元素,旁边有文本和按钮,如下所示:
objective是通过引用特定的文本来点击按钮(因为所有按钮的文本都是一样的-"Button"),例如只点击[=的按钮51=] 和 "Element C"
我分析了 HTML 代码,尝试将 xpath 定位到我想要的按钮有点复杂(至少对我而言)
本质上,我会有一个变量来存储元素文本的字符串("Element A"、"Element B"...),然后我应该单击按钮链接到他们
HTML 代码看起来像这样(这些字符串是 类,仅供参考,但它们代表每个节点,如 div 或跨度和嵌套子节点;抱歉画得乱七八糟)
所以,我在这里迷路了,我试图寻找 parent 和祖先轴,但真的不太清楚如何正确实现正确的 xpath, 就像我正在尝试完成的参考一样,尽管我确定它不是正确的语法
//span[(text()='Element A')]/(查找包含元素文本和元素按钮的主 parent)/(查找 "Button" 里面的文本 parent 其中有 "Element A")
问题是,因为 lsit 上有很多元素,每个大师 parent 都不一样,这就是为什么我使用元素文本 ("Element A", "Element B"。 ..) 针对特定的 "Button"
非常感谢任何建议! 也许有一些使用轴或谓词的技巧?
谢谢!
HTML 页面的可操作部分,因为放置所有 HTML 代码不太实用,它很大 因此,例如,我所指的元素是:
- 塞娜的传奇地狱之刃 2
- 地狱之刃:赛娜的牺牲和赛娜的传奇
- 地狱之刃赛娜的牺牲
然后我需要根据我定位的元素文本定位所需的按钮(带有文本 "Share"),例如:Hellblade Senua's Sacrifice
<div aria-busy="false" class="o8kakjsu role="listbox">
<div class="a8s20v7p k5wvi7nf buofh1pr pfnyh3mw l9j0dhe7 du4w35lb">
<div>
<div class="rq0escxv">
<div class="rq0escxv">
<div class="rq0escxv ">
<div class="cbu4d94t e5nlhep0 aodizinl">
<div class="buofh1pr">
<div class="dati1w0a">
<div class="j83agx80 ">
<div class="knvmm38d">
<h2 class=" " dir="auto">
<div class="l9j0dhe7 stjgntxs ni8dbmo4" style="display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;">All</div>
</h2>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="muag1w35 b20td4e0">
<div data-vc-ignore-dynamic="1" style="padding-left: 8px; padding-right: 8px;">
<div class=" a8c37x1j">
<div class="">
<div class="">
<div class="">
<a aria-label="Senua's Saga Hellblade 2 Sacrifice" class="oajrlxb2" tabindex="0">
<div class="q9uorilb l9j0dhe7 pzggbiyp du4w35lb">
<svg class="" data-vc-ignore-dynamic="1" role="none" style="height: 40px; width: 40px;">
<mask id="jsc_c_4e">
<rect cy="20" fill="white" height="40" rx="8" ry="8" width="40" x="0" y="0"></rect>
</mask>
<g mask="url(#jsc_c_4e)">
<image x="0" y="0" height="100%"></image>
<rect class="mlqo0dh0 georvekb s6kb5r3f" cy="20" fill="white" height="40" rx="8" ry="8" width="40" x="0" y="0"></rect>
</g>
</svg>
</div>
</a>
</div>
</div>
<div class="ow4ym5g4 btwxx1t3 l9j0dhe7">
<div class="gs1a9yip">
<div class="" id="jsc_c_4d">
<div class="j83agx80 cbu4d94t ew0dbk1b irj2b8pg">
<div class="qzhwtbm6 knvmm38d"><span class="" dir="auto">Senua's Saga Hellblade 2 Sacrifice</span></div>
<div class="qzhwtbm6 knvmm38d"><span class="" dir="auto">Group</span></div>
</div>
</div>
</div>
<div class="bi6gxh9e ozuftl9m aov4n071 l9j0dhe7 o8rfisnq" aria-labelledby="jsc_c_4d">
<div class="bp9cbjyn j83agx80 btwxx1t3">
<div class="">
<div aria-label="Share" class="oajrlxb2 oo1teu6h " role="button" tabindex="0">
<div class="c4xchbtz by2jbhx6">
<div class="rq0escxv l9j0dhe7 "><span class="oi732d6d " dir="auto">Share</span></div>
</div>
<div class="" data-novc="1"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div data-vc-ignore-dynamic="1" style="padding-left: 8px; padding-right: 8px;">
<div class="ue3kfks5 pw54ja7n uo3d90p7 l82x9zwi a8c37x1j">
<div class="scb9dxdr">
<div class="nqmvxvec tvfksri0 aov4n071 l9j0dhe7">
<div class="">
<a aria-label="Hellblade: Senua's Sacrifice & Senua's Saga" class="oajrlxb2 tabindex="0">
<div class=" du4w35lb">
<svg class="pzggbiyp" data-vc-ignore-dynamic="1" role="none" style="height: 40px; width: 40px;">
<mask id="jsc_c_4g">
<rect cy="20" fill="white" height="40" rx="8" ry="8" width="40" x="0" y="0"></rect>
</mask>
<g mask="url(#jsc_c_4g)">
<image x="0" y="0" height="100%" ></image>
<rect class="mlqo0dh0 georvekb s6kb5r3f" cy="20" fill="white" height="40" rx="8" ry="8" width="40" x="0" y="0"></rect>
</g>
</svg>
</div>
</a>
</div>
</div>
<div class="btwxx1t3 l9j0dhe7">
<div class="">
<div class="" id="jsc_c_4f">
<div class=" ew0dbk1b irj2b8pg">
<div class="" dir="auto">Hellblade: Senua's Sacrifice & Senua's Saga</span></div>
<div class="qzhwtbm6 knvmm38d"><span class="hzawbc8m" dir="auto">group</span></div>
</div>
</div>
</div>
<div class="bi6gxh9e ozuftl9m aov4n071 l9j0dhe7 o8rfisnq" aria-labelledby="jsc_c_4f">
<div class="bp9cbjyn j83agx80 btwxx1t3">
<div class="">
<div aria-label="Share" class=" tv7at329" role="button" tabindex="0">
<div class="">
<div class=""><span class=" g0qnabr5" dir="auto">Share</span></div>
</div>
<div class="" data-novc="1"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div data-vc-ignore-dynamic="1" style="padding-left: 8px; padding-right: 8px;">
<div class="ue3kfks5 pw54ja7n uo3d90p7 l82x9zwi a8c37x1j">
<div class="">
<div class="nqmvxvec j83agx80 cbu4d94t bi6gxh9e tvfksri0 aov4n071 l9j0dhe7">
<div class="">
<a aria-label="AutoHotkey" class="oajrlxb2" tabindex="0">
<div class="q9uorilb l9j0dhe7 pzggbiyp du4w35lb">
<svg class="pzggbiyp" data-vc-ignore-dynamic="1" role="none" style="height: 40px; width: 40px;">
<mask id="jsc_c_4i">
<rect cy="20" fill="white" height="40" rx="8" ry="8" width="40" x="0" y="0"></rect>
</mask>
<g mask="url(#jsc_c_4i)">
<image x="0" y="0" "></image>
<rect class="mlqo0dh0 georvekb s6kb5r3f" cy="20" fill="white" height="40" rx="8" ry="8" width="40" x="0" y="0"></rect>
</g>
</svg>
</div>
</a>
</div>
</div>
<div class="">
<div class=" du4w35lb rj1gh0hx f10w8fjw pybr56ya">
<div class="" id="jsc_c_4h">
<div class="j83agx80 cbu4d94t ew0dbk1b irj2b8pg">
<div class="qzhwtbm6 knvmm38d"><span class="" dir="auto">AutoHotkey</span></div>
<div class="" dir="auto">Public group</span></div>
</div>
</div>
</div>
<div class="" aria-labelledby="jsc_c_4h">
<div class="bp9cbjyn j83agx80 btwxx1t3">
<div class="">
<div aria-label="Share" class="oajrlxb2" role="button" tabindex="0">
<div class="">
<div class=""><span class="" dir="auto">Share</span></div>
</div>
<div class="" data-novc="1"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
研究了很久,终于搞定了! 观看本教程:https://www.youtube.com/watch?v=a6B6XYbviRI
从那里我能够更好地理解 XPath 逻辑以及如何应对我的挑战,最后的 Xpath 是这个:
//span[(text()="Element A")]/parent::div/parent::div/parent::div/parent::div/parent::div//*[(text()="Button")]
对于那些不了解 Xpath 的人来说,这就像取一个起点(一个元素)并从那里精确导航(例如 parents 或您的情况)并以目标元素
如果有人知道如何做得更好,请!评论出来!
根据您的示例,这是您应该使用的。 "Hellblade: Senua's Sacrifice & Senua's Saga" 示例:
//div[.="Hellblade: Senua's Sacrifice & Senua's Saga"]/following::span[.="Share"][1]
我们寻找包含字符串变量的元素,然后是包含按钮文本的第一个元素。
所以,这应该可以为您的页面提供帮助:
//span[.="Element A"]/following::*[.="Button"][1]