selenium - 如何在文档的棘手部分(对我而言)中创建 Xpath,以便在 VBA 中与 Selenium Basic 一起使用
问题描述
好的,所以我提到了 Selenium Basic,因为那是 XPath 的使用,我相信 Selenium Basic 使用 Selenium 版本 2,所以它可能无法理解可能需要最新 Selenium 的部分/所有答案。但如有必要,有人可能会考虑到这一点。
这里有动态类。
选择标准。
1.必须使用以'NextToJump__eventWrapper'(外层)开头的类。
2.以 'NextToJump__venue' 开头的类必须包含 text = 'Ballarat'
3.以“NextToJump__race”(和/或跨度)开头的类必须包含 text = 'Race 2'
我需要能够点击<a>
包含第 2 点和第 3 点的标签。
我在 Chrome Devtools 中使用 ChroPath 能够做到(并检查)的最好的事情是......
//div[starts-with(@class,'NextToJump__eventWrapper')]//descendant::*[contains(text(),'Ballarat')]
但请注意,HTML 中有 2 个第 2 点,但只有 1 个满足第 2 点和第 3 点的情况。
谢谢
<div class="NextToJump__eventWrapper--13zZJ">
<div>
<div class="NextToJump__raceEvent--bfMON" data-testid="next-to-jump-item">
<a class="Link__link--9x4YY" href="/racing-betting/greyhound-racing/crayford-am/20200708/race-1-1801951-58544404">
<div class="NextToJump__iconWrapper--1yG60"></div>
<div class="NextToJump__eventDetail--CUzdX">
<div class="NextToJump__venue--1jwWA">Ballarat</div>
<div class="NextToJump__race--3JydR"><span>Race 1</span></div>
</div>
<div class="NextToJump__countdown--EG8mR"><span class="Countdown__countdown--4vRpD Countdown__imminent--2yc2K">52s</span></div>
</a>
</div>
<div class="NextToJump__raceEvent--bfMON" data-testid="next-to-jump-item">
<a class="Link__link--9x4YY active" href="/racing-betting/greyhound-racing/rockhampton/20200708/race-4-1799474-58466521" aria-current="page">
<div class="NextToJump__iconWrapper--1yG60"></div>
<div class="NextToJump__eventDetail--CUzdX">
<div class="NextToJump__venue--1jwWA">Rockhampton</div>
<div class="NextToJump__race--3JydR"><span>Race 4</span></div>
</div>
<div class="NextToJump__countdown--EG8mR"><span class="Countdown__countdown--4vRpD Countdown__imminent--2yc2K">2m 52s</span></div>
</a>
</div>
<div class="NextToJump__raceEvent--bfMON" data-testid="next-to-jump-item">
<a class="Link__link--9x4YY" href="/racing-betting/greyhound-racing/ballarat/20200708/race-4-1799454-58465201">
<div class="NextToJump__iconWrapper--1yG60"></div>
<div class="NextToJump__eventDetail--CUzdX">
<div class="NextToJump__venue--1jwWA">Ballarat</div>
<div class="NextToJump__race--3JydR"><span>Race 2</span></div>
</div>
<div class="NextToJump__countdown--EG8mR"><span class="Countdown__countdown--4vRpD Countdown__imminent--2yc2K">5m 52s</span></div>
</a>
</div>
</div>
</div>
解决方案
您需要用于选择目标<a>
标签的 xpath 表达式很长且令人费解,但这就是生命.... [为便于阅读而格式化,但您可以在一行中使用它]
//a
[ancestor::div[starts-with(@class,'NextToJump__eventWrapper')]]
[.//div[.="Ballarat"]
[starts-with(@class,'NextToJump__venue-')]
[./following-sibling::div[.="Race 2"]
[starts-with(@class,'NextToJump__race-')]
]
]
编辑:在“简单的英语”中:
找到一个<a>
满足所有这些条件的节点 (i) 有一个祖先节点(不是父节点),它是 a <div>
,它<div>
有一个class
属性名称以NextToJump__eventWrapper
;开头的属性。并且(ii)它具有<div>
后代(不仅仅是子)节点,该节点具有Ballarat
作为文本节点并且具有以class
开头的属性名称的属性NextToJump__venue-
,其中该<div>
后代本身具有以下兄弟姐妹,该兄弟姐妹<div>
本身具有Race 2
文本节点 AND 具有class
属性名称以NextToJump__race-
...开头的属性
是的,“普通”这个词在这里并不合适,但这是我能得到的最接近的词。我喜欢 xpath,它非常强大,但有时很难理解……顺便说一句,如果使用 xquery 而不是直接的 xpath,它会稍微不那么神秘。
推荐阅读
- concurrency - ConcurrentHashMap中如何同时对同一段进行两次读取操作?
- visual-studio - 如何:使用 CMake 构建系统在 Visual Studio 中附加包含 C++ 项目的路径?
- node.js - 如果我使用循环(for)发送带有令牌数据的推送而不考虑人数,是否有任何问题?
- mongodb - Javascript - 切换 xp 系统(mongodb 和 discord.js 与 discord-xp api)
- angular - 为什么文件上传给出错误无法读取未定义的nativeElement?
- swift - 强制发布者发布更新?
- java - Java Webhook 监听器
- acumatica - 如何在 Acumatica 中更改基础货币
- android - 我的应用程序结果在真实应用程序中与在 android studio 中的结果完全不同,我不知道为什么
- ios - swift中以编程方式的十六进制颜色与主故事板不同