Skip to content

Commit 6d70305

Browse files
authored
Merge pull request #16 from levi-rs/14-add-find-element
Add initial find_element function
2 parents bea4488 + 781951f commit 6d70305

File tree

10 files changed

+102
-8
lines changed

10 files changed

+102
-8
lines changed

.coveragerc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[run]
2+
omit = explicit/_version.py

.landscape.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
ignore-paths:
2+
- versioneer.py
3+
- explicit/_version.py

explicit/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
from ._version import get_versions
32
__version__ = get_versions()['version']
43
del get_versions

explicit/waiter.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# -*- coding: utf-8 -*-
2+
"""explicit.waiter
3+
4+
A collection of helper functions to make working with Selenium's
5+
explicit wait functionality easier.
6+
7+
"""
8+
9+
from selenium.webdriver.common.by import By
10+
from selenium.webdriver.support.ui import WebDriverWait
11+
from selenium.webdriver.support import expected_conditions as EC
12+
13+
TIMEOUT = 30
14+
""" int: Default timeout value, in seconds"""
15+
16+
CSS = By.CSS_SELECTOR
17+
""" By: Default Selenium search type (CSS Selector)"""
18+
19+
20+
def find_element(driver, elem_path, by=CSS, timeout=TIMEOUT, poll_frequency=0.5):
21+
""" find and return an element once located
22+
23+
find_element locates an element on the page, waiting
24+
for up to timeout seconds. The element, when located,
25+
is returned. If not located, a TimeoutException is raised.
26+
27+
Args:
28+
driver (selenium webdriver or element): A driver or element
29+
elem_path (str): String used to located the element
30+
by (selenium By): Selenium By reference
31+
timeout (int): Selenium Wait timeout, in seconds
32+
poll_frequency (float): Selenium Wait polling frequency, in seconds
33+
34+
Returns:
35+
element: Selenium element
36+
37+
Raises:
38+
TimeoutException: Raised when target element isn't located
39+
"""
40+
wait = WebDriverWait(driver, timeout, poll_frequency)
41+
return wait.until(EC.presence_of_element_located((by, elem_path)))

setup.cfg

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,19 @@ style = pep440
44
versionfile_source = explicit/_version.py
55
versionfile_build = explicit/_version.py
66
tag_prefix =
7+
8+
[flake8]
9+
count = True
10+
statistics = True
11+
max-complexity = 10
12+
max-line-length = 100
13+
output-file = {envdir}/flake8.txt
14+
exclude =
15+
.git,
16+
__pycache__,
17+
docs/source/conf.py,
18+
old,
19+
build,
20+
dist,
21+
versioneer.py,
22+
explicit/_version.py

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
with open(path.join(here, 'README.rst')) as f:
1313
long_description = f.read()
1414

15-
install_requires = ['versioneer', ]
15+
install_requires = ['selenium']
1616

1717
setup(
1818
name='explicit',

tests/conftest.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
try:
2+
import mock
3+
except ImportError:
4+
from unittest import mock
5+
6+
import pytest
7+
from selenium import webdriver
8+
from selenium.webdriver.remote.webelement import WebElement
9+
10+
11+
@pytest.fixture(scope="function")
12+
def driver():
13+
''' Returns a mock selenium driver object
14+
'''
15+
return mock.create_autospec(webdriver.Firefox)
16+
17+
18+
@pytest.fixture(scope="function")
19+
def element():
20+
''' Returns a mock selenium element object
21+
'''
22+
return mock.create_autospec(WebElement)

tests/test_placeholder.py

Lines changed: 0 additions & 2 deletions
This file was deleted.

tests/test_waiter.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from explicit import waiter
2+
3+
4+
def test_find_element(driver, element):
5+
""" Verify the water can find and return an element
6+
"""
7+
driver.find_element.side_effect = [None, element]
8+
9+
elem = waiter.find_element(driver, "div.mock-css-path")
10+
11+
assert driver.find_element.called
12+
assert len(driver.mock_calls) == 2
13+
assert elem is element

tox.ini

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
[tox]
22
skipdist = True
3-
envlist = py{27,33,34,35,py,py3},lint
3+
envlist = py{26,27,33,34,35,py,py3},lint
44
skip_missing_interpreters=True
55

66
[testenv:lint]
77
deps =
88
flake8
99
commands =
10-
flake8 --max-complexity=10 --statistics --count --output-file={envdir}/flake8.txt setup.py explicit tests
10+
flake8 --output-file={envdir}/flake8.txt setup.py explicit tests
1111

1212
[testenv]
1313
deps =
14-
py{27,py,py3}: mock
14+
py{26,27,py,py3}: mock
1515
pytest
1616
pytest-cov
1717
pytest-sugar
1818
commands =
19-
py.test -s --cov explicit --cov-report term-missing --cov-report xml --junitxml={envdir}/{envdir}.junit.xml tests []
19+
py.test -s --cov-config .coveragerc --cov explicit --cov-report term-missing:skip-covered --cov-report xml --junitxml={envdir}/{envdir}.junit.xml tests []

0 commit comments

Comments
 (0)