Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions src/Selenium2Library/__init__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import os
from keywords import *
from version import VERSION
from utils import LibraryListener
from .keywords import *
from .utils import LibraryListener
from .version import VERSION


__version__ = VERSION


class Selenium2Library(
_LoggingKeywords,
_RunOnFailureKeywords,
Expand Down
25 changes: 13 additions & 12 deletions src/Selenium2Library/keywords/__init__.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
from _logging import _LoggingKeywords
from _runonfailure import _RunOnFailureKeywords
from _browsermanagement import _BrowserManagementKeywords
from _element import _ElementKeywords
from _tableelement import _TableElementKeywords
from _formelement import _FormElementKeywords
from _selectelement import _SelectElementKeywords
from _javascript import _JavaScriptKeywords
from _cookie import _CookieKeywords
from _screenshot import _ScreenshotKeywords
from _waiting import _WaitingKeywords
from _alert import _AlertKeywords
from ._logging import _LoggingKeywords
from ._runonfailure import _RunOnFailureKeywords
from ._browsermanagement import _BrowserManagementKeywords
from ._element import _ElementKeywords
from ._tableelement import _TableElementKeywords
from ._formelement import _FormElementKeywords
from ._selectelement import _SelectElementKeywords
from ._javascript import _JavaScriptKeywords
from ._cookie import _CookieKeywords
from ._screenshot import _ScreenshotKeywords
from ._waiting import _WaitingKeywords
from ._alert import _AlertKeywords


__all__ = [
"_LoggingKeywords",
Expand Down
3 changes: 2 additions & 1 deletion src/Selenium2Library/keywords/_alert.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
from selenium.common.exceptions import WebDriverException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from keywordgroup import KeywordGroup

from .keywordgroup import KeywordGroup


class _AlertKeywords(KeywordGroup):
Expand Down
28 changes: 17 additions & 11 deletions src/Selenium2Library/keywords/_browsermanagement.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
import os
import robot
import os.path

from robot.errors import DataError
from robot.utils import secs_to_timestr, timestr_to_secs

from selenium import webdriver
from selenium.common.exceptions import NoSuchWindowException

from Selenium2Library import webdrivermonkeypatches
from Selenium2Library.utils import BrowserCache
from Selenium2Library.locators import WindowManager
from keywordgroup import KeywordGroup
from selenium.common.exceptions import NoSuchWindowException

from .keywordgroup import KeywordGroup


ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
FIREFOX_PROFILE_DIR = os.path.join(ROOT_DIR, 'resources', 'firefoxprofile')
Expand All @@ -27,6 +32,7 @@
'edge': "_make_edge"
}


class _BrowserManagementKeywords(KeywordGroup):

def __init__(self):
Expand Down Expand Up @@ -428,19 +434,19 @@ def get_selenium_speed(self):
"""Gets the delay in seconds that is waited after each Selenium command.

See `Set Selenium Speed` for an explanation."""
return robot.utils.secs_to_timestr(self._speed_in_secs)
return secs_to_timestr(self._speed_in_secs)

def get_selenium_timeout(self):
"""Gets the timeout in seconds that is used by various keywords.

See `Set Selenium Timeout` for an explanation."""
return robot.utils.secs_to_timestr(self._timeout_in_secs)
return secs_to_timestr(self._timeout_in_secs)

def get_selenium_implicit_wait(self):
"""Gets the wait in seconds that is waited by Selenium.

See `Set Selenium Implicit Wait` for an explanation."""
return robot.utils.secs_to_timestr(self._implicit_wait_in_secs)
return secs_to_timestr(self._implicit_wait_in_secs)

def set_selenium_speed(self, seconds):
"""Sets the delay in seconds that is waited after each Selenium command.
Expand All @@ -453,7 +459,7 @@ def set_selenium_speed(self, seconds):
| Set Selenium Speed | .5 seconds |
"""
old_speed = self.get_selenium_speed()
self._speed_in_secs = robot.utils.timestr_to_secs(seconds)
self._speed_in_secs = timestr_to_secs(seconds)
for browser in self._cache.browsers:
browser.set_speed(self._speed_in_secs)
return old_speed
Expand All @@ -476,7 +482,7 @@ def set_selenium_timeout(self, seconds):
| Set Selenium Timeout | ${orig timeout} |
"""
old_timeout = self.get_selenium_timeout()
self._timeout_in_secs = robot.utils.timestr_to_secs(seconds)
self._timeout_in_secs = timestr_to_secs(seconds)
for browser in self._cache.get_open_browsers():
browser.set_script_timeout(self._timeout_in_secs)
return old_timeout
Expand All @@ -495,7 +501,7 @@ def set_selenium_implicit_wait(self, seconds):
| Set Selenium Implicit Wait | ${orig wait} |
"""
old_wait = self.get_selenium_implicit_wait()
self._implicit_wait_in_secs = robot.utils.timestr_to_secs(seconds)
self._implicit_wait_in_secs = timestr_to_secs(seconds)
for browser in self._cache.get_open_browsers():
browser.implicitly_wait(self._implicit_wait_in_secs)
return old_wait
Expand All @@ -513,7 +519,7 @@ def set_browser_implicit_wait(self, seconds):

See also `Set Selenium Implicit Wait`.
"""
implicit_wait_in_secs = robot.utils.timestr_to_secs(seconds)
implicit_wait_in_secs = timestr_to_secs(seconds)
self._current_browser().implicitly_wait(implicit_wait_in_secs)

# Private
Expand Down
3 changes: 2 additions & 1 deletion src/Selenium2Library/keywords/_cookie.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from keywordgroup import KeywordGroup
from .keywordgroup import KeywordGroup


class _CookieKeywords(KeywordGroup):

Expand Down
13 changes: 4 additions & 9 deletions src/Selenium2Library/keywords/_element.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,13 @@
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.remote.webelement import WebElement

from Selenium2Library import utils
from Selenium2Library.locators import ElementFinder
from Selenium2Library.locators import CustomLocator
from keywordgroup import KeywordGroup

try:
basestring # attempt to evaluate basestring
def isstr(s):
return isinstance(s, basestring)
except NameError:
def isstr(s):
return isinstance(s, str)
from .keywordgroup import KeywordGroup


class _ElementKeywords(KeywordGroup):

Expand Down Expand Up @@ -684,7 +679,7 @@ def remove_location_strategy(self, strategy_name):

def _element_find(self, locator, first_only, required, tag=None):
browser = self._current_browser()
if isstr(locator):
if isinstance(locator, basestring):
elements = self._element_finder.find(browser, locator, tag)
if required and len(elements) == 0:
raise ValueError("Element locator '" + locator + "' did not match any elements.")
Expand Down
5 changes: 3 additions & 2 deletions src/Selenium2Library/keywords/_formelement.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import os
from keywordgroup import KeywordGroup
from selenium.common.exceptions import WebDriverException

from .keywordgroup import KeywordGroup


class _FormElementKeywords(KeywordGroup):

Expand Down
3 changes: 2 additions & 1 deletion src/Selenium2Library/keywords/_javascript.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os
from keywordgroup import KeywordGroup

from .keywordgroup import KeywordGroup


class _JavaScriptKeywords(KeywordGroup):
Expand Down
8 changes: 4 additions & 4 deletions src/Selenium2Library/keywords/_logging.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import os
import sys

from robot.api import logger
from keywordgroup import KeywordGroup
from robot.libraries.BuiltIn import BuiltIn

try:
from robot.libraries.BuiltIn import RobotNotRunningError
except ImportError:
except ImportError: # Support RF < 2.8.5
RobotNotRunningError = AttributeError

from .keywordgroup import KeywordGroup


class _LoggingKeywords(KeywordGroup):

Expand Down
11 changes: 4 additions & 7 deletions src/Selenium2Library/keywords/_runonfailure.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from robot.libraries import BuiltIn
from keywordgroup import KeywordGroup
from robot.libraries.BuiltIn import BuiltIn

from .keywordgroup import KeywordGroup

BUILTIN = BuiltIn.BuiltIn()

class _RunOnFailureKeywords(KeywordGroup):

Expand Down Expand Up @@ -32,9 +32,6 @@ def register_keyword_to_run_on_failure(self, keyword):
| Register Keyword To Run On Failure | Log Source | # Run `Log Source` on failure. |
| ${previous kw}= | Register Keyword To Run On Failure | Nothing | # Disables run-on-failure functionality and stores the previous kw name in a variable. |
| Register Keyword To Run On Failure | ${previous kw} | # Restore to the previous keyword. |

This run-on-failure functionality only works when running tests on Python/Jython 2.4
or newer and it does not work on IronPython at all.
"""
old_keyword = self._run_on_failure_keyword
old_keyword_text = old_keyword if old_keyword is not None else "No keyword"
Expand All @@ -56,7 +53,7 @@ def _run_on_failure(self):
return
self._running_on_failure_routine = True
try:
BUILTIN.run_keyword(self._run_on_failure_keyword)
BuiltIn().run_keyword(self._run_on_failure_keyword)
except Exception as err:
self._run_on_failure_error(err)
finally:
Expand Down
18 changes: 10 additions & 8 deletions src/Selenium2Library/keywords/_screenshot.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import robot
import os, errno
import errno
import os

from Selenium2Library import utils
from keywordgroup import KeywordGroup
from robot.utils import get_link_path

from Selenium2Library.utils import events

from .keywordgroup import KeywordGroup


class _ScreenshotKeywords(KeywordGroup):
Expand All @@ -28,9 +31,8 @@ def set_screenshot_directory(self, path, persist=False):
if persist is False:
self._screenshot_path_stack.append(self.screenshot_root_directory)
# Restore after current scope ends
utils.events.on('scope_end', 'current',
self._restore_screenshot_directory)

events.on('scope_end', 'current',
self._restore_screenshot_directory)
self.screenshot_root_directory = path

def capture_page_screenshot(self,
Expand Down Expand Up @@ -130,7 +132,7 @@ def _get_screenshot_paths(self, filename):
screenshotdir = self._get_screenshot_directory()
logdir = self._get_log_dir()
path = os.path.join(screenshotdir, filename)
link = robot.utils.get_link_path(path, logdir)
link = get_link_path(path, logdir)
return path, link

def _get_screenshot_index(self, filename):
Expand Down
5 changes: 3 additions & 2 deletions src/Selenium2Library/keywords/_selectelement.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from selenium.webdriver.support.ui import Select
from keywordgroup import KeywordGroup
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import Select

from .keywordgroup import KeywordGroup


class _SelectElementKeywords(KeywordGroup):
Expand Down
6 changes: 3 additions & 3 deletions src/Selenium2Library/keywords/_tableelement.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import os
import sys
from Selenium2Library.locators import TableElementFinder
from keywordgroup import KeywordGroup

from .keywordgroup import KeywordGroup


class _TableElementKeywords(KeywordGroup):

Expand Down
13 changes: 8 additions & 5 deletions src/Selenium2Library/keywords/_waiting.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import time
import robot
from keywordgroup import KeywordGroup

from robot.utils import secs_to_timestr, timestr_to_secs

from .keywordgroup import KeywordGroup


class _WaitingKeywords(KeywordGroup):

Expand Down Expand Up @@ -231,7 +234,7 @@ def wait_func():
self._wait_until_no_error(timeout, wait_func)

def _wait_until_no_error(self, timeout, wait_func, *args):
timeout = robot.utils.timestr_to_secs(timeout) if timeout is not None else self._timeout_in_secs
timeout = timestr_to_secs(timeout) if timeout is not None else self._timeout_in_secs
maxtime = time.time() + timeout
while True:
timeout_error = wait_func(*args)
Expand All @@ -241,5 +244,5 @@ def _wait_until_no_error(self, timeout, wait_func, *args):
time.sleep(0.2)

def _format_timeout(self, timeout):
timeout = robot.utils.timestr_to_secs(timeout) if timeout is not None else self._timeout_in_secs
return robot.utils.secs_to_timestr(timeout)
timeout = timestr_to_secs(timeout) if timeout is not None else self._timeout_in_secs
return secs_to_timestr(timeout)
12 changes: 6 additions & 6 deletions src/Selenium2Library/keywords/keywordgroup.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
import sys
import inspect
try:
from decorator import decorator
except SyntaxError: # decorator module requires Python/Jython 2.4+
decorator = None
if sys.platform == 'cli':
decorator = None # decorator module doesn't work with IronPython 2.6

from decorator import decorator


def _run_on_failure_decorator(method, *args, **kwargs):
self = args[0]
Expand All @@ -25,13 +22,16 @@ def _run_on_failure_decorator(method, *args, **kwargs):
self._already_in_keyword = False
self._has_run_on_failure = False


class KeywordGroupMetaClass(type):

def __new__(cls, clsname, bases, dict):
if decorator:
for name, method in list(dict.items()):
if not name.startswith('_') and inspect.isroutine(method):
dict[name] = decorator(_run_on_failure_decorator, method)
return type.__new__(cls, clsname, bases, dict)


class KeywordGroup(object):
__metaclass__ = KeywordGroupMetaClass
9 changes: 5 additions & 4 deletions src/Selenium2Library/locators/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from elementfinder import ElementFinder
from tableelementfinder import TableElementFinder
from windowmanager import WindowManager
from customlocator import CustomLocator
from .elementfinder import ElementFinder
from .customlocator import CustomLocator
from .tableelementfinder import TableElementFinder
from .windowmanager import WindowManager


__all__ = [
"ElementFinder",
Expand Down
Loading