Codeception / lib-innerbrowser

InnerBrowser
MIT License
80 stars 20 forks source link

InnerBrowser fillField throws exception if input does not have a name attribute #24

Open janhenkgerritsen opened 8 years ago

janhenkgerritsen commented 8 years ago

This issue comes from the problem reported in Codeception/Codeception#1221. You will get an exception with the text InvalidArgumentException: Malformed field path "" if you call fillField for a form field without a name attribute or an empty name attribute.

This comes from the fact that the call to matchFormField at https://github.com/Codeception/Codeception/blob/2.1/src/Codeception/Lib/InnerBrowser.php#L789 uses the value of the name attribute to access the fields in a \Symfony\Component\DomCrawler\Form object.

However, this Form object will not store form fields that do not have a value for their name attribute, see this line of code: https://github.com/symfony/dom-crawler/blob/master/Form.php#L452.

I don't see an easy workaround for this problem, but maybe someone else does, maybe @Naktibalda or @DavertMik? I am not really familiar with this part of the Codeception codebase :)

Naktibalda commented 8 years ago

I don't see a point of filling a nameless input field in a client which does not support javascript. It can't be submitted by submitForm.

Naktibalda commented 8 years ago

How about throwing exception with clearer message?

if (empty($name)) {
    throw new Exception("Can't fill a field because it has no name attribute");
}
janhenkgerritsen commented 8 years ago

An exception with a better error message is a good idea, at least that way users have an idea of what goes wrong.

I also agree with you that there is no point in filling a nameless input field in functional tests. If that poses a problem in your tests you are probably trying to do something you should not do and for which there are better alternatives.