仅查找属性完全匹配的HTML节点

时间:2011-06-28 12:28:19

标签: python xpath selenium beautifulsoup lxml

我正在进行Selenium测试,我想断言一个特定的HTML节点是完全匹配的,只要存在哪些属性及其值(顺序不重要),并且还没有其他属性存在。例如,给出以下片段:

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

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

  • <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解决方案,但这让我感到极为优雅。

3 个答案:

答案 0 :(得分:2)

如何测试valuename属性是否存在,以及属性总数是否为2:

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

答案 1 :(得分:1)

如果你不喜欢XPath,你也可以使用CSS定位器。这是一个片段,用于计算注册精确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][...]");

答案 2 :(得分:0)

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

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

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

  2. 将类添加到您关注的字段中。在任何样式表中都没有提到类。事实上,我使用此类进行表单字段验证,方法是使用decimal numberalpha number

  3. 等类