manen 0.3.0.dev2__tar.gz → 0.3.0.dev4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/PKG-INFO +13 -11
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/README.md +12 -10
- manen-0.3.0.dev4/docs/source/changelog.rst +145 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/index.rst +6 -5
- manen-0.3.0.dev4/docs/source/manen/manen.page_object_model.config.rst +8 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/manen/manen.page_object_model.rst +1 -0
- manen-0.3.0.dev4/docs/source/user_guide/page_object_model.ipynb +598 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/manen/__init__.py +1 -1
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/manen/browser.py +2 -3
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/manen/page_object_model/__init__.py +9 -9
- manen-0.3.0.dev2/manen/page_object_model/dom.py → manen-0.3.0.dev4/manen/page_object_model/config.py +5 -14
- manen-0.3.0.dev4/manen/page_object_model/dom.py +14 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/manen/page_object_model/element.py +3 -2
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/manen/page_object_model/webarea.py +1 -1
- manen-0.3.0.dev2/CHANGELOG.md +0 -69
- manen-0.3.0.dev2/docs/source/changelog.rst +0 -108
- manen-0.3.0.dev2/docs/source/user_guide/page_object_model.ipynb +0 -594
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/.github/workflows/build-documentation.yml +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/.github/workflows/deploy-package.yml +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/.github/workflows/test-package.yml +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/.gitignore +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/.rstcheck.cfg +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/LICENSE +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/Makefile +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/assets/screenshot_pypi_home.png +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/assets/screenshot_pypi_search_results.png +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/make.bat +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/_static/favicon.png +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/_static/manen_logo.png +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/_static/manen_logo_xs.png +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/_static/theme_override.css +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/about.rst +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/conf.py +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/contributing.rst +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/installation.rst +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/manen/manen.browser.rst +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/manen/manen.exceptions.rst +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/manen/manen.finder.rst +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/manen/manen.helpers.rst +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/manen/manen.page_object_model.dom.rst +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/manen/manen.page_object_model.element.rst +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/manen/manen.page_object_model.webarea.rst +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/manen/manen.rst +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/user_guide/browser.ipynb +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/user_guide/dom_exploration.ipynb +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/docs/source/user_guide.rst +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/manen/exceptions.py +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/manen/finder.py +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/manen/helpers.py +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/manen/typing.py +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/pyproject.toml +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/requirements-dev.lock +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/requirements.lock +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/tests/__init__.py +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/tests/assets/page.yaml +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/tests/assets/page_test_basic.jinja.html +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/tests/test_finder.py +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/tests/test_helpers.py +0 -0
- {manen-0.3.0.dev2 → manen-0.3.0.dev4}/tests/test_imports.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: manen
|
|
3
|
-
Version: 0.3.0.
|
|
3
|
+
Version: 0.3.0.dev4
|
|
4
4
|
Summary: An implementation of the Page Object Model design pattern, and other utilities for web scraping and automation.
|
|
5
5
|
Project-URL: Changes, https://kodaho.github.io/manen/changelog.html
|
|
6
6
|
Project-URL: Documentation, https://kodaho.github.io/manen/
|
|
@@ -59,7 +59,7 @@ features, you can find:
|
|
|
59
59
|
|
|
60
60
|
- an implementation of the [Page Object Model](https://www.selenium.dev/documentation/en/guidelines_and_recommendations/page_object_models/)
|
|
61
61
|
design pattern
|
|
62
|
-
- a class which improves the operability of a Selenium's
|
|
62
|
+
- a class which improves the operability of a Selenium's WebDriver
|
|
63
63
|
- a function to easily find and isolate DOM elements inside a Selenium page
|
|
64
64
|
|
|
65
65
|
This package aims to provide you the tools to write more concise, flexible and powerful code
|
|
@@ -114,28 +114,30 @@ attributes. Note the whole page object model design pattern is implemented with
|
|
|
114
114
|
like in `Pydantic` model).
|
|
115
115
|
|
|
116
116
|
```python
|
|
117
|
-
from manen.page_object_model.webarea import Page, WebArea
|
|
118
117
|
from manen.page_object_model import dom
|
|
118
|
+
from manen.page_object_model.config import CSS, XPath
|
|
119
|
+
from manen.page_object_model.webarea import Page, WebArea
|
|
120
|
+
|
|
119
121
|
|
|
120
122
|
class HomePage(Page):
|
|
121
|
-
query: Annotated[dom.Input,
|
|
123
|
+
query: Annotated[dom.Input, CSS("input[name='q']")]
|
|
122
124
|
|
|
123
125
|
|
|
124
126
|
class SearchResultPage(Page):
|
|
125
127
|
class Result(WebArea):
|
|
126
|
-
name: Annotated[str,
|
|
127
|
-
version: Annotated[str,
|
|
128
|
-
link: Annotated[dom.HRef,
|
|
129
|
-
description: Annotated[str,
|
|
130
|
-
release_date: Annotated[datetime,
|
|
128
|
+
name: Annotated[str, CSS("h3 span.package-snippet__name")]
|
|
129
|
+
version: Annotated[str, CSS("h3 span.package-snippet__version")]
|
|
130
|
+
link: Annotated[dom.HRef, CSS("a.package-snippet")]
|
|
131
|
+
description: Annotated[str, CSS("p.package-snippet__description")]
|
|
132
|
+
release_date: Annotated[datetime, CSS("span.package-snippet__created")]
|
|
131
133
|
|
|
132
134
|
nb_results: Annotated[
|
|
133
135
|
int,
|
|
134
|
-
|
|
136
|
+
XPath("//*[@id='content']//form/div[1]/div[1]/p/strong"),
|
|
135
137
|
]
|
|
136
138
|
results: Annotated[
|
|
137
139
|
list[Result],
|
|
138
|
-
|
|
140
|
+
CSS("ul[aria-label='Search results'] li"),
|
|
139
141
|
]
|
|
140
142
|
```
|
|
141
143
|
|
|
@@ -34,7 +34,7 @@ features, you can find:
|
|
|
34
34
|
|
|
35
35
|
- an implementation of the [Page Object Model](https://www.selenium.dev/documentation/en/guidelines_and_recommendations/page_object_models/)
|
|
36
36
|
design pattern
|
|
37
|
-
- a class which improves the operability of a Selenium's
|
|
37
|
+
- a class which improves the operability of a Selenium's WebDriver
|
|
38
38
|
- a function to easily find and isolate DOM elements inside a Selenium page
|
|
39
39
|
|
|
40
40
|
This package aims to provide you the tools to write more concise, flexible and powerful code
|
|
@@ -89,28 +89,30 @@ attributes. Note the whole page object model design pattern is implemented with
|
|
|
89
89
|
like in `Pydantic` model).
|
|
90
90
|
|
|
91
91
|
```python
|
|
92
|
-
from manen.page_object_model.webarea import Page, WebArea
|
|
93
92
|
from manen.page_object_model import dom
|
|
93
|
+
from manen.page_object_model.config import CSS, XPath
|
|
94
|
+
from manen.page_object_model.webarea import Page, WebArea
|
|
95
|
+
|
|
94
96
|
|
|
95
97
|
class HomePage(Page):
|
|
96
|
-
query: Annotated[dom.Input,
|
|
98
|
+
query: Annotated[dom.Input, CSS("input[name='q']")]
|
|
97
99
|
|
|
98
100
|
|
|
99
101
|
class SearchResultPage(Page):
|
|
100
102
|
class Result(WebArea):
|
|
101
|
-
name: Annotated[str,
|
|
102
|
-
version: Annotated[str,
|
|
103
|
-
link: Annotated[dom.HRef,
|
|
104
|
-
description: Annotated[str,
|
|
105
|
-
release_date: Annotated[datetime,
|
|
103
|
+
name: Annotated[str, CSS("h3 span.package-snippet__name")]
|
|
104
|
+
version: Annotated[str, CSS("h3 span.package-snippet__version")]
|
|
105
|
+
link: Annotated[dom.HRef, CSS("a.package-snippet")]
|
|
106
|
+
description: Annotated[str, CSS("p.package-snippet__description")]
|
|
107
|
+
release_date: Annotated[datetime, CSS("span.package-snippet__created")]
|
|
106
108
|
|
|
107
109
|
nb_results: Annotated[
|
|
108
110
|
int,
|
|
109
|
-
|
|
111
|
+
XPath("//*[@id='content']//form/div[1]/div[1]/p/strong"),
|
|
110
112
|
]
|
|
111
113
|
results: Annotated[
|
|
112
114
|
list[Result],
|
|
113
|
-
|
|
115
|
+
CSS("ul[aria-label='Search results'] li"),
|
|
114
116
|
]
|
|
115
117
|
```
|
|
116
118
|
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
Changelog
|
|
2
|
+
=========
|
|
3
|
+
|
|
4
|
+
.. |topic| raw:: html
|
|
5
|
+
|
|
6
|
+
<span style="display: inline-block; width: 110px; font-size:85%; font-weight: 600;">Topic</span> <span style="font-size:85%">
|
|
7
|
+
|
|
8
|
+
.. |released_on| raw:: html
|
|
9
|
+
|
|
10
|
+
<span style="display: inline-block; width: 110px; font-size:85%; font-weight: 600;">Release date</span> <span style="font-size:85%">
|
|
11
|
+
|
|
12
|
+
.. |end| raw:: html
|
|
13
|
+
|
|
14
|
+
</span>
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
0.3.0
|
|
18
|
+
-----
|
|
19
|
+
|
|
20
|
+
|topic| Page object model implementation revamp & other major changes |end|
|
|
21
|
+
|
|
22
|
+
|released_on| (unreleased) |end|
|
|
23
|
+
|
|
24
|
+
.. warning::
|
|
25
|
+
|
|
26
|
+
Even if it's a minor release, this version represents a major change for the project; the
|
|
27
|
+
package has been mostly rewritten in order to implement the page object model design pattern in
|
|
28
|
+
a more efficient way (using type annotation).
|
|
29
|
+
|
|
30
|
+
Besides, some functionalities have been removed with the aim of limiting the number of features
|
|
31
|
+
during the beta phase.
|
|
32
|
+
|
|
33
|
+
All previous versions should be considered as deprecated.
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
Changed
|
|
37
|
+
^^^^^^^
|
|
38
|
+
- The module :py:mod:`~manen.page_object_model` has been rewritten to use type annotation instead
|
|
39
|
+
of ``Element``. Note that some elements like select or radio button haven't been implemented in
|
|
40
|
+
this new version yet (but will be in the future).
|
|
41
|
+
- Most of the documentation pages have been rewritten and improved.
|
|
42
|
+
- Most modules have better typing annotations and documentation. Besides, the code has been
|
|
43
|
+
improved to be more "Pythonic".
|
|
44
|
+
- Manen no longer has optional dependencies (which were in fact development dependencies).
|
|
45
|
+
- The minimal version of Python required is now 3.10.
|
|
46
|
+
- Internally, Manen is now using `rye <https://rye.astral.sh/guide/>`_ as project manager, and
|
|
47
|
+
`ruff <https://docs.astral.sh/ruff/>`_ for the linting and formatting.
|
|
48
|
+
|
|
49
|
+
Removed
|
|
50
|
+
^^^^^^^
|
|
51
|
+
- The module ``manen.resource`` and everything related (like the CLI) have been removed. Indeed,
|
|
52
|
+
the `official Selenium manager <https://www.selenium.dev/documentation/selenium_manager/>`_
|
|
53
|
+
(available as a CLI tool and in recent versions of Python bindings for Selenium) provides the
|
|
54
|
+
same functionalities.
|
|
55
|
+
- ``manen.browser.BraveBrowser`` has been removed because it had a dependency on the module
|
|
56
|
+
``manen.resource``. Besides, it was considered as not enough tested internally to make it
|
|
57
|
+
available publicly.
|
|
58
|
+
|
|
59
|
+
|
|
|
60
|
+
|
|
61
|
+
0.2.0
|
|
62
|
+
-----
|
|
63
|
+
|
|
64
|
+
|topic| Rename some classes in :py:mod:`~manen.page_object_model` and improve CLI |end|
|
|
65
|
+
|
|
66
|
+
|released_on| 2022-02-19 |end|
|
|
67
|
+
|
|
68
|
+
Added
|
|
69
|
+
^^^^^
|
|
70
|
+
- Specify link to changelog in documentation in package metadata.
|
|
71
|
+
- Introduce new options in ``manen driver download`` to set the specifications of the drivers
|
|
72
|
+
to be downloaded directly from the command line.
|
|
73
|
+
- Add exhaustibility in documentation of :py:mod:`~manen.page_object_model` to describe
|
|
74
|
+
private/special methods and classes other than the ones in ``__all__``.
|
|
75
|
+
|
|
76
|
+
Changed
|
|
77
|
+
^^^^^^^
|
|
78
|
+
|
|
79
|
+
- Improve CLI command to download drivers executable (now launched with ``manen driver download``).
|
|
80
|
+
- Rename :py:class:`~manen.page_object_model.DateTimeElement` (previously ``DatetimeElement``).
|
|
81
|
+
- Rename :py:class:`~manen.page_object_model.DOMAccessor` (previously ``DomAccessor``).
|
|
82
|
+
|
|
83
|
+
Fixed
|
|
84
|
+
^^^^^
|
|
85
|
+
- Fix link to notebooks in the info section of :ref:`User Guide`
|
|
86
|
+
|
|
87
|
+
|
|
|
88
|
+
|
|
89
|
+
0.1.2
|
|
90
|
+
-----
|
|
91
|
+
|
|
92
|
+
|topic| Fix bug in the download workflow of the CLI |end|
|
|
93
|
+
|
|
94
|
+
|released_on| 2022-02-19 |end|
|
|
95
|
+
|
|
96
|
+
Fixed
|
|
97
|
+
^^^^^
|
|
98
|
+
|
|
99
|
+
- Fix a ``TypeError`` in the download workflow (variable wrongly named).
|
|
100
|
+
|
|
101
|
+
|
|
|
102
|
+
|
|
103
|
+
0.1.1
|
|
104
|
+
-----
|
|
105
|
+
|
|
106
|
+
|topic| Mainly documentation improvements |end|
|
|
107
|
+
|
|
108
|
+
|released_on| 2022-02-12 |end|
|
|
109
|
+
|
|
110
|
+
Changed
|
|
111
|
+
^^^^^^^
|
|
112
|
+
|
|
113
|
+
- Make documentation publicly available under
|
|
114
|
+
`kodaho.github.io/manen <https://kodaho.github.io/manen/>`_.
|
|
115
|
+
- Complete README page.
|
|
116
|
+
- Add the section `About the project` in the documentation (moved from home page).
|
|
117
|
+
- Complete user guides.
|
|
118
|
+
- Rewording and reformatting of several sections.
|
|
119
|
+
|
|
120
|
+
|
|
|
121
|
+
|
|
122
|
+
0.1.0
|
|
123
|
+
-----
|
|
124
|
+
|
|
125
|
+
|topic| First release of the package |end|
|
|
126
|
+
|
|
127
|
+
|released_on| 2022-01-31 |end|
|
|
128
|
+
|
|
129
|
+
Added
|
|
130
|
+
^^^^^
|
|
131
|
+
|
|
132
|
+
- :py:func:`~manen.finder.find` allows to easily get element(s) in a WebDriver
|
|
133
|
+
page. This function support several very different use cases, thanks to several
|
|
134
|
+
arguments that can be passed to the function.
|
|
135
|
+
- :py:mod:`~manen.resource` is a module to easily interact with all the assets
|
|
136
|
+
needed by Selenium. It allows for example to download the drivers, executable
|
|
137
|
+
required to launch a WebDriver.
|
|
138
|
+
- :py:mod:`~manen.browser` defined :py:class:`~manen.browser.ChromeBrowser`
|
|
139
|
+
and :py:class:`~manen.browser.BraveBrowser`, an enhanced Selenium WebDriver.
|
|
140
|
+
- :py:mod:`~manen.page_object_model` is the implementation of `page object
|
|
141
|
+
model <https://www.selenium.dev/documentation/test_practices/encouraged/page_object_models/>`_
|
|
142
|
+
described in Selenium documentation. Thanks to that, you can describe and
|
|
143
|
+
interact with the DOM structure through Python classes.
|
|
144
|
+
- A :py:mod:`~manen.cli` is shipped with the initial release in order to download
|
|
145
|
+
drivers files.
|
|
@@ -28,17 +28,18 @@ with and without Manen:
|
|
|
28
28
|
from selenium.webdriver.chrome.webdriver import WebDriver
|
|
29
29
|
|
|
30
30
|
from manen.page_object_model import dom
|
|
31
|
+
from manen.page_object_model.config import CSS, Default, Wait, XPath
|
|
31
32
|
from manen.page_object_model.webarea import Page, WebArea
|
|
32
33
|
|
|
33
34
|
|
|
34
35
|
class BlogPage(Page):
|
|
35
36
|
class Article(WebArea):
|
|
36
|
-
title: Annotated[str,
|
|
37
|
-
n_likes: Annotated[int,
|
|
38
|
-
tags: Annotated[list[str],
|
|
39
|
-
updated_at: Annotated[datetime,
|
|
37
|
+
title: Annotated[str, XPath("//h1")]
|
|
38
|
+
n_likes: Annotated[int, CSS("span.n_likes")]
|
|
39
|
+
tags: Annotated[list[str], CSS("span.tag"), Default([])]
|
|
40
|
+
updated_at: Annotated[datetime, CSS("span.updated_at")]
|
|
40
41
|
|
|
41
|
-
articles: Annotated[list[Article],
|
|
42
|
+
articles: Annotated[list[Article], CSS('div.article'), Wait(3)]
|
|
42
43
|
|
|
43
44
|
|
|
44
45
|
driver = WebDriver()
|