【问题标题】:Matching element id's with JSF dynamic view Id将元素 ID 与 JSF 动态视图 ID 匹配
【发布时间】:2012-09-24 10:26:32
【问题描述】:

我正在使用 JSF 1.2。我们想编写一些 selenium 测试(基于 xpath),但 xpath 似乎没有元素 id 的通配符匹配。

我们无法关闭前缀 ID,因为我们在 IBM Portal Server 6.1 中作为 portlet 运行,并且我们的应用程序在前缀关闭的环境中中断。

目前我们正在使用格式为

的 xpath

//*[substring(@id, 54)='id_distributorName']

将匹配: <select size="1" class="firstName" name="viewns_7_8000CB1A0GUIE0IJF799CR10O2_:commonEntryForm:id_distributorName" id="viewns_7_8000CB1A0GUIE0IJF799CR10O2_:commonEntryForm:id_distributorName" >

但令我震惊的是,假设 JSF 将始终生成相同长度的 viewId 是危险的。

有没有更好的方法来做到这一点?

我们已经尝试为我们的输入控件使用name 属性,但当然 JSF 会忽略该属性并写入它自己的 name 属性,其值与 id 可能是出于处理脚本的原因)

【问题讨论】:

    标签: jsf xpath selenium


    【解决方案1】:

    如果您使用的是 XPath 2.0,只需使用 ends-with() 函数:

    //*[ends-with(@id, ':id_distributorName')]
    

    如果您使用的是 XPath 1.0,请使用 string-length() 来计算 substring() 的开头:

    //*[substring(@id, string-length(@id) - 18) = ':id_distributorName']
    

    这里,18 是id_distributorName 的长度(没有: 前缀!)。

    【讨论】:

      【解决方案2】:

      好的,我刚刚回答了我自己的问题。

      我承认我对 xpath 知之甚少,这是我的借口!

      答案是使用contains()

      //*[contains(@id, 'id_distributorName')]

      【讨论】:

      • 这也会匹配像foo:id_distributorName:barmyid_distributorNames这样的ID,不是很健壮。
      【解决方案3】:

      使用

      //*[substring-after(@id, ':commonEntryForm:') = 'id_distributorName']
      

      【讨论】:

        猜你喜欢
        • 2016-02-22
        • 2014-10-29
        • 1970-01-01
        • 2018-09-10
        • 2020-05-08
        • 1970-01-01
        • 2016-03-13
        • 2019-10-01
        • 2013-03-06
        相关资源
        最近更新 更多