gpt4 book ai didi

python - 如何使用许多 OR 替代项来缩短长 XPath 表达式?

转载 作者:数据小太阳 更新时间:2023-10-29 02:34:02 28 4
gpt4 key购买 nike

我正在努力让 Selenium 通过大量可选的条件 XPath,寻找可能匹配的元素——并将其传递给对象 elmnt .

目前,使用 OR运算符 ( | ),代码很快就会变得非常重复和详尽,尤其是当有很多可能的变化时。

在下面的示例中,唯一的变化是我开始寻找 h1 , h2 , 或 h3 .其余相同。

for word in ["testString1", "testString2", "testString3"]:

try:
elmnt = driver.find_element_by_xpath(
(
"//h1[text()[contains(., '%s')]]" % word +
"/following::p" +
"|" +
"//h1[text()[contains(., '%s')]]" % word +
"/following::span" +

"|" +

"//h2[text()[contains(., '%s')]]" % word +
"/following::p" +
"|" +
"//h2[text()[contains(., '%s')]]" % word +
"/following::span" +

"|" +

"//h3[text()[contains(., '%s')]]" % word +
"/following::p" +
"|" +
"//h3[text()[contains(., '%s')]]" % word +
"/following::span"
)
).text
except:
pass
else:
print elmnt
break

但在我的实际代码中,我会考虑更多变体,包括 /following:: 中的各种节点类型除了pspan .

问题:有什么方法可以简化(缩短)这个吗?

我的第一个希望是可以做类似的事情:

"//[h1|h2|h3][text()[contains(., '%s')]]" % word

即那or运算符可以“融入”XPath 表达式,而不必像示例中那样使用完全详尽的字符串连接。如果是这样,这个想法就可以全面应用。

然而,这似乎是不可能的。

解决方案是创建某种生成函数来创建整个 xPath 字符串,还是其他?

最佳答案

我会使用这个缩短的 XPath(利用 @alecxe in a comment 推荐的 self:: 轴):

  "//*[self::h1 or self::h2 or self::h3][contains(., '%s')]" % word
+ "/following::*[self::p or self::span]"

请注意,这会测试 h1h2h3字符串值是否包含该值word 变量(而不是直接文本节点的字符串值)。此外,如果您想实际测试这些元素的字符串值 而不是 包含 word,请使用 [.=' %s'] 代替。

关于python - 如何使用许多 OR 替代项来缩短长 XPath 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37910443/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com