Behat 使用 Mink 扩展和 selenium2 来自动化测试用例

Behat with Mink extension and selenium2 to automate a test case

我正在尝试 select 一个内部有文本框的 iFrame。这是页面的结构:

<html>
<body>
<many text fields>
<iframe>
#document
<html>
<body>
<p>
WRITE TEXT HERE;
</p>
</body>
</html>
</iframe>
<more tags to do other things>
</body>
</html>

这是我在标签内的

标签中访问和写入文本的函数:

// Select iFrame
/**
 * 
 *
 * @Given /^I switch to iframe "([^"]*)"$/
 */
public function iSwitchToIframe($field1)
{
    $field1 = $this->fixStepArgument($field1);
    $page = $this->getSession()->getPage();
    $el = $page->find('css', $field1);
    $this->fillField($el, 'This is field value');
}

我不确定我在这里做错了什么。我不断收到 'Object of class NodeElement could not be converted to a string' 错误。

fillField() 接受两个参数:

  • 定位器 - 输入 id、名称或标签(字符串)
  • 值(字符串)

find()方法returns一个NodeElement,所以不能传递给fillField()

您可以在场上呼叫setValue()

$field1 = $this->fixStepArgument($field1);
$page = $this->getSession()->getPage();
$formElement = $page->find('css', $field1);
if (null === $formElement) {
    throw new \LogicException(sprintf('Form field not found: "%s"', $field1));
}
$formElement->setValue('a value');

但是,您似乎要从场景中传递 css 选择器。如果您传递一个有意义的名称,并将其转换为上下文文件中的 css 选择器或 id 会更好:

// you'll need to covert a name that came from the scenario to a selector
// you could also use a label
$selector = $this->convertFieldNameToIdOrNameOrLabel($field1);
$this->fillField($selector, 'This is field value');

通过将 css 选择器放入您的场景中,您正在用技术细节污染它们。如果您更愿意遵循这种做法,最好直接使用 mink 而不使用 Behat(因为您并不是真正在进行验收测试,而只是进行功能测试)。