当前位置: 首页 > 面试题库 >

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

巫马望
2023-03-14
问题内容

我正在努力让Selenium经历大量替代条件XPath,寻找 可能匹配的 元素,并将其传递给对象elmnt

当前,使用OR运算符(|),代码很快变得非常重复和详尽,特别是当存在很多可能的变化时。

在下面的例子中,唯一的变化是,我开始寻找h1h2h3。其余部分相同。

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在注释中self::建议的轴):

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

请注意,这个测试的 字符串值_的h1,或者h2,或者h3包含的值word变量(而不是直接文本节点的字符串值)。另外,如果你想真正的测试,这些元素的字符串值 _是 不是_包含_ word,使用[.='%s']来代替。



 类似资料:
  • 例如与CSS选择器一起使用,但如何使用XPath表达式呢?

  • 有没有一种方法可以让这段代码更短或更蟒蛇的方式,而不是写很多ands或ors?

  • 问题内容: 考虑我有以下示例XML文件: 将其扁平化为一组xpath表达式的最佳(最有效)方法是什么。另请注意:我想忽略任何名称空间和属性信息。(如果需要,也可以将其作为预处理步骤来完成)。 所以我想作为输出: 我正在用Java实现。 编辑: PS,在文本节点上没有数据的情况下,我也可能需要此方法,因此,例如,以下代码应生成与上述相同的输出: 问题答案: 您可以使用XSLT轻松完成此操作。查看示例

  • 问题内容: 我正在使用这样的构造: 但是我需要选择所有以“某些文本”开头的文本的链接,所以我想知道这里是否可以使用regexp?在lxml文档中找不到任何内容 问题答案: 您可以执行此操作(尽管该示例不需要正则表达式)。Lxml支持来自EXSLT扩展功能的正则表达式。(请参阅XPath类的lxml文档,但该方法也适用于该方法) 请注意,您需要提供名称空间映射,以便它知道xpath表达式中的“ re

  • 问题内容: Swift的这个成语很有道理 但是,我 真正 想要的是 如所写,这不是不正确的,但是这个想法可行吗? 问题答案: Swift 1.2更新 从Swift 1.2开始,允许展开多个可选选项,因此您现在可以编写此代码,如示例所示: 您甚至可以交错条件,例如: 以前在Swift 1.2之前有效 这是在没有难看的强制包扎的情况下的方法: 实际上,它仍然很冗长。 之所以可行,是因为表单的可选类型实

  • 主要内容:示例XPath表达式通常定义模式以便选择一组节点。 这些模式由XSLT用于执行转换,或者由用于寻址。 XPath规范指定了七种类型的节点,这些节点可以是XPath表达式的执行输出。 根 元素 文本 属性 注释 处理指令 命名空间 XPath使用路径表达式从XML文档中选择节点或节点列表。 以下是从XML文档中选择节点/节点列表的路径和表达式列表。 序号 表达式 描述 1 选择具有给定名称的所有节点。