def __init__(self, implicit_wait=15.0, **kwargs):
        # pylint: disable=line-too-long
        """ExtendedSelenium2Library can be imported with optional arguments.

        Arguments:
        - ``timeout``: The maximum value to wait for all waiting actions. (Default 5.0)
                       It can be set later with `Set Selenium Timeout`.
                       See `introduction` for more information about ``timeout``.
        - ``implicit_wait``: The maximum implicit timeout value to wait when looking
                             for elements. (Default 15.0)
                             It can be later set with `Set Selenium Implicit Wait`.
                             See [http://goo.gl/8ePMo6|WebDriver: Advanced Usage]
                             section of the SeleniumHQ documentation for more information about
                             WebDriver's implicit wait functionality.
        - ``run_on_failure``: The name of a keyword (from any available libraries) to execute
                              when a ExtendedSelenium2Library keyword fails. By default
                              `Capture Page Screenshot` will be used to take a screenshot of
                              the current page.
                              Using the value "Nothing" will disable this feature altogether.
                              See `Register Keyword To Run On Failure` keyword for
                              more information about this functionality.
        - ``screenshot_root_directory``: The default root directory that screenshots should be
                                         stored in. If not provided, the default directory will be
                                         where [http://goo.gl/lES6WM|Robot Framework] places its
                                         logfile.
        - ``block_until_page_ready``: A boolean flag to block the execution until
                                      the page is ready. (Default True)
        - ``browser_breath_delay``: The delay value in seconds to give the browser enough time to
                                    complete current execution. (Default 0.05)
        - ``ensure_jq``: A boolean flag to ensure jQuery library is loaded on the page.
                         ``sizzle`` locator strategy will depend on this flag. (Default True)
        - ``poll_frequency``: The delay value in seconds to retry the next step. (Default 0.2)

        Examples:
        | Library `|` ExtendedSelenium2Library `|` 15                                            | # Sets default timeout to 15 seconds                                       |
        | Library `|` ExtendedSelenium2Library `|` 0 `|` 5                                       | # Sets default timeout to 0 seconds and default implicit_wait to 5 seconds |
        | Library `|` ExtendedSelenium2Library `|` 5 `|` run_on_failure=Log Source               | # Sets default timeout to 5 seconds and runs `Log Source` on failure       |
        | Library `|` ExtendedSelenium2Library `|` implicit_wait=5 `|` run_on_failure=Log Source | # Sets default implicit_wait to 5 seconds and runs `Log Source` on failure |
        | Library `|` ExtendedSelenium2Library `|` timeout=10      `|` run_on_failure=Nothing    | # Sets default timeout to 10 seconds and does nothing on failure           |
        """
        # pylint: disable=line-too-long
        self._inputs = {
            'block_until_page_ready': bool(kwargs.pop('block_until_page_ready', True)),
            'browser_breath_delay': float(kwargs.pop('browser_breath_delay', 0.05)),
            'ensure_jq': bool(kwargs.pop('ensure_jq', True)),
            'poll_frequency': float(kwargs.pop('poll_frequency', 0.2)),
        }
        self._builtin = BuiltIn()
        Selenium2Library.__init__(self, implicit_wait=implicit_wait, **kwargs)
        ExtendedElementKeywords.__init__(self)
        ExtendedFormElementKeywords.__init__(self)
        ExtendedJavascriptKeywords.__init__(self)
        ExtendedSelectElementKeywords.__init__(self)
        ExtendedWaitingKeywords.__init__(self)
        self._implicit_wait_in_secs = float(implicit_wait) if implicit_wait is not None else 15.0
        self._page_ready_keyword_list = []
        # pylint: disable=protected-access
        self._table_element_finder._element_finder = self._element_finder
Exemple #2
0
 def setUp(self):
     """Instantiate the extended element class."""
     self.element = ExtendedElementKeywords()
     self.element._current_browser = mock.Mock()
     self.element._wait_until_page_ready = mock.Mock()
     self.locator = 'css=.selector'
     self.locator_attribute = 'css=.selector@class'
     self.locator_class = 'selector'
     self.web_element = WebElement('element', False)
Exemple #3
0
 def setUp(self):
     """Instantiate the extended element class."""
     self.driver = mock.Mock()
     self.driver.session_id = 'session'
     self.element = ExtendedElementKeywords()
     # pylint: disable=protected-access
     self.element._current_browser = mock.Mock()
     self.element._info = mock.Mock()
     self.element._wait_until_page_ready = mock.Mock()
     self.locator = 'css=.selector'
     self.locator_attribute = 'css=.selector@class'
     self.locator_class = 'selector'
     self.web_element = WebElement(self.driver, 'element', False)
     self.web_element.click = mock.Mock()
 def setUp(self):
     """Instantiate the extended element class."""
     self.element = ExtendedElementKeywords()
     self.element._current_browser = mock.Mock()
     self.element._wait_until_page_ready = mock.Mock()
     self.locator = 'css=.selector'
     self.locator_attribute = 'css=.selector@class'
     self.locator_class = 'selector'
     self.web_element = WebElement('element', False)
 def setUp(self):
     """Instantiate the extended element class."""
     self.driver = mock.Mock()
     self.driver.session_id = 'session'
     self.element = ExtendedElementKeywords()
     # pylint: disable=protected-access
     self.element._current_browser = mock.Mock()
     self.element._info = mock.Mock()
     self.element._wait_until_page_ready = mock.Mock()
     self.locator = 'css=.selector'
     self.locator_attribute = 'css=.selector@class'
     self.locator_class = 'selector'
     self.web_element = WebElement(self.driver, 'element', False)
     self.web_element.click = mock.Mock()
Exemple #6
0
    def __init__(self, implicit_wait=15.0, **kwargs):
        # pylint: disable=line-too-long
        """ExtendedSelenium2Library can be imported with optional arguments.

        Arguments:
        - ``timeout``: The maximum value to wait for all waiting actions. (Default 5.0)
                       It can be set later with `Set Selenium Timeout`.
                       See `introduction` for more information about ``timeout``.
        - ``implicit_wait``: The maximum implicit timeout value to wait when looking
                             for elements. (Default 15.0)
                             It can be later set with `Set Selenium Implicit Wait`.
                             See [http://goo.gl/8ePMo6|WebDriver: Advanced Usage]
                             section of the SeleniumHQ documentation for more information about
                             WebDriver's implicit wait functionality.
        - ``run_on_failure``: The name of a keyword (from any available libraries) to execute
                              when a ExtendedSelenium2Library keyword fails. By default
                              `Capture Page Screenshot` will be used to take a screenshot of
                              the current page.
                              Using the value "Nothing" will disable this feature altogether.
                              See `Register Keyword To Run On Failure` keyword for
                              more information about this functionality.
        - ``screenshot_root_directory``: The default root directory that screenshots should be
                                         stored in. If not provided, the default directory will be
                                         where [http://goo.gl/lES6WM|Robot Framework] places its
                                         logfile.
        - ``block_until_page_ready``: A boolean flag to block the execution until
                                      the page is ready. (Default True)
        - ``browser_breath_delay``: The delay value in seconds to give the browser enough time to
                                    complete current execution. (Default 0.05)
        - ``ensure_jq``: A boolean flag to ensure jQuery library is loaded on the page.
                         ``sizzle`` locator strategy will depend on this flag. (Default True)
        - ``poll_frequency``: The delay value in seconds to retry the next step. (Default 0.2)

        Examples:
        | Library `|` ExtendedSelenium2Library `|` 15                                            | # Sets default timeout to 15 seconds                                       |
        | Library `|` ExtendedSelenium2Library `|` 0 `|` 5                                       | # Sets default timeout to 0 seconds and default implicit_wait to 5 seconds |
        | Library `|` ExtendedSelenium2Library `|` 5 `|` run_on_failure=Log Source               | # Sets default timeout to 5 seconds and runs `Log Source` on failure       |
        | Library `|` ExtendedSelenium2Library `|` implicit_wait=5 `|` run_on_failure=Log Source | # Sets default implicit_wait to 5 seconds and runs `Log Source` on failure |
        | Library `|` ExtendedSelenium2Library `|` timeout=10      `|` run_on_failure=Nothing    | # Sets default timeout to 10 seconds and does nothing on failure           |
        """
        # pylint: disable=line-too-long
        self._inputs = {
            'block_until_page_ready':
            bool(kwargs.pop('block_until_page_ready', True)),
            'browser_breath_delay':
            float(kwargs.pop('browser_breath_delay', 0.05)),
            'ensure_jq':
            bool(kwargs.pop('ensure_jq', True)),
            'poll_frequency':
            float(kwargs.pop('poll_frequency', 0.2)),
        }
        self._builtin = BuiltIn()
        Selenium2Library.__init__(self, implicit_wait=implicit_wait, **kwargs)
        ExtendedElementKeywords.__init__(self)
        ExtendedFormElementKeywords.__init__(self)
        ExtendedJavascriptKeywords.__init__(self)
        ExtendedSelectElementKeywords.__init__(self)
        ExtendedWaitingKeywords.__init__(self)
        self._implicit_wait_in_secs = float(
            implicit_wait) if implicit_wait is not None else 15.0
        self._page_ready_keyword_list = []
        # pylint: disable=protected-access
        self._table_element_finder._element_finder = self._element_finder
Exemple #7
0
class ExtendedElementTests(unittest.TestCase):
    """Extended element keyword test class."""
    def setUp(self):
        """Instantiate the extended element class."""
        self.element = ExtendedElementKeywords()
        self.element._current_browser = mock.Mock()
        self.element._wait_until_page_ready = mock.Mock()
        self.locator = 'css=.selector'
        self.locator_attribute = 'css=.selector@class'
        self.locator_class = 'selector'
        self.web_element = WebElement('element', False)

    def test_should_inherit_keywords(self):
        """Extended element instance should inherit Selenium2 element instances."""
        self.assertIsInstance(self.element, _ElementKeywords)

    @mock.patch(
        "ExtendedSelenium2Library.keywords.extendedelement._ElementKeywords.click_element"
    )
    def test_should_click_element(self, mock_click_element):
        """Should click an element."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_element(self.locator)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(
            self.locator)
        mock_click_element.assert_called_with(self.web_element)
        self.element._wait_until_page_ready.assert_called_with()

    @mock.patch(
        "ExtendedSelenium2Library.keywords.extendedelement._ElementKeywords.click_element"
    )
    def test_should_click_elementi_and_skip_ready(self, mock_click_element):
        """Should click an element with skip_ready."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_element(self.locator, True)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(
            self.locator)
        mock_click_element.assert_called_with(self.web_element)
        self.assertFalse(self.element._wait_until_page_ready.called)

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement."
                "_ElementKeywords.click_element_at_coordinates")
    def test_should_click_element_at_coordinates(
            self, mock_click_element_at_coordinates):
        """Should click an element at given coordinates."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_element_at_coordinates(self.locator, 0, 0)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(
            self.locator)
        mock_click_element_at_coordinates.assert_called_with(
            self.web_element, 0, 0)
        self.element._wait_until_page_ready.assert_called_with()

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement."
                "_ElementKeywords.click_element_at_coordinates")
    def test_should_click_element_at_coordinates_and_skip_ready(
            self, mock_click_element_at_coordinates):
        """Should click an element at given coordinates with skip_ready."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_element_at_coordinates(self.locator, 0, 0, True)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(
            self.locator)
        mock_click_element_at_coordinates.assert_called_with(
            self.web_element, 0, 0)
        self.assertFalse(self.element._wait_until_page_ready.called)

    @mock.patch(
        "ExtendedSelenium2Library.keywords.extendedelement._ElementKeywords.click_image"
    )
    def test_should_click_image(self, mock_click_image):
        """Should click an image."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_image(self.locator)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(
            self.locator)
        mock_click_image.assert_called_with(self.web_element)
        self.element._wait_until_page_ready.assert_called_with()

    @mock.patch(
        "ExtendedSelenium2Library.keywords.extendedelement._ElementKeywords.click_image"
    )
    def test_should_click_image_and_skip_ready(self, mock_click_image):
        """Should click an image with skip_ready."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_image(self.locator, True)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(
            self.locator)
        mock_click_image.assert_called_with(self.web_element)
        self.assertFalse(self.element._wait_until_page_ready.called)

    @mock.patch(
        "ExtendedSelenium2Library.keywords.extendedelement._ElementKeywords.click_link"
    )
    def test_should_click_link(self, mock_click_link):
        """Should click a link."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_link(self.locator)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(
            self.locator)
        mock_click_link.assert_called_with(self.web_element)
        self.element._wait_until_page_ready.assert_called_with()

    @mock.patch(
        "ExtendedSelenium2Library.keywords.extendedelement._ElementKeywords.click_link"
    )
    def test_should_click_link_and_skip_ready(self, mock_click_link):
        """Should click a link with skip_ready."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_link(self.locator, True)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(
            self.locator)
        mock_click_link.assert_called_with(self.web_element)
        self.assertFalse(self.element._wait_until_page_ready.called)

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement."
                "_ElementKeywords.double_click_element")
    def test_should_double_click_element(self, mock_double_click_element):
        """Should double click an element."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.double_click_element(self.locator)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(
            self.locator)
        mock_double_click_element.assert_called_with(self.web_element)
        self.element._wait_until_page_ready.assert_called_with()

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement."
                "_ElementKeywords.double_click_element")
    def test_should_double_click_element_and_skip_ready(
            self, mock_double_click_element):
        """Should double click an element."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.double_click_element(self.locator, True)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(
            self.locator)
        mock_double_click_element.assert_called_with(self.web_element)
        self.assertFalse(self.element._wait_until_page_ready.called)

    def test_element_attribute_should_contain(self):
        """Element attribute should contain expected."""
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = self.locator_class
        self.element.element_attribute_should_contain(self.locator_attribute,
                                                      self.locator_class)
        self.element.get_element_attribute.assert_called_with(
            self.locator_attribute)

    def test_element_attribute_should_raise_exception(self):
        """Element attribute should raise exception."""
        actual = 'nada'
        message = "Element attribute '%s' should have contained '%s' but its value was '%s'." %\
                  (self.locator_attribute, self.locator_class, actual)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = actual
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_contain(
                self.locator_attribute, self.locator_class)
        self.element.get_element_attribute.assert_called_with(
            self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_element_attribute_should_raise_custom_message_exception(self):
        """Element attribute should raise exception with custom message."""
        actual = 'nada'
        message = "Locator '%s' should have contained '%s' but it was '%s'." %\
                  (self.locator_attribute, self.locator_class, actual)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = actual
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_contain(
                self.locator_attribute, self.locator_class, message)
        self.element.get_element_attribute.assert_called_with(
            self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_element_attribute_should_not_contain(self):
        """Element attribute should not contain unexpected."""
        actual = 'nada'
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = actual
        self.element.element_attribute_should_not_contain(
            self.locator_attribute, self.locator_class)
        self.element.get_element_attribute.assert_called_with(
            self.locator_attribute)

    def test_element_attribute_not_contain_should_raise_exception(self):
        """Element attribute not contain should raise exception."""
        message = "Element attribute '%s' should not contain '%s' but it did." %\
                  (self.locator_attribute, self.locator_class)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = self.locator_class
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_not_contain(
                self.locator_attribute, self.locator_class)
        self.element.get_element_attribute.assert_called_with(
            self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_element_attribute_not_contain_should_raise_custom_message_exception(
            self):
        """Element attribute not contain should raise exception with custom message."""
        message = "Locator '%s' should not contain '%s' but it did." %\
                  (self.locator_attribute, self.locator_class)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = self.locator_class
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_not_contain(
                self.locator_attribute, self.locator_class, message)
        self.element.get_element_attribute.assert_called_with(
            self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_is_element_visible(self):
        """Element should be visible."""
        self.element._is_visible = mock.Mock()
        self.element._is_visible.return_value = True
        self.assertTrue(self.element.is_element_visible(self.locator))
        self.element._is_visible.assert_called_with(self.locator)

    def test_is_element_not_visible(self):
        """Element should not be visible."""
        self.element._is_visible = mock.Mock()
        self.element._is_visible.return_value = False
        self.assertFalse(self.element.is_element_visible(self.locator))
        self.element._is_visible.assert_called_with(self.locator)

    def test_scroll_element_into_view(self):
        """Scroll element into view."""
        self.element._element_find = mock.Mock()
        self.element._element_find.return_value = self.web_element
        self.element._current_browser().execute_script = mock.Mock()
        self.assertEqual(self.element.scroll_element_into_view(self.locator),
                         self.web_element)
        self.element._element_find.assert_called_with(self.locator, True, True)
        self.element._current_browser().\
            execute_script.assert_called_with('arguments[0].scrollIntoView()',
                                              self.web_element)

    def test_scroll_element_into_view_raise_exception(self):
        """Scroll element into view raise exception."""
        message = "Element '%s' not found." % self.locator
        self.element._element_find = mock.Mock()
        self.element._element_find.return_value = None
        with self.assertRaises(AssertionError) as context:
            self.assertIsNone(
                self.element.scroll_element_into_view(self.locator))
        self.assertEqual(' '.join(context.exception.args).strip(), message)
        self.element._element_find.assert_called_with(self.locator, True, True)
        self.assertFalse(self.element._current_browser().execute_script.called)

    def test_get_browser_name(self):
        """Should return browser name."""
        self.element._current_browser().capabilities = {
            'browserName': 'chrome'
        }
        self.assertEqual(self.element._get_browser_name(), 'chrome')

    def test_is_internet_explorer(self):
        """Browser name should be internet explorer."""
        self.element._get_browser_name = mock.Mock()
        self.element._get_browser_name.return_value = 'ie'
        self.assertTrue(self.element._is_internet_explorer())
        self.element._get_browser_name.assert_called_with()

    def test_is_not_internet_explorer(self):
        """Browser name should not be internet explorer."""
        self.element._get_browser_name = mock.Mock()
        self.assertFalse(self.element._is_internet_explorer('chrome'))
        self.assertFalse(self.element._get_browser_name.called)

    def test_scroll_into_view_on_internet_explorer(self):
        """Should scroll into view on internet explorer."""
        self.element._element_find = mock.Mock()
        self.element._element_find.return_value = self.web_element
        self.element._is_internet_explorer = mock.Mock()
        self.element._is_internet_explorer.return_value = True
        self.element.scroll_element_into_view = mock.Mock()
        self.assertEqual(
            self.element._scroll_into_view_on_internet_explorer(self.locator),
            self.web_element)
        self.element._element_find.assert_called_with(self.locator, True, True)
        self.element._is_internet_explorer.assert_called_with()
        self.element.scroll_element_into_view.assert_called_with(
            self.web_element)

    def test_not_scroll_into_view_on_non_internet_explorer(self):
        """Should not scroll into view on non internet explorer."""
        self.element._element_find = mock.Mock()
        self.element._element_find.return_value = self.web_element
        self.element._is_internet_explorer = mock.Mock()
        self.element._is_internet_explorer.return_value = False
        self.element.scroll_element_into_view = mock.Mock()
        self.assertEqual(
            self.element._scroll_into_view_on_internet_explorer(self.locator),
            self.web_element)
        self.element._element_find.assert_called_with(self.locator, True, True)
        self.element._is_internet_explorer.assert_called_with()
        self.assertFalse(self.element.scroll_element_into_view.called)
Exemple #8
0
class ExtendedElementTests(unittest.TestCase):
    """Extended element keyword test class."""
    def setUp(self):
        """Instantiate the extended element class."""
        self.driver = mock.Mock()
        self.driver.session_id = 'session'
        self.element = ExtendedElementKeywords()
        # pylint: disable=protected-access
        self.element._current_browser = mock.Mock()
        self.element._info = mock.Mock()
        self.element._wait_until_page_ready = mock.Mock()
        self.locator = 'css=.selector'
        self.locator_attribute = 'css=.selector@class'
        self.locator_class = 'selector'
        self.web_element = WebElement(self.driver, 'element', False)
        self.web_element.click = mock.Mock()

    def test_should_inherit_keywords(self):
        """Extended element instance should inherit Selenium2 element instances."""
        self.assertIsInstance(self.element, _ElementKeywords)

    def test_should_click_element(self):
        """Should click an element."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock(
        )
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_element(self.locator)
        self.element._info.assert_called_with("Clicking element '%s'." %
                                              self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.assert_called_with(
            self.locator)
        self.web_element.click.assert_called_with()
        self.element._wait_until_page_ready.assert_called_with()

    def test_should_click_element_and_skip_ready(self):
        """Should click an element with skip_ready."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock(
        )
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_element(self.locator, True)
        self.element._info.assert_called_with("Clicking element '%s'." %
                                              self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.assert_called_with(
            self.locator)
        self.web_element.click.assert_called_with()
        self.assertFalse(self.element._wait_until_page_ready.called)

    @mock.patch(
        "ExtendedSelenium2Library.keywords.extendedelement.ActionChains")
    def test_should_click_element_at_coordinates(self, mock_action_chains):
        """Should click an element at given coordinates."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock(
        )
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_element_at_coordinates(self.locator, 0, 0)
        self.element._info.assert_called_with(
            "Clicking element '%s' in coordinates '%s', '%s'." %
            (self.locator, 0, 0))
        self.element._get_element_and_scroll_into_view_on_iexplore.assert_called_with(
            self.locator)
        mock_action_chains.assert_called_with(self.element._current_browser())
        action_chains = mock_action_chains(self.element._current_browser())
        action_chains.move_to_element.assert_called_with(self.web_element)
        move_to_element = action_chains.move_to_element(self.web_element)
        move_to_element.move_by_offset.assert_called_with(0, 0)
        move_by_offset = move_to_element.move_by_offset(0, 0)
        move_by_offset.click.assert_called_with()
        click = move_by_offset.click()
        click.perform.assert_called_with()
        self.element._wait_until_page_ready.assert_called_with()

    @mock.patch(
        "ExtendedSelenium2Library.keywords.extendedelement.ActionChains")
    def test_should_click_el_at_coords_and_skip_ready(self,
                                                      mock_action_chains):
        """Should click an element at given coordinates with skip_ready."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock(
        )
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_element_at_coordinates(self.locator, 0, 0, True)
        self.element._info.assert_called_with(
            "Clicking element '%s' in coordinates '%s', '%s'." %
            (self.locator, 0, 0))
        self.element._get_element_and_scroll_into_view_on_iexplore.assert_called_with(
            self.locator)
        mock_action_chains.assert_called_with(self.element._current_browser())
        action_chains = mock_action_chains(self.element._current_browser())
        action_chains.move_to_element.assert_called_with(self.web_element)
        move_to_element = action_chains.move_to_element(self.web_element)
        move_to_element.move_by_offset.assert_called_with(0, 0)
        move_by_offset = move_to_element.move_by_offset(0, 0)
        move_by_offset.click.assert_called_with()
        click = move_by_offset.click()
        click.perform.assert_called_with()
        self.assertFalse(self.element._wait_until_page_ready.called)

    def test_should_click_image(self):
        """Should click an image."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock(
        )
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_image(self.locator)
        self.element._info.assert_called_with("Clicking image '%s'." %
                                              self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.\
            assert_called_with(self.locator, False, 'image')
        self.web_element.click.assert_called_with()
        self.element._wait_until_page_ready.assert_called_with()

    def test_should_click_image_and_skip_ready(self):
        """Should click an image with skip_ready."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock(
        )
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_image(self.locator, True)
        self.element._info.assert_called_with("Clicking image '%s'." %
                                              self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.\
            assert_called_with(self.locator, False, 'image')
        self.web_element.click.assert_called_with()
        self.assertFalse(self.element._wait_until_page_ready.called)

    def test_should_click_input_image(self):
        """Should click an input image."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock(
        )
        self.element._get_element_and_scroll_into_view_on_iexplore.side_effect = \
            [None, self.web_element]
        self.element.click_image(self.locator)
        self.element._info.assert_called_with("Clicking image '%s'." %
                                              self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.\
            assert_called_with(self.locator, True, 'input')
        self.web_element.click.assert_called_with()
        self.element._wait_until_page_ready.assert_called_with()

    def test_should_click_input_image_and_skip_ready(self):
        """Should click an input image with skip_ready."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock(
        )
        self.element._get_element_and_scroll_into_view_on_iexplore.side_effect = \
            [None, self.web_element]
        self.element.click_image(self.locator, True)
        self.element._info.assert_called_with("Clicking image '%s'." %
                                              self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.\
            assert_called_with(self.locator, True, 'input')
        self.web_element.click.assert_called_with()
        self.assertFalse(self.element._wait_until_page_ready.called)

    def test_should_click_link(self):
        """Should click a link."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock(
        )
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_link(self.locator)
        self.element._info.assert_called_with("Clicking link '%s'." %
                                              self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.\
            assert_called_with(self.locator, tag='a')
        self.web_element.click.assert_called_with()
        self.element._wait_until_page_ready.assert_called_with()

    def test_should_click_link_and_skip_ready(self):
        """Should click a link with skip_ready."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock(
        )
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_link(self.locator, True)
        self.element._info.assert_called_with("Clicking link '%s'." %
                                              self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.\
            assert_called_with(self.locator, tag='a')
        self.web_element.click.assert_called_with()
        self.assertFalse(self.element._wait_until_page_ready.called)

    @mock.patch(
        "ExtendedSelenium2Library.keywords.extendedelement.ActionChains")
    def test_should_double_click_element(self, mock_action_chains):
        """Should double click an element."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock(
        )
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.double_click_element(self.locator)
        self.element._info.assert_called_with("Double clicking element '%s'." %
                                              self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.assert_called_with(
            self.locator)
        mock_action_chains.assert_called_with(self.element._current_browser())
        action_chains = mock_action_chains(self.element._current_browser())
        action_chains.double_click.assert_called_with(self.web_element)
        double_click = action_chains.double_click(self.web_element)
        double_click.perform.assert_called_with()
        self.element._wait_until_page_ready.assert_called_with()

    @mock.patch(
        "ExtendedSelenium2Library.keywords.extendedelement.ActionChains")
    def test_should_double_click_element_and_skip_ready(
            self, mock_action_chains):
        """Should double click an element with skip ready."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock(
        )
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.double_click_element(self.locator, True)
        self.element._info.assert_called_with("Double clicking element '%s'." %
                                              self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.assert_called_with(
            self.locator)
        mock_action_chains.assert_called_with(self.element._current_browser())
        action_chains = mock_action_chains(self.element._current_browser())
        action_chains.double_click.assert_called_with(self.web_element)
        double_click = action_chains.double_click(self.web_element)
        double_click.perform.assert_called_with()
        self.assertFalse(self.element._wait_until_page_ready.called)

    def test_element_attribute_should_contain(self):
        """Element attribute should contain expected."""
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = self.locator_class
        self.element.element_attribute_should_contain(self.locator_attribute,
                                                      self.locator_class)
        self.element.get_element_attribute.assert_called_with(
            self.locator_attribute)

    def test_element_attribute_should_raise_exception(self):
        """Element attribute should raise exception."""
        actual = 'nada'
        message = "Element attribute '%s' should have contained '%s' but its value was '%s'." %\
                  (self.locator_attribute, self.locator_class, actual)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = actual
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_contain(
                self.locator_attribute, self.locator_class)
        self.element.get_element_attribute.assert_called_with(
            self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_el_attr_should_raise_custom_msg_exception(self):
        """Element attribute should raise exception with custom message."""
        actual = 'nada'
        message = "Locator '%s' should have contained '%s' but it was '%s'." %\
                  (self.locator_attribute, self.locator_class, actual)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = actual
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_contain(
                self.locator_attribute, self.locator_class, message)
        self.element.get_element_attribute.assert_called_with(
            self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_element_attribute_should_not_contain(self):
        """Element attribute should not contain unexpected."""
        actual = 'nada'
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = actual
        self.element.element_attribute_should_not_contain(
            self.locator_attribute, self.locator_class)
        self.element.get_element_attribute.assert_called_with(
            self.locator_attribute)

    def test_el_attr_not_contain_should_raise_exception(self):
        """Element attribute not contain should raise exception."""
        message = "Element attribute '%s' should not contain '%s' but it did." %\
                  (self.locator_attribute, self.locator_class)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = self.locator_class
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_not_contain(
                self.locator_attribute, self.locator_class)
        self.element.get_element_attribute.assert_called_with(
            self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_el_attr_not_contain_raise_custom_msg_ex(self):
        """Element attribute not contain should raise exception with custom message."""
        message = "Locator '%s' should not contain '%s' but it did." %\
                  (self.locator_attribute, self.locator_class)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = self.locator_class
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_not_contain(
                self.locator_attribute, self.locator_class, message)
        self.element.get_element_attribute.assert_called_with(
            self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_is_element_visible(self):
        """Element should be visible."""
        # pylint: disable=protected-access
        self.element._is_visible = mock.Mock()
        self.element._is_visible.return_value = True
        self.assertTrue(self.element.is_element_visible(self.locator))
        self.element._is_visible.assert_called_with(self.locator)

    def test_is_element_not_visible(self):
        """Element should not be visible."""
        # pylint: disable=protected-access
        self.element._is_visible = mock.Mock()
        self.element._is_visible.return_value = False
        self.assertFalse(self.element.is_element_visible(self.locator))
        self.element._is_visible.assert_called_with(self.locator)

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement.logger")
    def test_scroll_element_into_view(self, mock_logger):
        """Scroll element into view."""
        # pylint: disable=protected-access
        self.element._current_browser().execute_script = mock.Mock()
        self.element._element_find = mock.Mock()
        self.element._element_find.return_value = self.web_element
        self.assertEqual(self.element.scroll_element_into_view(self.locator),
                         self.web_element)
        mock_logger.info.assert_called_with(
            "Scrolling element '%s' into view." % self.locator)
        self.element._element_find.assert_called_with(self.locator, True, True)
        self.element._current_browser().\
            execute_script.assert_called_with('arguments[0].scrollIntoView()',
                                              self.web_element)

    def test_scroll_element_into_view_with_web_element(self):
        """Scroll element into view with web element."""
        # pylint: disable=protected-access
        self.element._current_browser().execute_script = mock.Mock()
        self.element._element_find = mock.Mock()
        self.assertEqual(
            self.element.scroll_element_into_view(self.web_element),
            self.web_element)
        self.assertFalse(self.element._info.called)
        self.assertFalse(self.element._element_find.called)
        self.element._current_browser().\
            execute_script.assert_called_with('arguments[0].scrollIntoView()',
                                              self.web_element)

    def test_get_browser_name(self):
        """Should return browser name."""
        # pylint: disable=protected-access
        self.element._current_browser().capabilities = {
            'browserName': 'chrome'
        }
        self.assertEqual(self.element._get_browser_name(), 'chrome')

    def test_get_element_and_scroll_into_view_on_iexplore(self):
        """Should scroll into view on internet explorer and returns the element."""
        # pylint: disable=protected-access
        self.element._element_find = mock.Mock()
        self.element._element_find.return_value = self.web_element
        self.element._is_internet_explorer = mock.Mock()
        self.element._is_internet_explorer.return_value = True
        self.element.scroll_element_into_view = mock.Mock()
        self.assertEqual(
            self.element._get_element_and_scroll_into_view_on_iexplore(
                self.locator), self.web_element)
        self.element._element_find.assert_called_with(self.locator, True, True,
                                                      None)
        self.element._is_internet_explorer.assert_called_with()
        self.element.scroll_element_into_view.assert_called_with(
            self.web_element)

    def test_get_el_and_not_scroll_on_non_iexplore(self):
        """Should not scroll into view on non internet explorer and returns element."""
        # pylint: disable=protected-access
        self.element._element_find = mock.Mock()
        self.element._element_find.return_value = self.web_element
        self.element._is_internet_explorer = mock.Mock()
        self.element._is_internet_explorer.return_value = False
        self.element.scroll_element_into_view = mock.Mock()
        self.assertEqual(
            self.element._get_element_and_scroll_into_view_on_iexplore(
                self.locator), self.web_element)
        self.element._element_find.assert_called_with(self.locator, True, True,
                                                      None)
        self.element._is_internet_explorer.assert_called_with()
        self.assertFalse(self.element.scroll_element_into_view.called)

    def test_is_internet_explorer(self):
        """Browser name should be internet explorer."""
        # pylint: disable=protected-access
        self.element._get_browser_name = mock.Mock()
        self.element._get_browser_name.return_value = 'ie'
        self.assertTrue(self.element._is_internet_explorer())
        self.element._get_browser_name.assert_called_with()

    def test_is_not_internet_explorer(self):
        """Browser name should not be internet explorer."""
        # pylint: disable=protected-access
        self.element._get_browser_name = mock.Mock()
        self.assertFalse(self.element._is_internet_explorer('chrome'))
        self.assertFalse(self.element._get_browser_name.called)
class ExtendedElementTests(unittest.TestCase):
    """Extended element keyword test class."""

    def setUp(self):
        """Instantiate the extended element class."""
        self.element = ExtendedElementKeywords()
        self.element._current_browser = mock.Mock()
        self.element._wait_until_page_ready = mock.Mock()
        self.locator = 'css=.selector'
        self.locator_attribute = 'css=.selector@class'
        self.locator_class = 'selector'
        self.web_element = WebElement('element', False)

    def test_should_inherit_keywords(self):
        """Extended element instance should inherit Selenium2 element instances."""
        self.assertIsInstance(self.element, _ElementKeywords)

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement._ElementKeywords.click_element")
    def test_should_click_element(self, mock_click_element):
        """Should click an element."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_element(self.locator)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(self.locator)
        mock_click_element.assert_called_with(self.web_element)
        self.element._wait_until_page_ready.assert_called_with()

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement._ElementKeywords.click_element")
    def test_should_click_elementi_and_skip_ready(self, mock_click_element):
        """Should click an element with skip_ready."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_element(self.locator, True)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(self.locator)
        mock_click_element.assert_called_with(self.web_element)
        self.assertFalse(self.element._wait_until_page_ready.called)

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement."
                "_ElementKeywords.click_element_at_coordinates")
    def test_should_click_element_at_coordinates(self, mock_click_element_at_coordinates):
        """Should click an element at given coordinates."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_element_at_coordinates(self.locator, 0, 0)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(self.locator)
        mock_click_element_at_coordinates.assert_called_with(self.web_element, 0, 0)
        self.element._wait_until_page_ready.assert_called_with()

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement."
                "_ElementKeywords.click_element_at_coordinates")
    def test_should_click_element_at_coordinates_and_skip_ready(self,
                                                                mock_click_element_at_coordinates):
        """Should click an element at given coordinates with skip_ready."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_element_at_coordinates(self.locator, 0, 0, True)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(self.locator)
        mock_click_element_at_coordinates.assert_called_with(self.web_element, 0, 0)
        self.assertFalse(self.element._wait_until_page_ready.called)

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement._ElementKeywords.click_image")
    def test_should_click_image(self, mock_click_image):
        """Should click an image."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_image(self.locator)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(self.locator)
        mock_click_image.assert_called_with(self.web_element)
        self.element._wait_until_page_ready.assert_called_with()

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement._ElementKeywords.click_image")
    def test_should_click_image_and_skip_ready(self, mock_click_image):
        """Should click an image with skip_ready."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_image(self.locator, True)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(self.locator)
        mock_click_image.assert_called_with(self.web_element)
        self.assertFalse(self.element._wait_until_page_ready.called)

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement._ElementKeywords.click_link")
    def test_should_click_link(self, mock_click_link):
        """Should click a link."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_link(self.locator)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(self.locator)
        mock_click_link.assert_called_with(self.web_element)
        self.element._wait_until_page_ready.assert_called_with()

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement._ElementKeywords.click_link")
    def test_should_click_link_and_skip_ready(self, mock_click_link):
        """Should click a link with skip_ready."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.click_link(self.locator, True)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(self.locator)
        mock_click_link.assert_called_with(self.web_element)
        self.assertFalse(self.element._wait_until_page_ready.called)

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement."
                "_ElementKeywords.double_click_element")
    def test_should_double_click_element(self, mock_double_click_element):
        """Should double click an element."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.double_click_element(self.locator)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(self.locator)
        mock_double_click_element.assert_called_with(self.web_element)
        self.element._wait_until_page_ready.assert_called_with()

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement."
                "_ElementKeywords.double_click_element")
    def test_should_double_click_element_and_skip_ready(self, mock_double_click_element):
        """Should double click an element."""
        self.element._scroll_into_view_on_internet_explorer = mock.Mock()
        self.element._scroll_into_view_on_internet_explorer.return_value = self.web_element
        self.element.double_click_element(self.locator, True)
        self.element._scroll_into_view_on_internet_explorer.assert_called_with(self.locator)
        mock_double_click_element.assert_called_with(self.web_element)
        self.assertFalse(self.element._wait_until_page_ready.called)

    def test_element_attribute_should_contain(self):
        """Element attribute should contain expected."""
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = self.locator_class
        self.element.element_attribute_should_contain(self.locator_attribute, self.locator_class)
        self.element.get_element_attribute.assert_called_with(self.locator_attribute)

    def test_element_attribute_should_raise_exception(self):
        """Element attribute should raise exception."""
        actual = 'nada'
        message = "Element attribute '%s' should have contained '%s' but its value was '%s'." %\
                  (self.locator_attribute, self.locator_class, actual)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = actual
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_contain(self.locator_attribute,
                                                          self.locator_class)
        self.element.get_element_attribute.assert_called_with(self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_element_attribute_should_raise_custom_message_exception(self):
        """Element attribute should raise exception with custom message."""
        actual = 'nada'
        message = "Locator '%s' should have contained '%s' but it was '%s'." %\
                  (self.locator_attribute, self.locator_class, actual)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = actual
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_contain(self.locator_attribute,
                                                          self.locator_class,
                                                          message)
        self.element.get_element_attribute.assert_called_with(self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_element_attribute_should_not_contain(self):
        """Element attribute should not contain unexpected."""
        actual = 'nada'
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = actual
        self.element.element_attribute_should_not_contain(self.locator_attribute,
                                                          self.locator_class)
        self.element.get_element_attribute.assert_called_with(self.locator_attribute)

    def test_element_attribute_not_contain_should_raise_exception(self):
        """Element attribute not contain should raise exception."""
        message = "Element attribute '%s' should not contain '%s' but it did." %\
                  (self.locator_attribute, self.locator_class)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = self.locator_class
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_not_contain(self.locator_attribute,
                                                              self.locator_class)
        self.element.get_element_attribute.assert_called_with(self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_element_attribute_not_contain_should_raise_custom_message_exception(self):
        """Element attribute not contain should raise exception with custom message."""
        message = "Locator '%s' should not contain '%s' but it did." %\
                  (self.locator_attribute, self.locator_class)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = self.locator_class
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_not_contain(self.locator_attribute,
                                                              self.locator_class,
                                                              message)
        self.element.get_element_attribute.assert_called_with(self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_is_element_visible(self):
        """Element should be visible."""
        self.element._is_visible = mock.Mock()
        self.element._is_visible.return_value = True
        self.assertTrue(self.element.is_element_visible(self.locator))
        self.element._is_visible.assert_called_with(self.locator)

    def test_is_element_not_visible(self):
        """Element should not be visible."""
        self.element._is_visible = mock.Mock()
        self.element._is_visible.return_value = False
        self.assertFalse(self.element.is_element_visible(self.locator))
        self.element._is_visible.assert_called_with(self.locator)

    def test_scroll_element_into_view(self):
        """Scroll element into view."""
        self.element._element_find = mock.Mock()
        self.element._element_find.return_value = self.web_element
        self.element._current_browser().execute_script = mock.Mock()
        self.assertEqual(self.element.scroll_element_into_view(self.locator),
                         self.web_element)
        self.element._element_find.assert_called_with(self.locator, True, True)
        self.element._current_browser().\
            execute_script.assert_called_with('arguments[0].scrollIntoView()',
                                              self.web_element)

    def test_scroll_element_into_view_raise_exception(self):
        """Scroll element into view raise exception."""
        message = "Element '%s' not found." % self.locator
        self.element._element_find = mock.Mock()
        self.element._element_find.return_value = None
        with self.assertRaises(AssertionError) as context:
            self.assertIsNone(self.element.scroll_element_into_view(self.locator))
        self.assertEqual(' '.join(context.exception.args).strip(), message)
        self.element._element_find.assert_called_with(self.locator, True, True)
        self.assertFalse(self.element._current_browser().execute_script.called)

    def test_get_browser_name(self):
        """Should return browser name."""
        self.element._current_browser().capabilities = {'browserName': 'chrome'}
        self.assertEqual(self.element._get_browser_name(), 'chrome')

    def test_is_internet_explorer(self):
        """Browser name should be internet explorer."""
        self.element._get_browser_name = mock.Mock()
        self.element._get_browser_name.return_value = 'ie'
        self.assertTrue(self.element._is_internet_explorer())
        self.element._get_browser_name.assert_called_with()

    def test_is_not_internet_explorer(self):
        """Browser name should not be internet explorer."""
        self.element._get_browser_name = mock.Mock()
        self.assertFalse(self.element._is_internet_explorer('chrome'))
        self.assertFalse(self.element._get_browser_name.called)

    def test_scroll_into_view_on_internet_explorer(self):
        """Should scroll into view on internet explorer."""
        self.element._element_find = mock.Mock()
        self.element._element_find.return_value = self.web_element
        self.element._is_internet_explorer = mock.Mock()
        self.element._is_internet_explorer.return_value = True
        self.element.scroll_element_into_view = mock.Mock()
        self.assertEqual(self.element._scroll_into_view_on_internet_explorer(self.locator),
                         self.web_element)
        self.element._element_find.assert_called_with(self.locator, True, True)
        self.element._is_internet_explorer.assert_called_with()
        self.element.scroll_element_into_view.assert_called_with(self.web_element)

    def test_not_scroll_into_view_on_non_internet_explorer(self):
        """Should not scroll into view on non internet explorer."""
        self.element._element_find = mock.Mock()
        self.element._element_find.return_value = self.web_element
        self.element._is_internet_explorer = mock.Mock()
        self.element._is_internet_explorer.return_value = False
        self.element.scroll_element_into_view = mock.Mock()
        self.assertEqual(self.element._scroll_into_view_on_internet_explorer(self.locator),
                         self.web_element)
        self.element._element_find.assert_called_with(self.locator, True, True)
        self.element._is_internet_explorer.assert_called_with()
        self.assertFalse(self.element.scroll_element_into_view.called)
class ExtendedElementTests(unittest.TestCase):
    """Extended element keyword test class."""

    def setUp(self):
        """Instantiate the extended element class."""
        self.driver = mock.Mock()
        self.driver.session_id = 'session'
        self.element = ExtendedElementKeywords()
        # pylint: disable=protected-access
        self.element._current_browser = mock.Mock()
        self.element._info = mock.Mock()
        self.element._wait_until_page_ready = mock.Mock()
        self.locator = 'css=.selector'
        self.locator_attribute = 'css=.selector@class'
        self.locator_class = 'selector'
        self.web_element = WebElement(self.driver, 'element', False)
        self.web_element.click = mock.Mock()

    def test_should_inherit_keywords(self):
        """Extended element instance should inherit Selenium2 element instances."""
        self.assertIsInstance(self.element, _ElementKeywords)

    def test_should_click_element(self):
        """Should click an element."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock()
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_element(self.locator)
        self.element._info.assert_called_with("Clicking element '%s'." % self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.assert_called_with(self.locator)
        self.web_element.click.assert_called_with()
        self.element._wait_until_page_ready.assert_called_with()

    def test_should_click_element_and_skip_ready(self):
        """Should click an element with skip_ready."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock()
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_element(self.locator, True)
        self.element._info.assert_called_with("Clicking element '%s'." % self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.assert_called_with(self.locator)
        self.web_element.click.assert_called_with()
        self.assertFalse(self.element._wait_until_page_ready.called)

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement.ActionChains")
    def test_should_click_element_at_coordinates(self, mock_action_chains):
        """Should click an element at given coordinates."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock()
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_element_at_coordinates(self.locator, 0, 0)
        self.element._info.assert_called_with("Clicking element '%s' in coordinates '%s', '%s'." %
                                              (self.locator, 0, 0))
        self.element._get_element_and_scroll_into_view_on_iexplore.assert_called_with(self.locator)
        mock_action_chains.assert_called_with(self.element._current_browser())
        action_chains = mock_action_chains(self.element._current_browser())
        action_chains.move_to_element.assert_called_with(self.web_element)
        move_to_element = action_chains.move_to_element(self.web_element)
        move_to_element.move_by_offset.assert_called_with(0, 0)
        move_by_offset = move_to_element.move_by_offset(0, 0)
        move_by_offset.click.assert_called_with()
        click = move_by_offset.click()
        click.perform.assert_called_with()
        self.element._wait_until_page_ready.assert_called_with()

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement.ActionChains")
    def test_should_click_el_at_coords_and_skip_ready(self, mock_action_chains):
        """Should click an element at given coordinates with skip_ready."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock()
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_element_at_coordinates(self.locator, 0, 0, True)
        self.element._info.assert_called_with("Clicking element '%s' in coordinates '%s', '%s'." %
                                              (self.locator, 0, 0))
        self.element._get_element_and_scroll_into_view_on_iexplore.assert_called_with(self.locator)
        mock_action_chains.assert_called_with(self.element._current_browser())
        action_chains = mock_action_chains(self.element._current_browser())
        action_chains.move_to_element.assert_called_with(self.web_element)
        move_to_element = action_chains.move_to_element(self.web_element)
        move_to_element.move_by_offset.assert_called_with(0, 0)
        move_by_offset = move_to_element.move_by_offset(0, 0)
        move_by_offset.click.assert_called_with()
        click = move_by_offset.click()
        click.perform.assert_called_with()
        self.assertFalse(self.element._wait_until_page_ready.called)

    def test_should_click_image(self):
        """Should click an image."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock()
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_image(self.locator)
        self.element._info.assert_called_with("Clicking image '%s'." % self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.\
            assert_called_with(self.locator, False, 'image')
        self.web_element.click.assert_called_with()
        self.element._wait_until_page_ready.assert_called_with()

    def test_should_click_image_and_skip_ready(self):
        """Should click an image with skip_ready."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock()
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_image(self.locator, True)
        self.element._info.assert_called_with("Clicking image '%s'." % self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.\
            assert_called_with(self.locator, False, 'image')
        self.web_element.click.assert_called_with()
        self.assertFalse(self.element._wait_until_page_ready.called)

    def test_should_click_input_image(self):
        """Should click an input image."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock()
        self.element._get_element_and_scroll_into_view_on_iexplore.side_effect = \
            [None, self.web_element]
        self.element.click_image(self.locator)
        self.element._info.assert_called_with("Clicking image '%s'." % self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.\
            assert_called_with(self.locator, True, 'input')
        self.web_element.click.assert_called_with()
        self.element._wait_until_page_ready.assert_called_with()

    def test_should_click_input_image_and_skip_ready(self):
        """Should click an input image with skip_ready."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock()
        self.element._get_element_and_scroll_into_view_on_iexplore.side_effect = \
            [None, self.web_element]
        self.element.click_image(self.locator, True)
        self.element._info.assert_called_with("Clicking image '%s'." % self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.\
            assert_called_with(self.locator, True, 'input')
        self.web_element.click.assert_called_with()
        self.assertFalse(self.element._wait_until_page_ready.called)

    def test_should_click_link(self):
        """Should click a link."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock()
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_link(self.locator)
        self.element._info.assert_called_with("Clicking link '%s'." % self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.\
            assert_called_with(self.locator, tag='a')
        self.web_element.click.assert_called_with()
        self.element._wait_until_page_ready.assert_called_with()

    def test_should_click_link_and_skip_ready(self):
        """Should click a link with skip_ready."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock()
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.click_link(self.locator, True)
        self.element._info.assert_called_with("Clicking link '%s'." % self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.\
            assert_called_with(self.locator, tag='a')
        self.web_element.click.assert_called_with()
        self.assertFalse(self.element._wait_until_page_ready.called)

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement.ActionChains")
    def test_should_double_click_element(self, mock_action_chains):
        """Should double click an element."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock()
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.double_click_element(self.locator)
        self.element._info.assert_called_with("Double clicking element '%s'." % self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.assert_called_with(self.locator)
        mock_action_chains.assert_called_with(self.element._current_browser())
        action_chains = mock_action_chains(self.element._current_browser())
        action_chains.double_click.assert_called_with(self.web_element)
        double_click = action_chains.double_click(self.web_element)
        double_click.perform.assert_called_with()
        self.element._wait_until_page_ready.assert_called_with()

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement.ActionChains")
    def test_should_double_click_element_and_skip_ready(self, mock_action_chains):
        """Should double click an element with skip ready."""
        # pylint: disable=protected-access
        self.element._get_element_and_scroll_into_view_on_iexplore = mock.Mock()
        self.element._get_element_and_scroll_into_view_on_iexplore.return_value = self.web_element
        self.element.double_click_element(self.locator, True)
        self.element._info.assert_called_with("Double clicking element '%s'." % self.locator)
        self.element._get_element_and_scroll_into_view_on_iexplore.assert_called_with(self.locator)
        mock_action_chains.assert_called_with(self.element._current_browser())
        action_chains = mock_action_chains(self.element._current_browser())
        action_chains.double_click.assert_called_with(self.web_element)
        double_click = action_chains.double_click(self.web_element)
        double_click.perform.assert_called_with()
        self.assertFalse(self.element._wait_until_page_ready.called)

    def test_element_attribute_should_contain(self):
        """Element attribute should contain expected."""
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = self.locator_class
        self.element.element_attribute_should_contain(self.locator_attribute, self.locator_class)
        self.element.get_element_attribute.assert_called_with(self.locator_attribute)

    def test_element_attribute_should_raise_exception(self):
        """Element attribute should raise exception."""
        actual = 'nada'
        message = "Element attribute '%s' should have contained '%s' but its value was '%s'." %\
                  (self.locator_attribute, self.locator_class, actual)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = actual
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_contain(self.locator_attribute,
                                                          self.locator_class)
        self.element.get_element_attribute.assert_called_with(self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_el_attr_should_raise_custom_msg_exception(self):
        """Element attribute should raise exception with custom message."""
        actual = 'nada'
        message = "Locator '%s' should have contained '%s' but it was '%s'." %\
                  (self.locator_attribute, self.locator_class, actual)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = actual
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_contain(self.locator_attribute,
                                                          self.locator_class,
                                                          message)
        self.element.get_element_attribute.assert_called_with(self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_element_attribute_should_not_contain(self):
        """Element attribute should not contain unexpected."""
        actual = 'nada'
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = actual
        self.element.element_attribute_should_not_contain(self.locator_attribute,
                                                          self.locator_class)
        self.element.get_element_attribute.assert_called_with(self.locator_attribute)

    def test_el_attr_not_contain_should_raise_exception(self):
        """Element attribute not contain should raise exception."""
        message = "Element attribute '%s' should not contain '%s' but it did." %\
                  (self.locator_attribute, self.locator_class)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = self.locator_class
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_not_contain(self.locator_attribute,
                                                              self.locator_class)
        self.element.get_element_attribute.assert_called_with(self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_el_attr_not_contain_raise_custom_msg_ex(self):
        """Element attribute not contain should raise exception with custom message."""
        message = "Locator '%s' should not contain '%s' but it did." %\
                  (self.locator_attribute, self.locator_class)
        self.element.get_element_attribute = mock.Mock()
        self.element.get_element_attribute.return_value = self.locator_class
        with self.assertRaises(AssertionError) as context:
            self.element.element_attribute_should_not_contain(self.locator_attribute,
                                                              self.locator_class,
                                                              message)
        self.element.get_element_attribute.assert_called_with(self.locator_attribute)
        self.assertEqual(' '.join(context.exception.args).strip(), message)

    def test_is_element_visible(self):
        """Element should be visible."""
        # pylint: disable=protected-access
        self.element._is_visible = mock.Mock()
        self.element._is_visible.return_value = True
        self.assertTrue(self.element.is_element_visible(self.locator))
        self.element._is_visible.assert_called_with(self.locator)

    def test_is_element_not_visible(self):
        """Element should not be visible."""
        # pylint: disable=protected-access
        self.element._is_visible = mock.Mock()
        self.element._is_visible.return_value = False
        self.assertFalse(self.element.is_element_visible(self.locator))
        self.element._is_visible.assert_called_with(self.locator)

    @mock.patch("ExtendedSelenium2Library.keywords.extendedelement.logger")
    def test_scroll_element_into_view(self, mock_logger):
        """Scroll element into view."""
        # pylint: disable=protected-access
        self.element._current_browser().execute_script = mock.Mock()
        self.element._element_find = mock.Mock()
        self.element._element_find.return_value = self.web_element
        self.assertEqual(self.element.scroll_element_into_view(self.locator),
                         self.web_element)
        mock_logger.info.assert_called_with("Scrolling element '%s' into view." % self.locator)
        self.element._element_find.assert_called_with(self.locator, True, True)
        self.element._current_browser().\
            execute_script.assert_called_with('arguments[0].scrollIntoView()',
                                              self.web_element)

    def test_scroll_element_into_view_with_web_element(self):
        """Scroll element into view with web element."""
        # pylint: disable=protected-access
        self.element._current_browser().execute_script = mock.Mock()
        self.element._element_find = mock.Mock()
        self.assertEqual(self.element.scroll_element_into_view(self.web_element),
                         self.web_element)
        self.assertFalse(self.element._info.called)
        self.assertFalse(self.element._element_find.called)
        self.element._current_browser().\
            execute_script.assert_called_with('arguments[0].scrollIntoView()',
                                              self.web_element)

    def test_get_browser_name(self):
        """Should return browser name."""
        # pylint: disable=protected-access
        self.element._current_browser().capabilities = {'browserName': 'chrome'}
        self.assertEqual(self.element._get_browser_name(), 'chrome')

    def test_get_element_and_scroll_into_view_on_iexplore(self):
        """Should scroll into view on internet explorer and returns the element."""
        # pylint: disable=protected-access
        self.element._element_find = mock.Mock()
        self.element._element_find.return_value = self.web_element
        self.element._is_internet_explorer = mock.Mock()
        self.element._is_internet_explorer.return_value = True
        self.element.scroll_element_into_view = mock.Mock()
        self.assertEqual(self.element._get_element_and_scroll_into_view_on_iexplore(self.locator),
                         self.web_element)
        self.element._element_find.assert_called_with(self.locator, True, True, None)
        self.element._is_internet_explorer.assert_called_with()
        self.element.scroll_element_into_view.assert_called_with(self.web_element)

    def test_get_el_and_not_scroll_on_non_iexplore(self):
        """Should not scroll into view on non internet explorer and returns element."""
        # pylint: disable=protected-access
        self.element._element_find = mock.Mock()
        self.element._element_find.return_value = self.web_element
        self.element._is_internet_explorer = mock.Mock()
        self.element._is_internet_explorer.return_value = False
        self.element.scroll_element_into_view = mock.Mock()
        self.assertEqual(self.element._get_element_and_scroll_into_view_on_iexplore(self.locator),
                         self.web_element)
        self.element._element_find.assert_called_with(self.locator, True, True, None)
        self.element._is_internet_explorer.assert_called_with()
        self.assertFalse(self.element.scroll_element_into_view.called)

    def test_is_internet_explorer(self):
        """Browser name should be internet explorer."""
        # pylint: disable=protected-access
        self.element._get_browser_name = mock.Mock()
        self.element._get_browser_name.return_value = 'ie'
        self.assertTrue(self.element._is_internet_explorer())
        self.element._get_browser_name.assert_called_with()

    def test_is_not_internet_explorer(self):
        """Browser name should not be internet explorer."""
        # pylint: disable=protected-access
        self.element._get_browser_name = mock.Mock()
        self.assertFalse(self.element._is_internet_explorer('chrome'))
        self.assertFalse(self.element._get_browser_name.called)