Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs: Tweak examples in docstrings to be valid doctest code and execu… #1306

Merged
merged 1 commit into from
Jun 26, 2024
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
49 changes: 27 additions & 22 deletions splinter/abc/cookie_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,51 +3,57 @@
# license that can be found in the LICENSE file.
from abc import ABC
from abc import abstractmethod
from typing import Dict


class CookieManagerAPI(ABC):
"""Specification for how a Splinter driver handles cookies.

A CookieManager acts like a ``dict``, so you can access the value of a
cookie through the [] operator, passing the cookie identifier:
CookieManager implementations are driver-specific.
They should not be created by the end-user. To access a CookieManager,
drivers should implement a `cookies` attribute containing a CookieManager.

Examples:
CookieManager has behaviour similar to a ``dict``, thus
you should get the value of a cookie using the [] operator:

>>> cookie_manager.add({'name': 'Tony'})
>>> assert cookie_manager['name'] == 'Tony'
Example:

>>> browser.cookies.add({'name': 'Tony'})
>>> assert browser.cookies['name'] == 'Tony'
"""

def __init__(self, driver) -> None:
self.driver = driver

@abstractmethod
def add(self, cookie, **kwargs) -> None:
def add(self, cookie: Dict[str, str], **kwargs) -> None:
"""Add a cookie.

Extra arguments will be used to build the cookie.

Arguments:
cookie (dict): Each key is an identifier for the cookie value.
cookie: A key/value pair containing the cookie's name and value.
kwargs: Driver-specific extra arguments to build the cookie with.

Examples:
Example:

>>> cookie_manager.add({'name': 'Tony'})
>>> browser.cookies.add({'cookie_name': 'cookie_value'}, path='/cookiePath')
>>> browser.cookies.add({'cookie_name': 'cookie_value'}, path='/')
>>> assert browser.cookies['cookie_name'] == 'cookie_value'
"""
raise NotImplementedError

@abstractmethod
def delete(self, *cookies: str) -> None:
"""Delete one or more cookies.

If the cookie does not exist, this function has no effect.

Arguments:
cookies (str): Identifiers for each cookie to delete.

Examples:
Example:

>>> cookie_manager.delete(
'name', 'birthday', 'favorite_color') # deletes these three cookies
>>> cookie_manager.delete('name') # deletes one cookie
>>> browser.cookies.delete('name', 'birthday', 'favorite_color')
>>> browser.cookies.delete('name')
>>> assert 'name' not in browser.cookies.all().keys()
"""
raise NotImplementedError

Expand All @@ -65,23 +71,22 @@ def all(self, verbose: bool = False): # NOQA: A003
drivers, it won't make any difference). In this case, this method
will return a list of dicts, each with one cookie's info.

Examples:
Example:

>>> cookie_manager.add({'name': 'Tony'})
>>> cookie_manager.all()
[{'name': 'Tony'}]
>>> browser.cookies.add({'name': 'Tony'})
>>> result = browser.cookies.all()

Returns:
All the available cookies.
"""
raise NotImplementedError

@abstractmethod
def __contains__(self, key) -> bool:
def __contains__(self, key: str) -> bool:
raise NotImplementedError

@abstractmethod
def __getitem__(self, item):
def __getitem__(self, item: str):
raise NotImplementedError

@abstractmethod
Expand Down
45 changes: 25 additions & 20 deletions splinter/driver/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -364,16 +364,17 @@ def choose(self, name: str, value: str) -> None:
def check(self, name: str) -> None:
"""Check a checkbox by its name.

If you call ``browser.check`` n times, the checkbox keeps checked, it never get unchecked.

To uncheck a checkbox, see the :meth:`uncheck <DriverAPI.uncheck>` method.

Arguments:
name (str): name of the element to check.

Example:

>>> browser.check("agree-with-terms")
>>> browser.check("some-check")

If you call ``browser.check`` n times, the checkbox keeps checked, it never get unchecked.

To uncheck a checkbox, take a look in the :meth:`uncheck <DriverAPI.uncheck>` method.
"""
raise NotImplementedError(
"%s doesn't support checking elements." % self.driver_name,
Expand All @@ -387,7 +388,7 @@ def uncheck(self, name: str) -> None:

Example:

>>> browser.uncheck("send-me-emails")
>>> browser.uncheck("some-check")

If you call ``brower.uncheck`` n times, the checkbox keeps unchecked, it never get checked.

Expand All @@ -408,7 +409,7 @@ def select(self, name: str, value: str) -> None:

Example:

>>> browser.select("state", "NY")
>>> browser.select("pets", "cat")
"""
raise NotImplementedError(
"%s doesn't support selecting options in 'select' element." % self.driver_name,
Expand Down Expand Up @@ -732,15 +733,14 @@ def cookies(self) -> Type[CookieManagerAPI]:


class ElementAPI:
"""
Basic element API class.
"""Basic element API class.

Any element in the page can be represented as an instance of ``ElementAPI``.

Once you have an instance, you can easily access attributes like a ``dict``:

>>> element = browser.find_by_id("link-logo").first
>>> assert element['href'] == 'https://splinter.readthedocs.io'
>>> element = browser.find_by_id("foo").first
>>> assert element['href'] == 'http://localhost:5000/foo'

You can also interact with the instance using the methods and properties listed below.
"""
Expand Down Expand Up @@ -769,20 +769,24 @@ def click(self) -> None:
raise NotImplementedError

def check(self) -> None:
"""
Check the element, if it's "checkable" (e.g.: a checkbox).
"""Check the element, if it's "checkable" (e.g.: a checkbox).

If the element is already checked, this method does nothing. For unchecking
elements, take a loot in the :meth:`uncheck <ElementAPI.uncheck>` method.

Example:
>>> browser.find_by_css("[name='some-check']").uncheck()
"""
raise NotImplementedError

def uncheck(self) -> None:
"""
Uncheck the element, if it's "checkable" (e.g.: a checkbox).
"""Uncheck the element, if it's "checkable" (e.g.: a checkbox).

If the element is already unchecked, this method does nothing. For checking
elements, take a loot in the :meth:`check <ElementAPI.check>` method.

Example:
>>> browser.find_by_css("[name='some-check']").uncheck()
"""
raise NotImplementedError

Expand All @@ -792,10 +796,11 @@ def checked(self) -> bool:

Example:

>>> element.check()
>>> assert element.checked
>>> element.uncheck()
>>> assert not element.checked
>>> elem = browser.find_by_css("[name='some-check']")
>>> elem.check()
>>> assert elem.checked
>>> elem.uncheck()
>>> assert not elem.checked
"""
raise NotImplementedError

Expand Down Expand Up @@ -866,7 +871,7 @@ def type(self, value: str, slowly: bool = False) -> str: # NOQA: A003
Example:

>>> from selenium.webdriver.common.keys import Keys
>>> ElementAPI.type(Keys.RETURN)
>>> browser.find_by_css("[name='q']").type(Keys.RETURN)

"""
raise NotImplementedError
Expand All @@ -877,7 +882,7 @@ def select(self, value: str, slowly: bool = False) -> None:

Example:

>>> element.select("NY")
>>> browser.find_by_css("[name='pets']").select("cat")
"""
raise NotImplementedError

Expand Down
7 changes: 6 additions & 1 deletion splinter/element_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ class ElementList:
access a non-existent item:

>>> element_list = ElementList([])
>>> element_list[0] # raises ElementDoesNotExist
>>> try:
... element_list[0]
... except ElementDoesNotExist:
... pass
"""

def __init__(
Expand Down Expand Up @@ -52,6 +55,7 @@ def first(self):

Example:

>>> element_list = browser.find_by_css('input')
>>> assert element_list[0] == element_list.first
"""
return self[0]
Expand All @@ -62,6 +66,7 @@ def last(self):

Example:

>>> element_list = browser.find_by_css('input')
>>> assert element_list[-1] == element_list.last
"""
return self[-1]
Expand Down
12 changes: 10 additions & 2 deletions splinter/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,12 @@ class DriverNotFoundError(Exception):
Example:

>>> from splinter import Browser
>>> b = Browser('unknown driver') # raises DriverNotFoundError
>>>
>>>
>>> try:
... b = Browser('unknown driver')
... except DriverNotFoundError:
... pass
"""

pass
Expand All @@ -26,7 +31,10 @@ class ElementDoesNotExist(Exception):
Example:

>>> elements = browser.find_by_id('unknown-id') # returns an empty list
>>> elements[0] # raises ElementDoesNotExist
>>> try:
... elements[0]
... except ElementDoesNotExist:
... pass
"""

pass
Loading