'Returns the content from a table cell.
Row and column number start from 1. Header and footer rows are
included in the count. A negative row or column number can be used
to get rows counting from the end (end: -1). Cell content from header
or footer rows can be obtained with this keyword. To understand how
tables are identified, please take a look at the `introduction`.
See `Page Should Contain` for explanation about `loglevel` argument.'

@keyword
def get_table_cell(self, table_locator, row, column, loglevel='INFO'):

    row = int(row)
    row_index = row
    if (row > 0):
        row_index = (row - 1)
    column = int(column)
    column_index = column
    if (column > 0):
        column_index = (column - 1)
    table = self._table_element_finder.find(table_locator)
    if table:
        rows = table.find_elements_by_xpath('./thead/tr')
        if ((row_index >= len(rows)) or (row_index < 0)):
            rows.extend(table.find_elements_by_xpath('./tbody/tr'))
        if ((row_index >= len(rows)) or (row_index < 0)):
            rows.extend(table.find_elements_by_xpath('./tfoot/tr'))
        if (row_index < len(rows)):
            columns = rows[row_index].find_elements_by_tag_name('th')
            if ((column_index >= len(columns)) or (column_index < 0)):
                columns.extend(rows[row_index].find_elements_by_tag_name('td'))
            if (column_index < len(columns)):
                return columns[column_index].text
    self.ctx.log_source(loglevel)
    raise AssertionError(('Cell    in    table    %s    in    row    #%s    and    column    #%s    could    not    be    found.' % (table_locator, str(row), str(column))))
