【问题标题】:Xpath. Unable to select text of label - when another element like <input> is between the <label> tagsXpath。无法选择标签文本 - 当 <input> 等另一个元素位于 <label> 标签之间时
【发布时间】:2017-10-07 23:13:18
【问题描述】:

Java 开发人员和 Xpath 新手。谷歌搜索和 RTFM-ed 相当多,但卡住了。公司有一个使用 Java Wicket 框架用 Java 编写的大型 Web 应用程序。将 Selenium 与 Cucumber 和 Junit 结合使用进行测试。因此需要编写大量的 Xpath 表达式。 坚持以下。

一个屏幕,带有一个表单和两个切换按钮 () 以及它后面的文本。相关sn-p。

    <label>
    <input id="idf1" name="removeConditionViaTreeStep:resultsRadioGroup" value="radio3" checked="checked" type="radio"> 
    Safe to delete
    </label>

    <label>
    <input id="idf2" name="removeConditionViaTreeStep:resultsRadioGroup" value="radio4" type="radio">
    Unsafe to delete
    </label>

注意:使用 Wicket 框架意味着属性 id 和 value 每次应用程序运行时/可以不同,因此不能使用它们。也不能更改 html。

A计划 我想通过使用标签文本作为 uniq 选择器来选择特定的切换(并模拟单击/选择它),但标签之间存在 .. 的事实给我带来了问题。在干净标签的情况下,我可以毫无问题地选择某个标签。 在这种情况下,无法使 //label[contains(text(),'Unsafe to delete')] 之类的东西起作用。

放弃并选择 B 计划。

使用 firepath 插件进行 firebug 测试并得出以下结果://input[@name='removeConditionViaTreeStep:resultsRadioGroup'] 这会导致两场比赛中的火路。我希望使用 [2] 之类的东西来选择第二个切换,但无法弄清楚。

C 计划 - 诉诸 Java 和 Xpath 行之有效。
列表元素 = findElementsByXpath("//input[@name='removeConditionViaTreeStep:resultsRadioGroup']"); elements.get(1) // 选择第二个切换。

有这种感觉“//label[contains(text(),'Unsafe to delete')]”不起作用,因为所有内容都是流式传输的,并且 Selenium 的 Webdriver 没有任何内容保存在内存中。因此元素会破坏流或类似的东西......

也许有人可以给出一些提示和指点,甚至是 A 和 B 计划的解决方案。

Edit 更正了 Bill Hileman 提到的右括号拼写错误。

【问题讨论】:

  • 试试"//label[normalize-space()='Unsafe to delete']"
  • 你试过类似elements.getAtrribute("textContent");

标签: java html selenium xpath cucumber


【解决方案1】:

我知道您说您不能更改 HTML,但也许您可以在测试环境中以 wickets 开发模式运行应用程序?这样,如果我没记错的话,wicket:id 应该会被渲染,这样您就可以更轻松地选择元素。

【讨论】:

  • 测试需要在生产模式下针对 wicket 应用程序运行。开发模式在渲染页面上引入了一些 selenium 不喜欢的额外内容。否则我什至可以做一些jdev.it/testing-a-wicket-application-with-selenium-ide 中提到的事情。但是团队在几年前就决定不这样做,因为 html 会被污染很多,而且我们有复杂的页面,如果要添加一些东西,它会很容易破坏测试。那是开发人员告诉我的。顺便说一句,感谢 cmets。
【解决方案2】:

您输入的 xpath 尝试是:

//label[contains(text(),'Unsafe to delete'] 

除非这只是一个错字,否则你错过了一个右括号。

//label[contains(text(),'Unsafe to delete')] 

xpath 应该可以工作。

【讨论】:

  • 即使有右括号,XPath 也不起作用
  • 你的意思是它不会返回标签webelement或者它不会被点击?如果是后者,只需在末尾添加 /input 即可获得输入元素,还是我又错了? '//label[contains(text(),'Unsafe to delete')]/input'
  • 我的意思是它不会返回label。如果您检查count(//label/text()),您会看到它返回2。这意味着 label 元素有 2 个文本节点:第一个仅包含空格字符 - 它不包含任何 "Unsafe to delete"。应该工作的是//label[contains(text()[2],'Unsafe to delete')]。请注意,您在真正包含所需字符串的第二个文本节点中搜索 "Unsafe to delete"
  • 很好...我没听懂。
  • 大家好。目前在家享受晚上所以无法检查。从我的头顶。查找“不安全删除”时,Firepath 未找到匹配项。黄瓜测试失败了,因为它找不到它正在寻找的东西。 @安德森。空格字符是由 [1] 是
猜你喜欢
  • 2015-09-10
  • 2021-03-24
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多