pomcorn 0.8.4__py3-none-any.whl → 0.8.6__py3-none-any.whl
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.
Potentially problematic release.
This version of pomcorn might be problematic. Click here for more details.
- pomcorn/__init__.py +2 -2
- pomcorn/component.py +10 -10
- pomcorn/descriptors/element.py +2 -4
- pomcorn/element.py +1 -1
- pomcorn/locators/__init__.py +4 -4
- pomcorn/locators/base_locators.py +37 -11
- pomcorn/page.py +10 -8
- pomcorn/web_view.py +61 -72
- {pomcorn-0.8.4.dist-info → pomcorn-0.8.6.dist-info}/METADATA +3 -2
- pomcorn-0.8.6.dist-info/RECORD +16 -0
- pomcorn/exceptions.py +0 -38
- pomcorn-0.8.4.dist-info/RECORD +0 -17
- {pomcorn-0.8.4.dist-info → pomcorn-0.8.6.dist-info}/LICENSE +0 -0
- {pomcorn-0.8.4.dist-info → pomcorn-0.8.6.dist-info}/WHEEL +0 -0
pomcorn/__init__.py
CHANGED
pomcorn/component.py
CHANGED
|
@@ -72,16 +72,18 @@ class Component(Generic[TPage], WebView):
|
|
|
72
72
|
self.wait_until_visible()
|
|
73
73
|
|
|
74
74
|
@overload
|
|
75
|
-
def init_element(
|
|
76
|
-
|
|
75
|
+
def init_element(
|
|
76
|
+
self,
|
|
77
|
+
*,
|
|
78
|
+
locator: locators.XPathLocator,
|
|
79
|
+
) -> XPathElement: ...
|
|
77
80
|
|
|
78
81
|
@overload
|
|
79
82
|
def init_element(
|
|
80
83
|
self,
|
|
81
84
|
*,
|
|
82
85
|
relative_locator: locators.XPathLocator,
|
|
83
|
-
) -> XPathElement:
|
|
84
|
-
...
|
|
86
|
+
) -> XPathElement: ...
|
|
85
87
|
|
|
86
88
|
def init_element(
|
|
87
89
|
self,
|
|
@@ -110,16 +112,14 @@ class Component(Generic[TPage], WebView):
|
|
|
110
112
|
self,
|
|
111
113
|
*,
|
|
112
114
|
locator: locators.XPathLocator | None = None,
|
|
113
|
-
) -> list[XPathElement]:
|
|
114
|
-
...
|
|
115
|
+
) -> list[XPathElement]: ...
|
|
115
116
|
|
|
116
117
|
@overload
|
|
117
118
|
def init_elements(
|
|
118
119
|
self,
|
|
119
120
|
*,
|
|
120
121
|
relative_locator: locators.XPathLocator | None = None,
|
|
121
|
-
) -> list[XPathElement]:
|
|
122
|
-
...
|
|
122
|
+
) -> list[XPathElement]: ...
|
|
123
123
|
|
|
124
124
|
def init_elements(
|
|
125
125
|
self,
|
|
@@ -217,8 +217,8 @@ class ListComponent(Generic[ListItemType, TPage], Component[TPage]):
|
|
|
217
217
|
We override this method to store values passed in generic parameters.
|
|
218
218
|
|
|
219
219
|
Args:
|
|
220
|
-
cls
|
|
221
|
-
item
|
|
220
|
+
cls: The generic class itself.
|
|
221
|
+
item: The type used for parameterization.
|
|
222
222
|
|
|
223
223
|
Returns:
|
|
224
224
|
type: A parameterized version of the class with the specified type.
|
pomcorn/descriptors/element.py
CHANGED
|
@@ -27,16 +27,14 @@ class Element:
|
|
|
27
27
|
def __init__(
|
|
28
28
|
self,
|
|
29
29
|
locator: locators.XPathLocator | None = None,
|
|
30
|
-
) -> None:
|
|
31
|
-
...
|
|
30
|
+
) -> None: ...
|
|
32
31
|
|
|
33
32
|
@overload
|
|
34
33
|
def __init__(
|
|
35
34
|
self,
|
|
36
35
|
*,
|
|
37
36
|
relative_locator: locators.XPathLocator | None = None,
|
|
38
|
-
) -> None:
|
|
39
|
-
...
|
|
37
|
+
) -> None: ...
|
|
40
38
|
|
|
41
39
|
def __init__(
|
|
42
40
|
self,
|
pomcorn/element.py
CHANGED
|
@@ -187,7 +187,7 @@ class PomcornElement(Generic[locators.TLocator]):
|
|
|
187
187
|
|
|
188
188
|
Args:
|
|
189
189
|
keys: The names of the keys in the form of a single string.
|
|
190
|
-
More keys: https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.keys.html
|
|
190
|
+
More keys: https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.keys.html
|
|
191
191
|
only_visible: Flag for viewing visible elements. If this is `True`
|
|
192
192
|
(default), then this method will only get visible elements,
|
|
193
193
|
otherwise all the elements (including not visible) will be
|
pomcorn/locators/__init__.py
CHANGED
|
@@ -18,18 +18,18 @@ from pomcorn.locators.xpath_locators import (
|
|
|
18
18
|
)
|
|
19
19
|
|
|
20
20
|
__all__ = (
|
|
21
|
-
"Locator",
|
|
22
|
-
"TInitLocator",
|
|
23
|
-
"TLocator",
|
|
24
|
-
"XPathLocator",
|
|
25
21
|
"ButtonWithTextLocator",
|
|
26
22
|
"ClassLocator",
|
|
27
23
|
"DataTestIdLocator",
|
|
28
24
|
"ElementWithTextLocator",
|
|
29
25
|
"IdLocator",
|
|
30
26
|
"InputByLabelLocator",
|
|
27
|
+
"Locator",
|
|
31
28
|
"NameLocator",
|
|
32
29
|
"PropertyLocator",
|
|
30
|
+
"TInitLocator",
|
|
31
|
+
"TLocator",
|
|
33
32
|
"TagNameLocator",
|
|
34
33
|
"TextAreaByLabelLocator",
|
|
34
|
+
"XPathLocator",
|
|
35
35
|
)
|
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
"""Module with `XPathLocator`.
|
|
2
|
+
|
|
3
|
+
Provide only `XPathLocator` because a locator of this type
|
|
4
|
+
is sufficient for all operations and
|
|
5
|
+
it also allows to combine locators with `/` operator.
|
|
6
|
+
It's better to use one type of locators for consistency.
|
|
7
|
+
|
|
8
|
+
Example:
|
|
9
|
+
# Search button inside base element
|
|
10
|
+
button_element_locator = base_locator / button_locator
|
|
11
|
+
|
|
12
|
+
"""
|
|
13
|
+
|
|
1
14
|
from __future__ import annotations
|
|
2
15
|
|
|
3
16
|
from collections.abc import Iterator
|
|
@@ -5,14 +18,6 @@ from typing import Literal, TypeVar
|
|
|
5
18
|
|
|
6
19
|
from selenium.webdriver.common.by import By
|
|
7
20
|
|
|
8
|
-
# Provide only `XPathLocator` because a locator of this type is sufficient for
|
|
9
|
-
# all operations and it also allows to combine locators with `/` operator.
|
|
10
|
-
# It's better to use one type of locators for consistency.
|
|
11
|
-
#
|
|
12
|
-
# Example:
|
|
13
|
-
# # Search button inside base element
|
|
14
|
-
# button_element_locator = base_locator / button_locator
|
|
15
|
-
|
|
16
21
|
|
|
17
22
|
class Locator:
|
|
18
23
|
"""Base locator for looking for elements in page."""
|
|
@@ -152,13 +157,35 @@ class XPathLocator(Locator):
|
|
|
152
157
|
"""
|
|
153
158
|
return XPathLocator(query=f"({self.query} | {other.query})")
|
|
154
159
|
|
|
160
|
+
def __getitem__(self, index: int) -> XPathLocator:
|
|
161
|
+
"""Allow get related xpath locator by index.
|
|
162
|
+
|
|
163
|
+
Example:
|
|
164
|
+
div_locator = XPathLocator("//div") --> `//div`
|
|
165
|
+
div_locator[0] --> `(//div)[1]` # xpath numeration starts with 1
|
|
166
|
+
div_locator[-1] --> `(//div)[last()]`
|
|
167
|
+
|
|
168
|
+
"""
|
|
169
|
+
query = f"({self.query})"
|
|
170
|
+
|
|
171
|
+
if index >= 0:
|
|
172
|
+
# `+1` is used here because numeration in xpath starts with 1
|
|
173
|
+
query += f"[{index + 1}]"
|
|
174
|
+
elif index == -1:
|
|
175
|
+
# To avoid ugly locators with `...)[last() - 0]`
|
|
176
|
+
query += "[last()]"
|
|
177
|
+
else:
|
|
178
|
+
query += f"[last() - {abs(index + 1)}]"
|
|
179
|
+
|
|
180
|
+
return XPathLocator(query)
|
|
181
|
+
|
|
155
182
|
def __bool__(self) -> bool:
|
|
156
183
|
"""Return whether query of current locator is empty or not."""
|
|
157
184
|
return bool(self.related_query)
|
|
158
185
|
|
|
159
186
|
@classmethod
|
|
160
187
|
def _escape_quotes(cls, text: str) -> str:
|
|
161
|
-
"""Escape single and double quotes in given text for use in locators.
|
|
188
|
+
"""Escape single and double quotes in given text for use in locators.
|
|
162
189
|
|
|
163
190
|
This method is useful when locating elements
|
|
164
191
|
with text containing single or double quotes.
|
|
@@ -174,7 +201,6 @@ class XPathLocator(Locator):
|
|
|
174
201
|
or the original text in double quotes if no escaping is needed.
|
|
175
202
|
|
|
176
203
|
"""
|
|
177
|
-
|
|
178
204
|
if not text or ('"' not in text and "'" not in text):
|
|
179
205
|
return f'"{text}"'
|
|
180
206
|
|
|
@@ -261,4 +287,4 @@ class XPathLocator(Locator):
|
|
|
261
287
|
"not a valid locator.",
|
|
262
288
|
)
|
|
263
289
|
|
|
264
|
-
return
|
|
290
|
+
return self if self else other
|
pomcorn/page.py
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
from typing import Self
|
|
2
2
|
|
|
3
|
-
from selenium.common.exceptions import TimeoutException
|
|
4
3
|
from selenium.webdriver.remote.webdriver import WebDriver
|
|
5
4
|
|
|
6
|
-
from .exceptions import PageDidNotLoadedError
|
|
7
5
|
from .web_view import WebView
|
|
8
6
|
|
|
9
7
|
|
|
@@ -101,6 +99,8 @@ class Page(WebView):
|
|
|
101
99
|
app_root: The URL of page, by default the value of `APP_ROOT`
|
|
102
100
|
attribute is used.
|
|
103
101
|
path: Relative URL.
|
|
102
|
+
**kwargs: Additional arguments passed to the
|
|
103
|
+
page object initialization.
|
|
104
104
|
|
|
105
105
|
"""
|
|
106
106
|
# hack to not specify app_root in each page init method
|
|
@@ -124,14 +124,14 @@ class Page(WebView):
|
|
|
124
124
|
|
|
125
125
|
def wait_until_loaded(self) -> None:
|
|
126
126
|
"""Wait until page is loaded."""
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
raise PageDidNotLoadedError(
|
|
127
|
+
self.wait.until(
|
|
128
|
+
method=lambda _: self.check_page_is_loaded(),
|
|
129
|
+
message=(
|
|
131
130
|
f"Page `{self.__class__}` didn't loaded in "
|
|
132
131
|
f"{self.wait_timeout} seconds! Didn't wait for `True` from "
|
|
133
|
-
"`check_page_is_loaded` method."
|
|
134
|
-
)
|
|
132
|
+
"`check_page_is_loaded` method."
|
|
133
|
+
),
|
|
134
|
+
)
|
|
135
135
|
|
|
136
136
|
def navigate(self, url: str) -> None:
|
|
137
137
|
"""Navigate absolute URL.
|
|
@@ -172,6 +172,8 @@ class Page(WebView):
|
|
|
172
172
|
"""Add relative URL to application root URL.
|
|
173
173
|
|
|
174
174
|
Args:
|
|
175
|
+
app_root: The URL of page, by default the value of `APP_ROOT`
|
|
176
|
+
attribute is used.
|
|
175
177
|
relative_url (str): Relative URL
|
|
176
178
|
|
|
177
179
|
"""
|
pomcorn/web_view.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
from contextlib import contextmanager
|
|
2
2
|
|
|
3
|
-
from selenium.common.exceptions import TimeoutException
|
|
4
3
|
from selenium.webdriver import ActionChains
|
|
5
4
|
from selenium.webdriver.remote.webdriver import WebDriver
|
|
6
5
|
from selenium.webdriver.remote.webelement import WebElement
|
|
@@ -9,7 +8,7 @@ from selenium.webdriver.support.wait import WebDriverWait
|
|
|
9
8
|
|
|
10
9
|
from pomcorn.element import PomcornElement, XPathElement
|
|
11
10
|
|
|
12
|
-
from . import
|
|
11
|
+
from . import locators, waits_conditions
|
|
13
12
|
from .locators.base_locators import TInitLocator
|
|
14
13
|
|
|
15
14
|
|
|
@@ -22,7 +21,7 @@ class WebView:
|
|
|
22
21
|
*,
|
|
23
22
|
app_root: str,
|
|
24
23
|
wait_timeout: int,
|
|
25
|
-
poll_frequency=
|
|
24
|
+
poll_frequency: float = 0,
|
|
26
25
|
):
|
|
27
26
|
"""Initialize webview.
|
|
28
27
|
|
|
@@ -177,13 +176,13 @@ class WebView:
|
|
|
177
176
|
has not ended.
|
|
178
177
|
|
|
179
178
|
"""
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
raise exceptions.UrlDoesContainError(
|
|
179
|
+
self.wait.until(
|
|
180
|
+
method=expected_conditions.url_contains(url),
|
|
181
|
+
message=(
|
|
184
182
|
f"Url doesn't contain `{url}` in {self.wait_timeout} seconds! "
|
|
185
|
-
f"The current URL is `{self.current_url}`."
|
|
186
|
-
)
|
|
183
|
+
f"The current URL is `{self.current_url}`."
|
|
184
|
+
),
|
|
185
|
+
)
|
|
187
186
|
|
|
188
187
|
def wait_until_url_not_contains(self, url: str):
|
|
189
188
|
"""Wait until browser's url doesn't not contains input url.
|
|
@@ -193,13 +192,13 @@ class WebView:
|
|
|
193
192
|
has not ended.
|
|
194
193
|
|
|
195
194
|
"""
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
raise exceptions.UrlDoesContainError(
|
|
195
|
+
self.wait.until(
|
|
196
|
+
method=waits_conditions.url_not_matches(url),
|
|
197
|
+
message=(
|
|
200
198
|
f"Url does contain `{url}` in {self.wait_timeout} seconds! "
|
|
201
|
-
f"The current URL is `{self.current_url}`."
|
|
202
|
-
)
|
|
199
|
+
f"The current URL is `{self.current_url}`."
|
|
200
|
+
),
|
|
201
|
+
)
|
|
203
202
|
|
|
204
203
|
def wait_until_url_changes(self, url: str | None = None):
|
|
205
204
|
"""Wait until url changes.
|
|
@@ -214,13 +213,13 @@ class WebView:
|
|
|
214
213
|
|
|
215
214
|
"""
|
|
216
215
|
url = url or self.current_url
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
raise exceptions.UrlDidNotChangedError(
|
|
216
|
+
self.wait.until(
|
|
217
|
+
method=expected_conditions.url_changes(url),
|
|
218
|
+
message=(
|
|
221
219
|
f"Url didn't changed from {url} in {self.wait_timeout} "
|
|
222
|
-
f"seconds! The current URL is `{self.current_url}`."
|
|
223
|
-
)
|
|
220
|
+
f"seconds! The current URL is `{self.current_url}`."
|
|
221
|
+
),
|
|
222
|
+
)
|
|
224
223
|
|
|
225
224
|
def wait_until_locator_visible(self, locator: locators.Locator):
|
|
226
225
|
"""Wait until element matching locator becomes visible.
|
|
@@ -233,16 +232,14 @@ class WebView:
|
|
|
233
232
|
has not ended.
|
|
234
233
|
|
|
235
234
|
"""
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
f"Unable to locate {locator} in {self.wait_timeout} seconds!",
|
|
245
|
-
)
|
|
235
|
+
self.wait.until(
|
|
236
|
+
method=expected_conditions.visibility_of_element_located(
|
|
237
|
+
locator=(locator.by, locator.query),
|
|
238
|
+
),
|
|
239
|
+
message=(
|
|
240
|
+
f"Unable to locate {locator} in {self.wait_timeout} seconds!"
|
|
241
|
+
),
|
|
242
|
+
)
|
|
246
243
|
|
|
247
244
|
def wait_until_locator_invisible(self, locator: locators.Locator):
|
|
248
245
|
"""Wait until element matching locator becomes invisible.
|
|
@@ -255,16 +252,14 @@ class WebView:
|
|
|
255
252
|
has not ended.
|
|
256
253
|
|
|
257
254
|
"""
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
f"{locator} is still visible in {self.wait_timeout} seconds!",
|
|
267
|
-
)
|
|
255
|
+
self.wait.until(
|
|
256
|
+
method=expected_conditions.invisibility_of_element_located(
|
|
257
|
+
locator=(locator.by, locator.query),
|
|
258
|
+
),
|
|
259
|
+
message=(
|
|
260
|
+
f"{locator} is still visible in {self.wait_timeout} seconds!"
|
|
261
|
+
),
|
|
262
|
+
)
|
|
268
263
|
|
|
269
264
|
def wait_until_clickable(self, locator: locators.Locator):
|
|
270
265
|
"""Wait until element matching locator becomes clickable.
|
|
@@ -277,17 +272,14 @@ class WebView:
|
|
|
277
272
|
has not ended.
|
|
278
273
|
|
|
279
274
|
"""
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
f"{locator} isn't clickable after {self.wait_timeout} "
|
|
289
|
-
"seconds!",
|
|
290
|
-
)
|
|
275
|
+
self.wait.until(
|
|
276
|
+
method=expected_conditions.element_to_be_clickable(
|
|
277
|
+
mark=(locator.by, locator.query),
|
|
278
|
+
),
|
|
279
|
+
message=(
|
|
280
|
+
f"{locator} isn't clickable after {self.wait_timeout} seconds!"
|
|
281
|
+
),
|
|
282
|
+
)
|
|
291
283
|
|
|
292
284
|
def wait_until_text_is_in_element(
|
|
293
285
|
self,
|
|
@@ -305,18 +297,16 @@ class WebView:
|
|
|
305
297
|
has not ended.
|
|
306
298
|
|
|
307
299
|
"""
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
)
|
|
315
|
-
except TimeoutException:
|
|
316
|
-
raise exceptions.TextIsNotInElementError(
|
|
300
|
+
self.wait.until(
|
|
301
|
+
method=expected_conditions.text_to_be_present_in_element(
|
|
302
|
+
locator=(locator.by, locator.query),
|
|
303
|
+
text_=text,
|
|
304
|
+
),
|
|
305
|
+
message=(
|
|
317
306
|
f"{locator} doesn't have `{text}` after {self.wait_timeout} "
|
|
318
|
-
"seconds!"
|
|
319
|
-
)
|
|
307
|
+
"seconds!"
|
|
308
|
+
),
|
|
309
|
+
)
|
|
320
310
|
|
|
321
311
|
def wait_until_not_exists_in_dom(
|
|
322
312
|
self,
|
|
@@ -325,7 +315,7 @@ class WebView:
|
|
|
325
315
|
"""Wait until element ceases to exist in DOM.
|
|
326
316
|
|
|
327
317
|
Args:
|
|
328
|
-
|
|
318
|
+
element: Instance of a class to locate the element in the browser
|
|
329
319
|
or instance of element.
|
|
330
320
|
|
|
331
321
|
Raises:
|
|
@@ -333,15 +323,13 @@ class WebView:
|
|
|
333
323
|
has not ended.
|
|
334
324
|
|
|
335
325
|
"""
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
)
|
|
340
|
-
except TimeoutException:
|
|
341
|
-
raise exceptions.TextIsNotInElementError(
|
|
326
|
+
self.wait.until(
|
|
327
|
+
method=waits_conditions.element_not_exists_in_dom(element),
|
|
328
|
+
message=(
|
|
342
329
|
f"{element} is still exists in DOM after {self.wait_timeout} "
|
|
343
|
-
"seconds!"
|
|
344
|
-
)
|
|
330
|
+
"seconds!"
|
|
331
|
+
),
|
|
332
|
+
)
|
|
345
333
|
|
|
346
334
|
def drag_and_drop(self, source: WebElement, target: WebElement):
|
|
347
335
|
"""Perform drag and drop.
|
|
@@ -396,6 +384,7 @@ class WebView:
|
|
|
396
384
|
|
|
397
385
|
Args:
|
|
398
386
|
script: JavaScript code as a string object.
|
|
387
|
+
*args: Any applicable arguments for your JavaScript.
|
|
399
388
|
|
|
400
389
|
"""
|
|
401
390
|
self.webdriver.execute_script(script, *args)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pomcorn
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.6
|
|
4
4
|
Summary: Base implementation of Page Object Model
|
|
5
5
|
Home-page: https://pypi.org/project/pomcorn/
|
|
6
6
|
License: MIT
|
|
@@ -27,7 +27,8 @@ Description-Content-Type: text/markdown
|
|
|
27
27
|
|
|
28
28
|
# Pomcorn
|
|
29
29
|
|
|
30
|
-
      [      [](https://github.com/astral-sh/ruff)
|
|
31
|
+
|
|
31
32
|
|
|
32
33
|
**Pomcorn**, or **Page Object Model corn**, is a Python package that contains base classes to create systems based on [Selenium](https://github.com/SeleniumHQ/selenium#selenium) framework and **Page Object Model** pattern. You can read more about this pattern [here](https://www.selenium.dev/documentation/test_practices/encouraged/page_object_models/). The package can be used to create autotesting systems, parsing scripts and anything that requires
|
|
33
34
|
interaction with the browser.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
pomcorn/__init__.py,sha256=gB9I-SXauMrhxQlvZmFgh_htHqUXjII6tvQmtJEU5Ks,318
|
|
2
|
+
pomcorn/component.py,sha256=t1GARAI0cW5ubfv1hurxpD_2KFyFxvfzxVADtwcRhiE,12161
|
|
3
|
+
pomcorn/descriptors/__init__.py,sha256=5q_d5GtcaFlIIyHdsUnE9UNbz3g40qJCHKNaWGvcC6s,72
|
|
4
|
+
pomcorn/descriptors/element.py,sha256=jSYxEUqKdAIEHf_zL9m6udyO4QDR22Ivm37BOa-tdKc,4486
|
|
5
|
+
pomcorn/element.py,sha256=l8haq8F25CZSIBTFST5bCwNWq9eg0rbjeKjvEiwG3VI,12205
|
|
6
|
+
pomcorn/locators/__init__.py,sha256=rDc7DlK9XIXlSCrZt4kZK3VapNE2ggDM1mGk-TGW5_k,708
|
|
7
|
+
pomcorn/locators/base_locators.py,sha256=J9zrmuYxns5Kj54IvWmEYqY8YoRaeBFYYrz0r5ahkFg,9159
|
|
8
|
+
pomcorn/locators/xpath_locators.py,sha256=zcGNIk5HX36TTauCApgX0csdobWj8QFZ_td4-9qkTgU,7461
|
|
9
|
+
pomcorn/page.py,sha256=AJLXffI6GFP6XN3vhoGGrUknzvJZzP6GBP7BLaGumX0,5824
|
|
10
|
+
pomcorn/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
|
+
pomcorn/waits_conditions.py,sha256=E8sLfBvIV2EO91Mm5KyKXB5IGEB9gUWza3XPE4_aCQE,3528
|
|
12
|
+
pomcorn/web_view.py,sha256=qt3Gpr9BMtV0tLp5sLlleSEqweh2PphHXlT02awf9SE,13585
|
|
13
|
+
pomcorn-0.8.6.dist-info/LICENSE,sha256=1vmhQNp1dDH8ksJ199LuG4oKz5D4ZvNccPcFckiG2S4,1091
|
|
14
|
+
pomcorn-0.8.6.dist-info/METADATA,sha256=_ptVy6j9atm0jUz6jD0EIPbXg3hmwZhCy44vxYEjTIQ,5880
|
|
15
|
+
pomcorn-0.8.6.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
16
|
+
pomcorn-0.8.6.dist-info/RECORD,,
|
pomcorn/exceptions.py
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
class ElementIsNotClickableError(TimeoutError):
|
|
2
|
-
"""Raised when element is not clickable when it should be."""
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class UrlDoesNotContainError(TimeoutError):
|
|
6
|
-
"""Raised when url does not contain needed substring when it should."""
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class UrlDoesContainError(TimeoutError):
|
|
10
|
-
"""Raised when url does contain needed substring when it shouldn't."""
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class UrlDidNotChangedError(TimeoutError):
|
|
14
|
-
"""Raised when url didn't changed when it should."""
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class ElementIsNotVisibleError(TimeoutError):
|
|
18
|
-
"""Raised when element is not visible when it should be."""
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class ElementIsNotInvisibleError(TimeoutError):
|
|
22
|
-
"""Raised when element is not invisible when it should be."""
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class TextIsNotInElementError(TimeoutError):
|
|
26
|
-
"""Raised when element doesn't have required when it should have."""
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class AttributeDoesNotContainError(TimeoutError):
|
|
30
|
-
"""Raised when attribute doesn't contain needed value when it should."""
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class FailedFormSubmissionError(Exception):
|
|
34
|
-
"""Raised when there an error on form submission."""
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
class PageDidNotLoadedError(Exception):
|
|
38
|
-
"""Raised when page load timeout has expired."""
|
pomcorn-0.8.4.dist-info/RECORD
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
pomcorn/__init__.py,sha256=V8v_V3wgKbao1KAQkcVTMnpGwyslw0nHfuTp-DwWTXg,318
|
|
2
|
-
pomcorn/component.py,sha256=XdG6OJ_4dKXsDh4E_TJhbmcL3iXFOI8lvopCVjWpwXM,12164
|
|
3
|
-
pomcorn/descriptors/__init__.py,sha256=5q_d5GtcaFlIIyHdsUnE9UNbz3g40qJCHKNaWGvcC6s,72
|
|
4
|
-
pomcorn/descriptors/element.py,sha256=4g_4ay5f00AXzCT4xHN1i7mTrlsECoUHh1Ph_TFPBDs,4502
|
|
5
|
-
pomcorn/element.py,sha256=6VLLSPlc7961qa4rRXdno7cEAAeY8GEP2d4wtM5R9a0,12216
|
|
6
|
-
pomcorn/exceptions.py,sha256=8ZOmrybDwvEVZRLQzyozjRNhJvSLbablaFwGFUVMhrU,1131
|
|
7
|
-
pomcorn/locators/__init__.py,sha256=hNSlfmz3y-LI4PXF5VIwX8J5WSalyE2wmzuYc6kNxMA,708
|
|
8
|
-
pomcorn/locators/base_locators.py,sha256=nokiwxnIQh90bolOJcFJSQjuaX_0a4iB5aPhp_Vrbr8,8439
|
|
9
|
-
pomcorn/locators/xpath_locators.py,sha256=zcGNIk5HX36TTauCApgX0csdobWj8QFZ_td4-9qkTgU,7461
|
|
10
|
-
pomcorn/page.py,sha256=wuLoGUn1n0e7wSXLGYyUVnoPlz_gMfT8Jtg6yA09IeY,5755
|
|
11
|
-
pomcorn/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
-
pomcorn/waits_conditions.py,sha256=E8sLfBvIV2EO91Mm5KyKXB5IGEB9gUWza3XPE4_aCQE,3528
|
|
13
|
-
pomcorn/web_view.py,sha256=PlwEVgdOwFZXJY2WuUT2C2wyK1xOBJne5-A_FOuwsQI,14209
|
|
14
|
-
pomcorn-0.8.4.dist-info/LICENSE,sha256=1vmhQNp1dDH8ksJ199LuG4oKz5D4ZvNccPcFckiG2S4,1091
|
|
15
|
-
pomcorn-0.8.4.dist-info/METADATA,sha256=jPDp_4lyHdfibn0IqP1DNHb0ZP5QhG55dkA8aEWDZoE,5973
|
|
16
|
-
pomcorn-0.8.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
17
|
-
pomcorn-0.8.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|