【问题标题】:Return content of read-only <input type=text>返回只读 <input type=text> 的内容
【发布时间】:2015-06-22 02:11:24
【问题描述】:

这是 HTML:

<div id="ifld1014" class="ax-terminal-field x20" title="" style="top: 272px;
left: 154px;"><input type="text" maxlength="30" size="30" 
class="ax-terminal-inputField ax_x20i" readonly="readonly" style="width: 240px;"></div>

这是我的一些 casper 代码:

var x = require('casper').selectXPath;
....//truncated for shortness//....
    casper.echo(x('//*[@id="ifldf14"]/input').value);

结果未定义。我尝试了 .value、.text、.innerHTML,但它们在运行时都未定义。如何获取输入框的内容?

【问题讨论】:

  • 您确定id 不是动态生成的并且始终是ifld1014
  • 当我使用 utils.dump(x('//*[@id="ifld1014"]/input'));除了类型和路径,我什么都没有。有什么想法吗?
  • 您期望的价值是多少?从您的代码中,您的 input 具有未定义的值。你尝试了input.value,它正确地给了你undefined
  • 在屏幕上,只读输入中有文字。我试图返回包含的值。这来自我正在为其构建 API 的基于 Web 的终端仿真器系统。屏幕会加载我尝试返回的输入内容。
  • 您的文档格式不正确。元素输入没有结束标签。

标签: javascript html xpath phantomjs casperjs


【解决方案1】:

DOM 上下文

CasperJS 是一个沙盒化的 DOM 上下文(页面上下文)。只有在那里您可以直接访问 DOM 元素。页面上下文在 casper.evaluate() 回调中。 DOM 元素的其他所有内容都只是它的一种表示,因为 DOM 节点不能传递给外部上下文。

访问输入值

有很多方法可以从 DOM 中获取信息,但是 DOM 节点不能按原样打印到控制台。这里有两种获取输入值的方法。

  1. 您可以使用casper.evaluate()。由于您想使用 XPath 表达式,您可以使用由 CasperJS 注入页面的 __utils__.getElementByXPath() 辅助函数:

    var value = casper.evaluate(function(xpathexpr){
        return __utils__.getElementByXPath(xpathexpr).value;
    }, '//*[@id="ifldf14"]/input');
    casper.echo("value: " + value);
    
  2. 如果输入字段在表单内部并且元素具有名称属性,则可以使用casper.getFormValues() 并使用字段名称获取值。

    casper.echo(casper.getFormValues('form').nameHere);
    

XPath 帮助实用程序

var x = require('casper').selectXPath;

只是一个将字符串转换为具有typepath 属性的对象的小帮手。它仅在 CasperJS 内部用于表示 XPath。区分是必要的,因为 CasperJS 支持 CSS 选择器和 XPath 表达式。它们最初都是简单的字符串,但执行方式不同。

【讨论】:

  • 感谢您的信息。第一种方法产生 NULL,当我用 utils.dump 转储值时,我仍然得到 NULL: utils.dump(casper.evaluate(function(xpathexpr){ return utils.getElementByXPath(xpathexpr); }, '//*[@id="ilfdf14"]/input'));
  • 您是否对页面进行了截图以查看您是否在正确的页面上?你用 casper.then() 包围了这段代码吗?正如我所说,如果页面上下文,您不能将 DOM 节点传递出去。
  • 我截图了,输入有数据,但不是来自源。我认为它在加载后在 javascript 函数中添加上下文,我等了几秒钟,仍然得到空值。我尝试使用 casper.then()
  • 输入有数据,但不是来自源这是什么意思?它有占位符吗?如果是,则占位符不会作为输入值出现。您能否提供完整和最小代码的gist
【解决方案2】:

问题是我没有使用 jQuery 来获取我的价值。感谢大家的意见!

【讨论】:

    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2016-11-03
    • 1970-01-01
    • 2013-02-11
    • 2017-07-08
    • 1970-01-01
    相关资源
    最近更新 更多