(self, field)
response content could be json or html text.

        Args:
            field (str): string joined by delimiter.
            e.g.
                "status_code"
                "headers"
                "cookies"
                "content"
                "headers.content-type"
                "content.person.name.first_name"
response content could be json or html text.
response content could be json or html text .
def _extract_field_with_delimiter(self, field):
        """ response content could be json or html text.

        Args:
            field (str): string joined by delimiter.
            e.g.
                "status_code"
                "headers"
                "cookies"
                "content"
                "headers.content-type"
                "content.person.name.first_name"

        """
        # string.split(sep=None, maxsplit=-1) -> list of strings
        # e.g. "content.person.name" => ["content", "person.name"]
        try:
            top_query, sub_query = field.split('.', 1)
        except ValueError:
            top_query = field
            sub_query = None

        # status_code
        if top_query in ["status_code", "encoding", "ok", "reason", "url"]:
            if sub_query:
                # status_code.XX
                err_msg = u"Failed to extract: {}\n".format(field)
                logger.log_error(err_msg)
                raise exceptions.ParamsError(err_msg)

            return getattr(self, top_query)

        # cookies
        elif top_query == "cookies":
            cookies = self.cookies
            if not sub_query:
                # extract cookies
                return cookies

            try:
                return cookies[sub_query]
            except KeyError:
                err_msg = u"Failed to extract cookie! => {}\n".format(field)
                err_msg += u"response cookies: {}\n".format(cookies)
                logger.log_error(err_msg)
                raise exceptions.ExtractFailure(err_msg)

        # elapsed
        elif top_query == "elapsed":
            available_attributes = u"available attributes: days, seconds, microseconds, total_seconds"
            if not sub_query:
                err_msg = u"elapsed is datetime.timedelta instance, attribute should also be specified!\n"
                err_msg += available_attributes
                logger.log_error(err_msg)
                raise exceptions.ParamsError(err_msg)
            elif sub_query in ["days", "seconds", "microseconds"]:
                return getattr(self.elapsed, sub_query)
            elif sub_query == "total_seconds":
                return self.elapsed.total_seconds()
            else:
                err_msg = "{} is not valid datetime.timedelta attribute.\n".format(sub_query)
                err_msg += available_attributes
                logger.log_error(err_msg)
                raise exceptions.ParamsError(err_msg)

        # headers
        elif top_query == "headers":
            headers = self.headers
            if not sub_query:
                # extract headers
                return headers

            try:
                return headers[sub_query]
            except KeyError:
                err_msg = u"Failed to extract header! => {}\n".format(field)
                err_msg += u"response headers: {}\n".format(headers)
                logger.log_error(err_msg)
                raise exceptions.ExtractFailure(err_msg)

        # response body
        elif top_query in ["content", "text", "json"]:
            try:
                body = self.json
            except exceptions.JSONDecodeError:
                body = self.text

            if not sub_query:
                # extract response body
                return body

            if isinstance(body, (dict, list)):
                # content = {"xxx": 123}, content.xxx
                return utils.query_json(body, sub_query)
            elif sub_query.isdigit():
                # content = "abcdefg", content.3 => d
                return utils.query_json(body, sub_query)
            else:
                # content = "<html>abcdefg</html>", content.xxx
                err_msg = u"Failed to extract attribute from response body! => {}\n".format(field)
                err_msg += u"response body: {}\n".format(body)
                logger.log_error(err_msg)
                raise exceptions.ExtractFailure(err_msg)

        # new set response attributes in teardown_hooks
        elif top_query in self.__dict__:
            attributes = self.__dict__[top_query]

            if not sub_query:
                # extract response attributes
                return attributes

            if isinstance(attributes, (dict, list)):
                # attributes = {"xxx": 123}, content.xxx
                return utils.query_json(attributes, sub_query)
            elif sub_query.isdigit():
                # attributes = "abcdefg", attributes.3 => d
                return utils.query_json(attributes, sub_query)
            else:
                # content = "attributes.new_attribute_not_exist"
                err_msg = u"Failed to extract cumstom set attribute from teardown hooks! => {}\n".format(field)
                err_msg += u"response set attributes: {}\n".format(attributes)
                logger.log_error(err_msg)
                raise exceptions.TeardownHooksFailure(err_msg)

        # others
        else:
            err_msg = u"Failed to extract attribute from response! => {}\n".format(field)
            err_msg += u"available response attributes: status_code, cookies, elapsed, headers, content, text, json, encoding, ok, reason, url.\n\n"
            err_msg += u"If you want to set attribute in teardown_hooks, take the following example as reference:\n"
            err_msg += u"response.new_attribute = 'new_attribute_value'\n"
            logger.log_error(err_msg)
            raise exceptions.ParamsError(err_msg)
def _extract_field_with_delimiter ( self , field ) : # string.split(sep=None, maxsplit=-1) -> list of strings # e.g. "content.person.name" => ["content", "person.name"] try : top_query , sub_query = field . split ( '.' , 1 ) except ValueError : top_query = field sub_query = None # status_code if top_query in [ "status_code" , "encoding" , "ok" , "reason" , "url" ] : if sub_query : # status_code.XX err_msg = u"Failed to extract: {}\n" . format ( field ) logger . log_error ( err_msg ) raise exceptions . ParamsError ( err_msg ) return getattr ( self , top_query ) # cookies elif top_query == "cookies" : cookies = self . cookies if not sub_query : # extract cookies return cookies try : return cookies [ sub_query ] except KeyError : err_msg = u"Failed to extract cookie! => {}\n" . format ( field ) err_msg += u"response cookies: {}\n" . format ( cookies ) logger . log_error ( err_msg ) raise exceptions . ExtractFailure ( err_msg ) # elapsed elif top_query == "elapsed" : available_attributes = u"available attributes: days, seconds, microseconds, total_seconds" if not sub_query : err_msg = u"elapsed is datetime.timedelta instance, attribute should also be specified!\n" err_msg += available_attributes logger . log_error ( err_msg ) raise exceptions . ParamsError ( err_msg ) elif sub_query in [ "days" , "seconds" , "microseconds" ] : return getattr ( self . elapsed , sub_query ) elif sub_query == "total_seconds" : return self . elapsed . total_seconds ( ) else : err_msg = "{} is not valid datetime.timedelta attribute.\n" . format ( sub_query ) err_msg += available_attributes logger . log_error ( err_msg ) raise exceptions . ParamsError ( err_msg ) # headers elif top_query == "headers" : headers = self . headers if not sub_query : # extract headers return headers try : return headers [ sub_query ] except KeyError : err_msg = u"Failed to extract header! => {}\n" . format ( field ) err_msg += u"response headers: {}\n" . format ( headers ) logger . log_error ( err_msg ) raise exceptions . ExtractFailure ( err_msg ) # response body elif top_query in [ "content" , "text" , "json" ] : try : body = self . json except exceptions . JSONDecodeError : body = self . text if not sub_query : # extract response body return body if isinstance ( body , ( dict , list ) ) : # content = {"xxx": 123}, content.xxx return utils . query_json ( body , sub_query ) elif sub_query . isdigit ( ) : # content = "abcdefg", content.3 => d return utils . query_json ( body , sub_query ) else : # content = "<html>abcdefg</html>", content.xxx err_msg = u"Failed to extract attribute from response body! => {}\n" . format ( field ) err_msg += u"response body: {}\n" . format ( body ) logger . log_error ( err_msg ) raise exceptions . ExtractFailure ( err_msg ) # new set response attributes in teardown_hooks elif top_query in self . __dict__ : attributes = self . __dict__ [ top_query ] if not sub_query : # extract response attributes return attributes if isinstance ( attributes , ( dict , list ) ) : # attributes = {"xxx": 123}, content.xxx return utils . query_json ( attributes , sub_query ) elif sub_query . isdigit ( ) : # attributes = "abcdefg", attributes.3 => d return utils . query_json ( attributes , sub_query ) else : # content = "attributes.new_attribute_not_exist" err_msg = u"Failed to extract cumstom set attribute from teardown hooks! => {}\n" . format ( field ) err_msg += u"response set attributes: {}\n" . format ( attributes ) logger . log_error ( err_msg ) raise exceptions . TeardownHooksFailure ( err_msg ) # others else : err_msg = u"Failed to extract attribute from response! => {}\n" . format ( field ) err_msg += u"available response attributes: status_code, cookies, elapsed, headers, content, text, json, encoding, ok, reason, url.\n\n" err_msg += u"If you want to set attribute in teardown_hooks, take the following example as reference:\n" err_msg += u"response.new_attribute = 'new_attribute_value'\n" logger . log_error ( err_msg ) raise exceptions . ParamsError ( err_msg )