【问题标题】:How to write locator for text between div and span (Preferably xpath) which contains non-breaking space (&nbsp)如何为包含不间断空格的 div 和 span(最好是 xpath)之间的文本编写定位器(&nbsp)
【发布时间】:2018-08-07 16:23:01
【问题描述】:

我想为以下 div 编写 xpath

<div class='someclass' id='someid'>:TEST&nbsp;SELENIUM&nbsp;1234<div>

请注意:

  1. tag 可以是任何东西,例如 div、span 或锚标记。
  2. &amp;nbsp; 可以出现在文本中的任何位置。

到目前为止我已经尝试过

//div[contains(text(),":TEST SELENIUM 1234")]

//div[contains(text(),":TEST{&nbsp;}SELENIUM{&nbsp;}1234")] 

//div[contains(text(),":TEST&nbsp;SELENIUM&nbsp;1234")] 

//div[normalize-space(text()) = ':TEST SELENIUM 1234']

//div[normalize-space(text()) = ':TEST{&nbsp;}SELENIUM{&nbsp;}1234']

//div[normalize-space(text()) = ':TEST&nbsp;SELENIUM&nbsp;1234']

//div[normalize-space(.) = ':TEST SELENIUM 1234']  

//div[normalize-space(.) = ':TEST{&nbsp;}SELENIUM{&nbsp;}1234']  

//div[normalize-space(.) = ':TEST&nbsp;SELENIUM&nbsp;1234']  

//div[normalize-space(.) = ':TEST{\u00a0}SELENIUM{\u00a0}1234']  

//div[normalize-space(.) = ':TEST${nbsp}SELENIUM${nbsp}1234']  

什么对我有用(感谢@Andersson)

//div[starts-with(text(), ":TEST") and substring(text(), 7)="SELENIUM" and  substring(text(), 16)="1234"]  

这更像是一种变通方法,仅适用于已知字符串。

这些是我已经关注的 SO 帖子:

Link1
Link2

任何帮助将不胜感激。

【问题讨论】:

  • 你如何测试这个?是xPath 2.0,对吧?在 Chrome 和 Firefox 中它不起作用
  • 你为什么不用//div[starts-with(text(), ":TEST") and contains(text(), "SELENIUM")]?这将返回所有包含两个文本的 div,而不考虑它们之间的空格。并且您可以根据需要添加更多and 条件。
  • 如果你想让它通用而不是开发,使用这个代码://*[starts-with(text(), ":TEST") and contains(text(), "SELENIUM")]
  • @AndreiSuvorkov 是的!我只是给了一个建议,以防万一,如果我们需要使用多个contains,我们可以这样做。
  • 但是您知道您在 excel 中传递的文本将用于创建元素。在运行时使用相同的文本创建 xpath。

标签: selenium xpath xpath-2.0


【解决方案1】:

根据上面的对话,你可以使用这个示例xPathbuilder(JAVA):

public class Test {
    public static void main(String[] args) {
        String s = ":TEST&nbsp;SELENIUM&nbsp;1234";
        String[] parts = s.split("&nbsp;");
        StringBuilder xpath = new StringBuilder("//*");

        for (int i = 0; i < parts.length; i++){
            xpath.append((i == 0) ? "[contains(text(), '" + parts[i] + "')" : " and contains(text(), '" + parts[i] + "')");
        }
        xpath.append("]");

        System.out.println(xpath);
    }
}

输出:

//*[contains(text(), ':TEST') and contains(text(), 'SELENIUM') and contains(text(), '1234')]

【讨论】:

  • 看起来挺复杂的,我试一试。这可能需要一些时间。无论如何感谢您的回答。
  • @cruisepandey 我很确定,这里有优化这段代码的空间。这只是一个快速而肮脏的例子;)
  • @RajKamal:如果您有更好的解决方案或可以优化相同的代码,我们将不胜感激。
  • @cruisepandey 我已经编辑了我的答案,稍微优化了代码并修复了一些错误。请看一下
【解决方案2】:

在 Python 中我会这样做

required_div = [div for div in driver.find_elements_by_xpath('//div') if div.text == ':TEST SELENIUM 1234'][0] 

通过忽略不间断空格字符的完整文本内容查找所需节点

附:同样,这只是一种解决方法,但似乎是非常简单的解决方案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2016-02-20
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多