首页 > 解决方案 > 如何在文档的棘手部分(对我而言)中创建 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>

标签: seleniumxpath

解决方案


您需要用于选择目标<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,它会稍微不那么神秘。


推荐阅读