Codeception:用硒进行验收测试失败" textarea"

时间:2015-10-01 13:14:52

标签: selenium codeception

我有一个功能:

public function waitAndFill($element, $value, $timeOut = null)
    {
        $I = $this;

        $I->_waitFor($element, $timeOut);
        $I->fillField($element, $value);
        $I->seeInField($element, $value);
    }

我这样使用它: $I->waitAndFill('#inputInfo', 'This is test info');

textarea如下所示

<textarea id="inputInfo"
                      name="company_description"
                      ng-model="company.company_description"
                      class="form-control"></textarea>

所以,我的测试失败了:

 Step  I see in field "#inputInfo","This is test info"
 Fail  Failed testing for 'This is test info' in company_description's value: 
Failed asserting that an array contains 'This is test info'.

它适用于<input>字段,但在<textarea>上失败。看起来它根本看不到任何文字。

该文本出现在测试的屏幕截图上。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

这是一个错误。问题是:$I->seeInField($element, $value);调用$this->proceedSeeInField(array $elements, $value);调用它找到的Facebook \ WebDriver \ Remote \ RemoteWebElement对象上的方法getText()。如果你阅读了Facebook \ WebDriver \ Remote \ RemoteWebElement#getText()方法的文档,它会说它返回该元素的innerText。所以这不是bueno。为了解决这个问题,我在此函数中删除了textarea的条件。

protected function proceedSeeInField(array $elements, $value)
    {
        $strField = reset($elements)->getAttribute('name');
        if (reset($elements)->getTagName() === 'select') {
            $el = reset($elements);
            $elements = $el->findElements(WebDriverBy::xpath('.//option[@selected]'));
            if (empty($value) && empty($elements)) {
                return ['True', true];
            }
        }

        $currentValues = [];
        if (is_bool($value)) {
            $currentValues = [false];
        }
        foreach ($elements as $el) {
            if ($el->getTagName() === 'textarea') {
                $currentValues[] = $el->getText();
            } elseif ($el->getTagName() === 'input' && $el->getAttribute('type') === 'radio' || $el->getAttribute('type') === 'checkbox') {
                if ($el->getAttribute('checked')) {
                    if (is_bool($value)) {
                        $currentValues = [true];
                        break;
                    } else {
                        $currentValues[] = $el->getAttribute('value');
                    }
                }
            } else {
                $currentValues[] = $el->getAttribute('value');
            }
        }

        return [
            'Contains',
            $value,
            $currentValues,
            "Failed testing for '$value' in $strField's value: " . implode(', ', $currentValues)
        ];
    }

您应将其更改为:

protected function proceedSeeInField(array $elements, $value)
    {
        $strField = reset($elements)->getAttribute('name');
        if (reset($elements)->getTagName() === 'select') {
            $el = reset($elements);
            $elements = $el->findElements(WebDriverBy::xpath('.//option[@selected]'));
            if (empty($value) && empty($elements)) {
                return ['True', true];
            }
        }

        $currentValues = [];
        if (is_bool($value)) {
            $currentValues = [false];
        }
        foreach ($elements as $el) {
            if ($el->getTagName() === 'input' && $el->getAttribute('type') === 'radio' || $el->getAttribute('type') === 'checkbox') {
                if ($el->getAttribute('checked')) {
                    if (is_bool($value)) {
                        $currentValues = [true];
                        break;
                    } else {
                        $currentValues[] = $el->getAttribute('value');
                    }
                }
            } else {
                $currentValues[] = $el->getAttribute('value');
            }
        }

        return [
            'Contains',
            $value,
            $currentValues,
            "Failed testing for '$value' in $strField's value: " . implode(', ', $currentValues)
        ];
    }

现在它调用getAttribute('value')就像任何其他输入元素一样。

位于文件WebDriver.php