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 CHANGED
@@ -6,9 +6,9 @@ from pomcorn.web_view import WebView
6
6
 
7
7
  __all__ = (
8
8
  "Component",
9
- "ListComponent",
10
9
  "Element",
11
- "XPathElement",
10
+ "ListComponent",
12
11
  "Page",
13
12
  "WebView",
13
+ "XPathElement",
14
14
  )
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(self, *, locator: locators.XPathLocator) -> XPathElement:
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 - The generic class itself.
221
- item - The type used for parameterization.
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.
@@ -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 # noqa
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
@@ -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. # noqa: D202, E501.
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 other if not self else self
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
- try:
128
- self.wait.until(lambda _: self.check_page_is_loaded())
129
- except TimeoutException:
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 exceptions, locators, waits_conditions
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=float(0),
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
- try:
181
- self.wait.until(expected_conditions.url_contains(url))
182
- except TimeoutException:
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
- try:
197
- self.wait.until(waits_conditions.url_not_matches(url))
198
- except TimeoutException:
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
- try:
218
- self.wait.until(expected_conditions.url_changes(url))
219
- except TimeoutException:
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
- try:
237
- self.wait.until(
238
- expected_conditions.visibility_of_element_located(
239
- locator=(locator.by, locator.query),
240
- ),
241
- )
242
- except TimeoutException:
243
- raise exceptions.ElementIsNotVisibleError(
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
- try:
259
- self.wait.until(
260
- expected_conditions.invisibility_of_element_located(
261
- locator=(locator.by, locator.query),
262
- ),
263
- )
264
- except TimeoutException:
265
- raise exceptions.ElementIsNotInvisibleError(
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
- try:
281
- self.wait.until(
282
- expected_conditions.element_to_be_clickable(
283
- mark=(locator.by, locator.query),
284
- ),
285
- )
286
- except TimeoutException:
287
- raise exceptions.ElementIsNotClickableError(
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
- try:
309
- self.wait.until(
310
- expected_conditions.text_to_be_present_in_element(
311
- locator=(locator.by, locator.query),
312
- text_=text,
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
- locator: Instance of a class to locate the element in the browser
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
- try:
337
- self.wait.until(
338
- waits_conditions.element_not_exists_in_dom(element),
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.4
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
- ![GitHub Workflow Status (with event)](https://img.shields.io/github/actions/workflow/status/saritasa-nest/pomcorn/pre-commit.yml) ![PyPI](https://img.shields.io/pypi/v/pomcorn) ![PyPI - Status](https://img.shields.io/pypi/status/pomcorn) ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pomcorn) ![PyPI - License](https://img.shields.io/pypi/l/pomcorn) ![PyPI - Downloads](https://img.shields.io/pypi/dm/pomcorn) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![Imports: isort](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336)](https://pycqa.github.io/isort/)
30
+ ![GitHub Workflow Status (with event)](https://img.shields.io/github/actions/workflow/status/saritasa-nest/pomcorn/pre-commit.yml) ![PyPI](https://img.shields.io/pypi/v/pomcorn) ![PyPI - Status](https://img.shields.io/pypi/status/pomcorn) ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pomcorn) ![PyPI - License](https://img.shields.io/pypi/l/pomcorn) ![PyPI - Downloads](https://img.shields.io/pypi/dm/pomcorn) [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](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."""
@@ -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,,