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

2023-12-01

我正在努力让 Selenium 遍历大量替代条件 XPath,寻找满足以下条件的元素:可能匹配– 并将其传递给对象elmnt.

目前,使用OR操作员 (|),代码很快就会变得非常重复和详尽,尤其是当存在很多可能的变化时。

在下面的示例中,唯一的变化是我开始寻找h1, h2, or 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::除了p and span.

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

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

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

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

然而,这似乎不可能。

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


我会使用这个缩短的 XPath(利用self::轴推荐@alecxe 在评论中):

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

请注意,这测试了字符串值 of h1, or h2, or h3包含的值word变量(而不是直接文本节点的字符串值)。另外,如果您想实际测试这些元素的字符串值are而不是contains word, use [.='%s']反而。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用许多 OR 替代方案来缩短长 XPath 表达式? 的相关文章

随机推荐

  • 如果 id 匹配,则从 mysql 选择行

    我想从 mysql 中选择与特定 id 匹配的行 我想获取ID是否匹配的结果 如果数据库中不存在该ID 则不应该执行任何操作 我这样运行 q SELECT FROM entries where id 1 result mysql query
  • Visual Studio 2017 - Git 因致命错误而失败

    我使用的是 Visual Studio 2017 Community Edition CE 并且已登录我的 Microsoft 帐户并连接到 VSTS 我可以看到我的所有项目和存储库 但是当我尝试拉 取 推送任何更改时 我收到以下错误 Er
  • 设置包括 Wamp 上 PEAR 的路径

    安装 PEAR 并按照上的说明进行操作http www phpunit de manual current en installation html pear config set auto discover 1 pear install
  • 从资源加载dll库到当前域(在主exe文件中嵌入dll)

    我尝试使用以下代码在运行时加载 dll 库 这样我就不必向用户提供大量 dll 文件以及主可执行文件 我已将所有 dll 文件作为嵌入式资源包含在内 并且在参考部分中我已包含它们并设置了复制本地属性为 false 但这里的问题是 1 所有d
  • 在 Firebase 中检索嵌套数据 - Android

    我刚刚进入 firebase 和 android 的世界 我按照在线教程设置和获取非嵌套数据并将其显示在列表视图中 如下所示 数据之前 mListView ListView findViewById R id ListView final
  • UIView 背景颜色影响 iOS 5 中的触摸

    我有一个在 iOS 4 中运行的具有子类触摸响应的自定义视图 在 iOS 5 上 当沿着视图的底部边缘触摸时 这些触摸根本不会响应 if视图的背景颜色设置为clearColor 我一直无法追踪到这一点 但有谁知道 iOS 5 是否改变了视图
  • 如何让 perf stat 支持 KVM 中的“分支”、“分支未命中”等硬件事件

    我想通过 分支未命中 硬件事件来评估一个进程的性能 但是当我使用 perf stat 获取 分支未命中 数据时 它总是返回 0 因为我的操作系统位于 KVM 中 因为我拿一台真机来做测试比较麻烦 所以我想知道当我在 KVM 中时 有什么方法
  • 具有多个模板的 ASP Repeater 控件

    如何拥有具有多个模板的转发器控件 其中选择的模板基于项目的类型 这就是我目前所拥有的 我的复读班 ToolboxData lt 0 LifestreamRepeater runat server gt public class Lifest
  • 变异观察者产生无限循环

    我正在使用 jQuery 的突变观察器编写一个函数来注册对 DOM 的更改 特别是在添加新节点时 以便我可以更改其内容 SELeCTOR GOOD click function var targetNode this find conten
  • 表达 sendfile 和重定向 url

    我有一堆中间件 一开始app use我测试该过程是否受到胁迫 如果是 我希望它只发送静态 index html文件并将用户的浏览器重定向到 req url 例如 app set port PORT etc app use function
  • 设置 R_LIBS 并避免“您想使用个人库吗?”

    我的个人库在 Renviron中设置为R LIBS R lib 当我从 rstudio 安装软件包时 这非常有效 当我尝试从普通 R 控制台会话安装新软件包时 它总是询问我 Would you like to use a personal
  • 可以使用缓冲读取来计算 MD5(或其他)哈希值吗?

    我需要计算相当大的文件 千兆字节 的校验和 这可以使用以下方法来完成 private byte calcHash string file System Security Cryptography HashAlgorithm ha Syste
  • 向非引用类型添加生命周期约束

    我试图弄清楚如何应用 Rust 生命周期来向 Erlang NIF 模块添加一些编译时强制 NIF 模块是通常用 C 编写的提供扩展的共享库 用 C 语言编写的回调的简化原型如下所示 Handle my nif function Heap
  • 如何在 Zend Framework 2 中获取控制器名称、操作名称

    我在 Zend Framework 2 中有一个默认模块 namespace Application Controller use Zend Mvc Controller AbstractActionController use Zend
  • 任一类型包含不同类型

    原始帖子已编辑为简化示例 我想创建一个组件 该组件将采用一对值 这两个值都基于相同类型 gt value setValue 并且基于它 将运行取决于这些类型的函数 为了充分说明情况 AnimalAndCatTypes ts export i
  • 如何使用 C 从用户空间获取 Linux 中的驱动器标签

    我需要在 Linux 中使用 c c 并且没有 d bus 获取特定设备的标签 问题是我不能只打开设备并读取它的信息 对于 extN 来说 很容易从设备获取标签 因为从 dev xxx 读取需要 root 权限 我认为现在在大多数发行版中都
  • 从 FullCalendar (jQuery) 中删除事件源时出现问题

    就在那时 我正在使用全日历显示来自多个源的事件 一些是本地 JSON feed 另一些来自 Google Calendar 我实现了一项功能 当复选框分别为 true 或 false 时 可以显示 隐藏单个日历 我正在使用这段代码来实现它
  • 如何从Delphi运行命令行?

    如何从我的 Delphi 应用程序运行此命令 C myapppath appfolder gt appname exe stext save txt 我尝试了以下代码 ShellExecute 0 nil cmd exe cd C myap
  • 在 SetWindowPos() 中获取跨线程操作无效

    我试图从与创建表单的线程不同的线程访问表单 最后出现错误 跨线程操作无效 Code public static void MakeTopMost Form form SetWindowPos form Handle HWND TOPMOST
  • 如何使用许多 OR 替代方案来缩短长 XPath 表达式?

    我正在努力让 Selenium 遍历大量替代条件 XPath 寻找满足以下条件的元素 可能匹配 并将其传递给对象elmnt 目前 使用OR操作员 代码很快就会变得非常重复和详尽 尤其是当存在很多可能的变化时 在下面的示例中 唯一的变化是我开