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

时间:2015-07-16 18:00:13

标签: php iframe selenium-webdriver behat mink

我正在尝试选择一个包含文本框的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');
}

我不确定我在这里做错了什么。我一直得到'类NodeElement的对象无法转换为字符串'错误。

1 个答案:

答案 0 :(得分:1)

fillField()接受两个论点:

  • locator - 输入id,名称或标签(字符串)
  • value(string)

find()方法返回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选择器放入您的方案中,您可以使用技术细节来污染它们。如果您更喜欢遵循这种做法,最好不要直接使用水貂而不使用Behat(因为您并没有真正进行验收测试,而只是进行功能测试)。