【问题标题】:XPath to access a text after span跨度后访问文本的 XPath
【发布时间】:2018-10-19 15:32:00
【问题描述】:

我正在使用 Robot Framework 尝试访问动态表中的元素。我正在尝试单击“TestAuto”文本,该文本将引导我进入另一个页面,但我遇到了很大的困难。当代码中有“跨度”时,我总是很挣扎。希望有人可以给我一个创建正确xpath的指针。谢谢。

以下是示例代码:

<!DOCTYPE html>
<html>
<body>

<h1>My First Heading</h1>

<p>My first paragraph.</p>

<div class="col-sm-2">
<table>
<tbody>
<tr data-tryxpath-element="0">
<td class="st-m3">
<span class="bongobongo">Name:</span>
TestAuto
<br>
<span class="bongoemail">Email:</span>
bongo@mail.com
<br>
<span class="bongotel">Phone:</span>
+1234567890
</td>
</tbody>
</table>
<table>
<tbody>
<tr data-tryxpath-element="0">
<td class="st-m3">
<span class="bongobongo">Name:</span>
TestManual
<br>
<span class="bongoemail">Email:</span>
bongo123@mail.com
<br>
<span class="bongotel">Phone:</span>
+1234567891
</td>
</tbody>
</table>
</div>
</body>
</html>

我尝试了以下 xpath,但结果为负:

//div/table/tbody/tr/td[starts-with(@class,'table borderless mobile-list')] --> Useless anyway as it does not help to identify "TestAuto"
//div/table/tbody/tr/td//text()="TestAuto" --> Both tables are selected
//div/table/tbody/tr/td[normalize-space()='TestAuto'] --> Both tables are selected
//div/table/tbody/tr/td/span/following::text()="TestAuto" --> Both tables are selected

【问题讨论】:

    标签: xpath robotframework


    【解决方案1】:

    同一父级下&lt;span&gt; 之后的任何文本节点:

    //div/table/tbody/tr/td/span/following-sibling::text()
    

    在同一父级下&lt;span&gt; 之后的任何值为"TestAuto" 的文本节点:

    //div/table/tbody/tr/td/span/following-sibling::text()[. = "TestAuto"]
    

    任何第一个文本节点,其值为"TestAuto",跟在同一父级下的&lt;span&gt;之后:

    //div/table/tbody/tr/td/span/following-sibling::text()[1][. = "TestAuto"]
    

    任何具有"TestAuto" 值的文本节点立即在同一父级下的&lt;span&gt; 之后:

    //div/table/tbody/tr/td/span/following-sibling::node()[1][self::text() and . = "TestAuto"]
    

    ...仅在&lt;div&gt; 下的第一个&lt;table&gt; 中(如果有多个这样的&lt;div&gt;s,那仍然是多个匹配项!):

    //div/table[1]/tbody/tr/td/span/following-sibling::text()[1][. = "TestAuto"]
    

    ...仅在整个文档中的第一次出现(最多匹配一次):

    (//div/table/tbody/tr/td/span/following-sibling::text()[1][. = "TestAuto"])[1]
    

    注意您可能必须使用normalize-space(.) = "TestAuto" 而不是. = "TestAuto",以便修剪源代码中可能存在的空白。

    【讨论】:

    • 感谢您的解释。不幸的是,当我尝试以下操作时,他们都找不到该元素。有什么问题吗?
    • //div/table/tbody/tr/td/span/following-sibling::text()[. = "TestAuto"] //div/table/tbody/tr/td/span/following-sibling::text()[1][. = "TestAuto"] //div/table/tbody/tr/td/span/following-sibling::node()[1][self::text() 和 . = "TestAuto"] //div/table[1]/tbody/tr/td/span/following-sibling::text()[1][. = "TestAuto"] //div/table[1]/tbody/tr/td/span/following-sibling::text()[1][normalize-space(.) = "TestAuto"] //div/table [1]/tbody/tr/td/following-sibling::text()[1][normalize-space(.) = "TestAuto"]
    • 所有这些 XPath 表达式都经过测试并针对您的示例工作。您的实际数据不同并且“复制和粘贴”不起作用,我并不感到惊讶。我给出这么多例子的原因是为了让你更好地理解 XPath 是如何工作的,并自己找出正确的表达方式。
    • 是的,我明白你想要做什么。两天来,我一直在尝试各种组合,但没有成功。从理论上讲,我相信 '//div/table/tbody/tr/td/span[@class="bongobongo"]/following-sibling::text()[1][normalize-space(.)="Test Auto" ]' 应该管用。使用 Try XPath 进行测试,它突出显示了 2 个我不明白为什么的表。在使用 Robot Framework 时,它抱怨找不到 xpath。
    • 使用我的实际 xpath '//div/table/tbody/tr/td/span[@class="glyphicon glyphicon-star"]',到这个级别我检测 2 个跨度没有问题来自 2 张不同的桌子。这不是问题。在我添加 '/following-sibling::text()[1][normalize-space(.)="Test Auto"]' 的那一刻,即使“Test Auto”就在跨度之后,也没有找到任何东西。
    猜你喜欢
    • 2017-09-27
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多