【问题标题】:With xpath find an input field by value with no value attribute使用 xpath 按值查找输入字段,没有值属性
【发布时间】:2016-06-14 15:40:40
【问题描述】:

鉴于此 html:

<input id="test" value="my text" />

使用 xpath 很容易获得输入元素的句柄。比如:

input[@value="my text"]

但是如果原始 html 看起来像这样呢:

<input id="test" />

如果您在浏览器中查看,它仍然包含“我的文本” - 因为它已经添加了这样的 javascript:

document.getElementById('test').value = 'my text';

在小提琴中,您可以看到输入字段中包含单词“我的文本”,但没有值属性:https://jsfiddle.net/justinwyllie/5dsxa8mc/

如何选择这个元素?只是 xpath - 没有 jQuery。

【问题讨论】:

  • 您不想使用id 定位元素的原因是什么?谢谢。
  • 另一个小问题:您是否使用selenium 来定位元素?
  • 哈哈。是的。 Selenium Python 绑定。在我的实际情况下,没有 id。该元素由 React 生成。唯一的识别因素是价值属性。我们刚刚更新了 React,最新版本 (15.1.0) 似乎不再设置 value 属性。
  • Gotcha - 用 Python+Selenium 标记了问题并提供了 Python+Selenium 解决方案,希望你能接受。根据我的理解,你不能只用 xpath 来解决它。
  • 你猜我在用 Selenium 应该会加分。

标签: python selenium xpath


【解决方案1】:

考虑到这是 Python+Selenium,我将通过以下方式处理它:

inputs = driver.find_elements_by_tag_name("input")  # TODO: improve the locator to get less input elements
input_elm = next(input_elm for input_elm in inputs 
                 if input.get_attribute("value") == "my text")

请注意,get_attribute("value") 将获得.value 属性的计算 值,这正是解决问题的原因。

另请注意,如果没有匹配项,next() 会抛出 StopIteration 异常 - 您可以通过 try/except 处理该异常,或提供默认值:

input_elm = next((input_elm for input_elm in inputs 
                 if input.get_attribute("value") == "my text"), None)

【讨论】:

  • 是的。这样可行。不确定如何执行 get_attribute("value") 并且有效?我猜 value 属性已经设置了但是没有渲染到 DOM 中?
  • @JustinWyllie 它正在读取input 计算属性。属性和属性之间存在区别,请参阅stackoverflow.com/questions/6003819/…get_attribute()(链接到source)首先会查看是否有value 属性,如果有,它将返回它。否则,它将返回value 属性,在这种情况下未指定该属性。希望这能让事情变得更清楚一些。
  • 确实如此。感谢您的帮助。
猜你喜欢
  • 2017-10-02
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2022-07-29
  • 1970-01-01
  • 2013-09-30
相关资源
最近更新 更多