Source code for shuup.testing.soup_utils

# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2021, Shuup Commerce Inc. All rights reserved.
#
# This source code is licensed under the OSL-3.0 license found in the
# LICENSE file in the root directory of this source tree.

from __future__ import unicode_literals

SIMPLE_INPUT_TYPES = ("text", "hidden", "password", "submit", "image", "search", "number", "email", "url")


[docs]def extract_form_fields(soup): # pragma: no cover # noqa (C901) # Based on https://gist.github.com/simonw/104413 "Turn a BeautifulSoup form in to a dict of fields and default values" fields = {} for input in soup.findAll("input"): name = input.get("name") value = input.get("value") or "" type = input.get("type", "text") if not name: continue if type in SIMPLE_INPUT_TYPES: fields[name] = value continue if type in ("checkbox", "radio"): if input.get("checked"): value = value or "on" if value: fields[name] = value else: fields.setdefault(name, value) continue assert False, "input type %s not supported" % type for textarea in soup.findAll("textarea"): name = textarea.get("name") if name: fields[name] = textarea.string or "" # select fields for select in soup.findAll("select"): options = select.findAll("option") selected_options = [option for option in options if option.has_attr("selected")] if not selected_options and options: selected_options = [options[0]] value = [option["value"] for option in selected_options if option["value"]] fields[select["name"]] = value or "" return fields