diff --git a/CHANGES.rst b/CHANGES.rst index bfc6dfbf6..d754d3cab 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,14 @@ Release Notes 1.8.1 ----- - Added 'Get Locations' keyword [thaffenden] +- Added Following Table keywords [Gaurang033] + + - table_cell_should_not_contain + - table_column_should_not_contain + - table_footer_should_not_contain + - table_header_should_not_contain + - table_row_should_not_contain + - table_should_not_contain 1.8.0 ----- diff --git a/src/Selenium2Library/keywords/_tableelement.py b/src/Selenium2Library/keywords/_tableelement.py index 0c7b03519..de6eb80fb 100644 --- a/src/Selenium2Library/keywords/_tableelement.py +++ b/src/Selenium2Library/keywords/_tableelement.py @@ -73,6 +73,37 @@ def table_cell_should_contain(self, table_locator, row, column, expected, loglev self.log_source(loglevel) raise AssertionError(message) + def table_cell_should_not_contain(self, table_locator, row, column, value, loglevel='INFO'): + """ + Verifies that a certain cell in a table does not contain `expected`. + + Row and column number start from 1. This keyword passes if the + specified cell does not contain the given content. If you want + to test that the cell content does not match exactly, or that + it e.g. starts with some text, use `Get Table Cell` keyword in + combination with built-in keywords such as `Should Not Be Equal` + or `Should Not Start With`. + + To understand how tables are identified, please take a look at + the `introduction`. + + See `Page Should Contain` for explanation about `loglevel` argument. + """ + message = ("Cell in table '%s' in row #%s and column #%s should not have contained text '%s'." + % (table_locator, row, column, value)) + cell_not_exist_message = ("Cell in table '%s' in row #%s and column #%s was not found" + % (table_locator, row, column)) + try: + content = self.get_table_cell(table_locator, row, column, loglevel='NONE') + except AssertionError as err: + self._info(err) + self.log_source(loglevel) + raise AssertionError(cell_not_exist_message) + self._info("Cell contains %s." % content) + if value in content: + self.log_source(loglevel) + raise AssertionError(message) + def table_column_should_contain(self, table_locator, col, expected, loglevel='INFO'): """Verifies that a specific column contains `expected`. @@ -100,6 +131,32 @@ def table_column_should_contain(self, table_locator, col, expected, loglevel='IN "should have contained text '%s'." % (col, table_locator, expected)) + def table_column_should_not_contain(self, table_locator, col, value, loglevel='INFO'): + """Verifies that a specific column does not contain `expected`. + + The first leftmost column is column number 1. A negative column + number can be used to get column counting from the end of the row (end: -1). + If the table contains cells that span multiple columns, those merged cells + count as a single column. For example both tests below work, + if in one row columns A and B are merged with colspan="2", and + the logical third column contains "C". + + Example: + | Table Column Should Not Contain | tableId | 3 | C | + | Table Column Should Not Contain | tableId | 2 | C | + + To understand how tables are identified, please take a look at + the `introduction`. + + See `Page Should Contain Element` for explanation about + `loglevel` argument. + """ + element = self._table_element_finder.find_by_col(self._current_browser(), table_locator, col, value) + if element: + self.log_source(loglevel) + raise AssertionError("Column #%s in table identified by '%s' should not have contained text '%s'." + % (col, table_locator, value)) + def table_footer_should_contain(self, table_locator, expected, loglevel='INFO'): """Verifies that the table footer contains `expected`. @@ -116,6 +173,22 @@ def table_footer_should_contain(self, table_locator, expected, loglevel='INFO'): raise AssertionError("Footer in table identified by '%s' should have contained " "text '%s'." % (table_locator, expected)) + def table_footer_should_not_contain(self, table_locator, value, loglevel='INFO'): + """Verifies that the table footer does not contain `expected`. + + With table footer can be described as any -element that is + child of a -element. To understand how tables are + identified, please take a look at the `introduction`. + + See `Page Should Contain Element` for explanation about + `loglevel` argument. + """ + element = self._table_element_finder.find_by_footer(self._current_browser(), table_locator, value) + if element: + self.log_source(loglevel) + raise AssertionError("Footer in table identified by '%s' should not have contained text '%s'." + % (table_locator, value)) + def table_header_should_contain(self, table_locator, expected, loglevel='INFO'): """Verifies that the table header, i.e. any ... element, contains `expected`. @@ -131,6 +204,21 @@ def table_header_should_contain(self, table_locator, expected, loglevel='INFO'): raise AssertionError("Header in table identified by '%s' should have contained " "text '%s'." % (table_locator, expected)) + def table_header_should_not_contain(self, table_locator, value, loglevel='INFO'): + """Verifies that the table header, i.e. any ... element, does not contain `expected`. + + To understand how tables are identified, please take a look at + the `introduction`. + + See `Page Should Contain Element` for explanation about + `loglevel` argument. + """ + element = self._table_element_finder.find_by_header(self._current_browser(), table_locator, value) + if element: + self.log_source(loglevel) + raise AssertionError("Header in table identified by '%s' should not have contained text '%s'." + % (table_locator, value)) + def table_row_should_contain(self, table_locator, row, expected, loglevel='INFO'): """Verifies that a specific table row contains `expected`. @@ -154,6 +242,29 @@ def table_row_should_contain(self, table_locator, row, expected, loglevel='INFO' raise AssertionError("Row #%s in table identified by '%s' should have contained " "text '%s'." % (row, table_locator, expected)) + def table_row_should_not_contain(self, table_locator, row, value, loglevel='INFO'): + """Verifies that a specific table row does not contain `expected`. + + The uppermost row is row number 1. A negative column + number can be used to get column counting from the end of the row + (end: -1). For tables that are structured with thead, tbody and tfoot, + only the tbody section is searched. Please use `Table Header Should Contain` + or `Table Footer Should Contain` for tests against the header or + footer content. + + If the table contains cells that span multiple rows, a match + only occurs for the uppermost row of those merged cells. To + understand how tables are identified, please take a look at + the `introduction`. + + See `Page Should Contain Element` for explanation about `loglevel` argument. + """ + element = self._table_element_finder.find_by_row(self._current_browser(), table_locator, row, value) + if element: + self.log_source(loglevel) + raise AssertionError("Row #%s in table identified by '%s' should have contained text '%s'." + % (row, table_locator, value)) + def table_should_contain(self, table_locator, expected, loglevel='INFO'): """Verifies that `expected` can be found somewhere in the table. @@ -168,3 +279,18 @@ def table_should_contain(self, table_locator, expected, loglevel='INFO'): self.log_source(loglevel) raise AssertionError("Table identified by '%s' should have contained text '%s'." \ % (table_locator, expected)) + + def table_should_not_contain(self, table_locator, value, loglevel='INFO'): + """Verifies that `expected` should not be present anywhere in the table. + + To understand how tables are identified, please take a look at + the `introduction`. + + See `Page Should Contain Element` for explanation about + `loglevel` argument. + """ + element = self._table_element_finder.find_by_content(self._current_browser(), table_locator, value) + if element: + self.log_source(loglevel) + raise AssertionError("Table identified by '%s' should not have contained text '%s'." + % (table_locator, value)) diff --git a/test/acceptance/keywords/tables/table_should_not_contain.robot b/test/acceptance/keywords/tables/table_should_not_contain.robot new file mode 100644 index 000000000..528126344 --- /dev/null +++ b/test/acceptance/keywords/tables/table_should_not_contain.robot @@ -0,0 +1,120 @@ +*** Settings *** +Documentation Tests table contents for should not keyowrds +Resource table_resource.robot +Default Tags table_not_contain + + +*** Test Cases *** +Should Give Error Message When Content Found In Table + [Documentation] Should Give Error Message When Content Found In Table + [Template] Verify Table Does Contain With CSS And XPath Locators + simpleTable simpleTable_A1 + simpleTable simpleTable_C3 + simpleWithNested simpleWithNested_A1 + simpleWithNested nestedTable_A1 + nestedTable nestedTable_A1 + nestedTable nestedTable_C3 + tableWithSingleHeader tableWithSingleHeader_B1 + tableWithSingleHeader tableWithSingleHeader_B2 + withHeadAndFoot withHeadAndFoot_AH1 + withHeadAndFoot withHeadAndFoot_B2 + withHeadAndFoot withHeadAndFoot_CF1 + mergedRows mergedRows_A1 + mergedCols mergedCols_B2 + formattedTable formattedTable_A1 + formattedTable formattedTable_B1 + formattedTable formattedTable_C1 + formattedTable formattedTable_A2 + formattedTable formattedTable_B2 + formattedTable formattedTable_ÄÖÜäöüß + formattedTable äöü€&äöü€& + +Test Table Cell Should Not Contain + [Documentation] Test Table Cell Should Not Contain + ${table}= set variable simpleTable + ${row}= set variable 1 + ${col}= set variable 1 + ${value} = set variable simpleTable_A2 + table cell should not contain ${table} ${row} ${col} ${value} + +Test Table Cell Give Error When Cell Not Present + [Documentation] Test Table Cell Should Not Contain when Cell is not present in the table + ${table}= set variable simpleTable + ${row}= set variable 1 + ${col}= set variable 10 + ${value} = set variable simpleTable_A1 + ${err}= Set Variable Cell in table '${table}' in row #${row} and column #${col} was not found + Run Keyword And Expect Error ${err} table cell should not contain ${table} ${row} ${col} ${value} + +Test Table Cell Give Error When It Contains + [Documentation] Test Table Cell Give Error When It Contains + ${table}= set variable simpleTable + ${row}= set variable 1 + ${col}= set variable 1 + ${value} = set variable simpleTable_A1 + ${err}= Set Variable Cell in table '${table}' in row #${row} and column #${col} should not have contained text '${value}'. + Run Keyword And Expect Error ${err} table cell should not contain ${table} ${row} ${col} ${value} + +Test Table Row Should Not Contain + [Documentation] Test Table Row Should Not Contain + ${table}= set variable simpleTable + ${row}= set variable 1 + ${value} = set variable simpleTable_A2 + table row should not contain ${table} ${row} ${value} + +Test Table Row Should Give Error When It Contains + [Documentation] Test Table Row Should Give Error When It Contains + ${table}= set variable tableWithSingleHeader + ${value} = set variable tableWithSingleHeader_A1 + ${row}= set variable 1 + ${err}= Set Variable Row #${row} in table identified by '${table}' should have contained text '${value}'. + run keyword and expect error ${err} table row should not contain ${table} ${row} ${value} + +Test Table column Should Not Contain + [Documentation] Test Table column Should Not Contain + ${table}= set variable simpleTable + ${column}= set variable 1 + ${value} = set variable simpleTable_B2 + table column should not contain ${table} ${column} ${value} + +Test Table column Should Give Error When It Contains + [Documentation] Test Table column Should Give Error When It Contains + ${table}= set variable tableWithSingleHeader + ${column}= set variable 1 + ${value} = set variable tableWithSingleHeader_A1 + ${err}= Set Variable Column #${column} in table identified by '${table}' should not have contained text '${value}'. + run keyword and expect error ${err} table column should not contain ${table} ${column} ${value} + +Test Table Header Should Not Contain + [Documentation] Test Table Header Should Not Contain + ${table}= set variable tableWithSingleHeader + ${value} = set variable tableWithSingleHeader_A3 + table header should not contain ${table} ${value} + +Test Table Header Should Give Error When It Contains + [Documentation] Test Table Header Should Give Error When It Contains + ${table}= set variable tableWithSingleHeader + ${value} = set variable tableWithSingleHeader_A1 + ${err}= Set Variable Header in table identified by '${table}' should not have contained text '${value}'. + run keyword and expect error ${err} table header should not contain ${table} ${value} + +Test Table Footer Should Not Contain + [Documentation] Test Table Footer Should Not Contain + ${table}= set variable withHeadAndFoot + ${expected} = set variable withHeadAndFoot_A1 + table footer should not contain ${table} ${expected} + +Test Table Footer Should Give Error When It Contains + [Documentation] Test Table Footer Should Give Error When It Contains + ${table}= set variable withHeadAndFoot + ${value} = set variable withHeadAndFoot_AF1 + ${err}= Set Variable Footer in table identified by '${table}' should not have contained text '${value}'. + run keyword and expect error ${err} table footer should not contain ${table} ${value} + + +*** Keywords *** +Verify Table Does Contain With CSS And XPath Locators + [Arguments] ${locator} ${value} + [Documentation] Verify Table Contains With CSS And XPath Locators + ${err}= Set Variable Table identified by '${locator}' should not have contained text '${value}'. + Run Keyword And Expect Error ${err} Table Should Not Contain ${locator} ${value}