【问题标题】:Finding Only HTML Nodes Whose Attributes Match Exactly仅查找属性完全匹配的 HTML 节点
【发布时间】:2011-09-24 06:48:25
【问题描述】:

我正在通过 Selenium 测试,我想断言特定的 HTML 节点与存在的属性及其值(顺序不重要)以及不存在其他属性完全匹配。例如给出以下片段:

<input name="test" value="something"/>

我正在尝试提出一种在 HTML 输出中断言其存在的好方法,以便以下(任意)示例不匹配:

  • <input name="test" value="something" onlick="doSomething()"/>
  • <input name="test" value="something" maxlength="75"/>
  • <input name="test" value="something" extraneous="a" unwanted="b"/>

我相信我可以编写如下的 XPath 语句来查找所有这些,例如:

//input[value='something' and @name='test']

但是,我还没有想出如何以一种通用方式排除不完全匹配的方式编写。请注意,它不一定是 XPath 解决方案,但我认为这是最优雅的可能性。

【问题讨论】:

    标签: python xpath selenium beautifulsoup lxml


    【解决方案1】:

    如何测试valuename 属性是否存在,并且属性总数正好是2:

    //input[@value='something' and @name='test' and count(attribute::*)=2]
    

    【讨论】:

    • 属性计数是个好主意。我应该想到这一点。
    • +1 简洁可靠。也许你可以使用缩写语法//input[@value='something' and @name='test' and count(@*)=2]
    【解决方案2】:

    如果您不喜欢 XPath,也可以使用 CSS 定位器。这是一个 sn-p 来计算注册精确 CSS 匹配的元素数量 -

    private int getCSSCount(String aCSSLocator){ 
            String jsScript = "var cssMatches = eval_css(\"%s\", window.document);cssMatches.length;"; 
            return Integer.parseInt(selenium.getEval(String.format(jsScript, aCSSLocator))); 
        }
    

    不确定如何排除属性,但可以指定附加属性-

    int count = getCSSCount("input[name=test][maxlength=75][...]");
    

    【讨论】:

    【解决方案3】:

    无法使用 XPath 排除意外属性。

    所以你必须找到一种更安全的方法来定位你想要的元素。您应该考虑的事项:

    1. form 中,每个input 都应该有一个不同的名称。 form 本身也是如此。所以你可以试试//form[@name='...']/input[@name='...']

    2. 为您关心的字段添加一个类。任何样式表中都没有提到类。事实上,我通过使用 decimal numberalpha number 之类的类将其用于表单字段验证

    【讨论】:

      猜你喜欢
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      相关资源
      最近更新 更多