【问题标题】:how to loop through the elements in Behat and Mink如何循环遍历 Behat 和 Mink 中的元素
【发布时间】:2014-09-03 17:27:28
【问题描述】:

我正在为 BDD 使用 Behat 和 Mink 框架(使用 PHP)

我正在循环遍历 td 元素以验证值和文本。由于返回的所有元素都是 span 元素,我可以在元素上使用 getText() ,一切都很好。

$page = $this->getSession()->getPage();      
$expected_values = ["Tuesday", 22, 22, 22, 22];     
$actual_rows = $page->findAll('css', 'table.admin-table tbody tr td');
$actual_Values = array();
foreach($actual_rows as $row) {               
$actual_Values[] = $row->getText();
}
assertEquals($expected_values, $actual_Values);

但最近,页面的设计发生了变化。并且一些 span 元素已被 input 元素替换。 getText() 返回 null,所以我用 getValue() 替换了它。但是由于第一个 td 元素是一个 span,如果我们使用 getText(),它会返回 null。

无论如何我可以从上面的代码 sn-p 中跳过循环中的第一个 td。

更新: 这是我在 cmets 中没有正确渲染的内容:

$actual_Values[] = $row->find('css', 'input')->getValue();

【问题讨论】:

  • 可以,但很可能需要使用 xpath。当td 有跨度和输入时,你能说出 html 的样子吗?
  • 人们对一个问题投反对票,甚至懒得发表评论,这太愚蠢了。绝对的疯子!!

标签: php bdd behat mink


【解决方案1】:

我误读并认为无论有输入还是跨度,您都想独立获取文本。要跳过第一个值,您可以:

foreach($actual_rows as $row) {               
    if ($row !== reset($actual_rows) {
        $actual_Values[] = $row->getText();
    }
}

或者更好的方法是 array_shift($actual_rows) 删除第一个值,然后执行正常循环。

或者另一种方法是将您的选择器更改为 $page->findAll('css', 'table.admin-table tbody tr td:not(:first-child)'); 以选择除第一个 td 子之外的所有内容。

【讨论】:

  • 嗨,Ian,第三个选项看起来很不错,可以保持代码干净。我会试试的,会告诉你的。谢谢
  • 嗨,Ian,我尝试了第三个选项,目前它返回 null。可能是因为 JS 没有获取页面上所有需要的数据。我已经进行了一个冗长的评估字段的过程。感谢您的帮助
  • 嗨,伊恩,我刚刚给你投了赞成票。第三个选项效果很好。但是,我必须在循环中使用以下内容: $actual_Values[] = $row->find('css', 'input')->getValue();
  • 对不起,我没有从单词中弄清楚html结构。请用它更新问题,我将查看代码。当然,如果代码不起作用,我的想法与实际情况不符。
猜你喜欢
  • 2013-01-07
  • 2010-11-16
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 2012-11-23
  • 2016-05-29
相关资源
最近更新 更多