Oh, sorry. A bit of misunderstanding and miscommunication on my part.

The exemple I gave is just a quick way to reproduce my problem. The
real test use self.client, reverse, cast response.content to a string.
What I gave is a minimal exemple.

Also, I assumed you talked about comparing bit of html element, not
the raw content returned by the view. I'm quite uneasy to have the
test failing if a class is added or removed from the element. But yes,
your solution work for the current state of the application.

2016-07-31 14:46 GMT+02:00 Andreas Kuhne <[email protected]>:
> 2016-07-31 13:56 GMT+02:00 ludovic coues <[email protected]>:
>>
>> First, thanks for the suggestion.
>>
>> I just tried that, didn't work.
>> Here is the test file I used:
>>
>>
>>     from django.test import TestCase
>>
>>     class HTMLTestCase(TestCase):
>>
>>         def test_input_in_fieldset(self):
>>             fieldset = """
>>         <fieldset class="form-group">
>>             <input name="login">
>>             <input autofocus="" class="form-control" id="id_username"
>> maxlength="254" name="username" rows="3" type="text" required />
>>         </fieldset>
>>     """
>>             self.assertInHTML('<input name=login>', fieldset)
>>             self.assertInHTML('<input name="username">', fieldset)
>>
>>
>> First input is to have a working exemple, second is taken as is from
>> my view. Not closing the input in assertInHTML give an error `Couldn't
>> find '<input name="login"' in response`. I assume I would get the same
>> errors with assertContains(*args, html=True)
>>
>> I could copy/past the input directly in my test but if the maxlength
>> or class attribute change, the test will break. Taking the input
>> directly from the django form will test if the django form is rendered
>> in the view, not if the view is displaying a suitable form.
>>
>> 2016-07-31 13:22 GMT+02:00 Andreas Kuhne <[email protected]>:
>> > 2016-07-31 12:38 GMT+02:00 ludovic coues <[email protected]>:
>> >>
>> >> Hello,
>> >>
>> >> I am trying to test if a view is displaying a form with an input
>> >> element with name=username.
>> >>
>> >> Currently, I have tried a lot of variation around
>> >> `self.assertContains( response, "<input name=\"username\">",
>> >> html=True)` but none work.
>> >> I assume that doesn't work because the view have a field input with
>> >> name=username but also autofocus="", a class and a bunch of other
>> >> attribute.
>> >>
>> >> I could extract the form from the context and check the field username
>> >> from the form is displayed in the view but I'm not ok with that
>> >> solution. I'm testing if there is a input with name=username, not a
>> >> bunch of unrelated attribute.
>> >>
>> >> I could also use a LiveServerTestCase and selenium but that look like
>> >> a bit overkill for my need. lxml is another option but it would bring
>> >> more dependencies.
>> >>
>> >> A bit of help would be welcome :)
>> >>
>> >>
>> >>
>> >> --
>> >>
>> >> Cordialement, Coues Ludovic
>> >> +336 148 743 42
>> >>
>> >> --
>> >> You received this message because you are subscribed to the Google
>> >> Groups
>> >> "Django users" group.
>> >> To unsubscribe from this group and stop receiving emails from it, send
>> >> an
>> >> email to [email protected].
>> >> To post to this group, send email to [email protected].
>> >> Visit this group at https://groups.google.com/group/django-users.
>> >> To view this discussion on the web visit
>> >>
>> >> https://groups.google.com/d/msgid/django-users/CAEuG%2BTah74hdZMv%2BwdZPPq5PLaJ%3DhxOFMNXuVLfFYSw2Uz4N0w%40mail.gmail.com.
>> >> For more options, visit https://groups.google.com/d/optout.
>> >
>> >
>> > Django usually creates the inputs the same way, so what I do in my tests
>> > is
>> > to first dump the content of the response body on the screen and then
>> > copy
>> > the input statement from there. What you probably need is '<input
>> > name="username"', because it doesn't matter for your test if the html
>> > tag is
>> > closed. So you should be fine with:
>> > self.assertContains(response, '<input name="username"')
>> >
>> > --
>> > You received this message because you are subscribed to the Google
>> > Groups
>> > "Django users" group.
>> > To unsubscribe from this group and stop receiving emails from it, send
>> > an
>> > email to [email protected].
>> > To post to this group, send email to [email protected].
>> > Visit this group at https://groups.google.com/group/django-users.
>> > To view this discussion on the web visit
>> >
>> > https://groups.google.com/d/msgid/django-users/CALXYUbmmotLwzjZY6ZZnAqy21xqZN1%3DiE7ah3g5JxFgEw-POZg%40mail.gmail.com.
>> > For more options, visit https://groups.google.com/d/optout.
>>
>>
>>
>> --
>>
>> Cordialement, Coues Ludovic
>> +336 148 743 42
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Django users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at https://groups.google.com/group/django-users.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/django-users/CAEuG%2BTZCWDkkrZuP2N168pth1hL-gc8FrVjMwZnb3xS%2BK1X%2Bxw%40mail.gmail.com.
>> For more options, visit https://groups.google.com/d/optout.
>
>
> Hi,
>
> I think you have misunderstood me.
>
> First you need to check against the real response object, otherwise your
> test will only test if the item is present in your string, which is not what
> I meant. I meant that you should check what HTML django is generating to
> then get the correct information.
>
> In your case, I am now guessing that the output of django is the information
> you put into the fieldset variable?
>
> If so, you need to write
> self.assertContains(response,'<input autofocus="" class="form-control"
> id="id_username" maxlength="254" name="username"')
>
> The assertContains does not parse the html in any way, but uses a search for
> the text you entered. So if the text has 'autofocus="" class="form-control"
> id="id_username" maxlength="254"' before 'name="username"', then you need to
> add that as well, otherwise you won't find the text at all.
>
> Regards,
>
> Andréas
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/django-users.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-users/CALXYUbkp-oM3Y9dUYEcb8kbQT0kS95hDBqxVWMu8Cn-8iYQv3w%40mail.gmail.com.
>
> For more options, visit https://groups.google.com/d/optout.



-- 

Cordialement, Coues Ludovic
+336 148 743 42

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CAEuG%2BTY%3DcbadWnm85-M2YEs2%3DwwH6gjLpnOGhLXjEpq-rGLGHw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to