diff options
Diffstat (limited to 'crocoite/test_behavior.py')
-rw-r--r-- | crocoite/test_behavior.py | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/crocoite/test_behavior.py b/crocoite/test_behavior.py index 03e151c..280b35b 100644 --- a/crocoite/test_behavior.py +++ b/crocoite/test_behavior.py @@ -20,12 +20,14 @@ import asyncio, os, yaml, re from urllib.parse import urlparse +from functools import partial import pytest import pkg_resources -from .browser import Item, SiteLoader, VarChangeEvent -from .logger import Logger, Consumer +from .logger import Logger from .devtools import Process +from .behavior import Scroll, Behavior +from .controller import SinglePageController with pkg_resources.resource_stream (__name__, os.path.join ('data', 'click.yaml')) as fd: sites = list (yaml.load_all (fd)) @@ -35,27 +37,28 @@ for o in sites: for u in s.get ('urls', []): clickParam.append ((u, s['selector'])) -@pytest.mark.parametrize("url,selector", clickParam) -@pytest.mark.asyncio -async def test_click_selectors (url, selector): +class ClickTester (Behavior): """ - Make sure the CSS selector exists on an example url + Test adapter checking a given selector exists after loading the page """ - logger = Logger () - async with Process () as browser, SiteLoader (browser, url, logger) as l: - tab = l.tab - await l.start () - # XXX: not sure why this is needed, must be a bug. - await asyncio.sleep (0.5) - if not l.idle.get (): - await l.idle.wait () + + __slots__ = ('selector', ) + + name = 'testclick' + + def __init__ (self, loader, logger, selector): + super ().__init__ (loader, logger) + self.selector = selector + + async def onfinish (self): + tab = self.loader.tab results = await tab.DOM.getDocument () rootNode = results['root']['nodeId'] - results = await tab.DOM.querySelectorAll (nodeId=rootNode, selector=selector) - assert results['nodeIds'], selector + results = await tab.DOM.querySelectorAll (nodeId=rootNode, selector=self.selector) + assert results['nodeIds'], self.selector # XXX: this is not true for every element we click. Github uses <button - # type=submit> and <form> without an event listener + # type=submit> and <form> without an event listener on the <button> # # verify that an event listener exists # for nid in results['nodeIds']: # obj = (await tab.DOM.resolveNode (nodeId=nid))['object'] @@ -63,6 +66,23 @@ async def test_click_selectors (url, selector): # listeners = (await tab.DOMDebugger.getEventListeners (objectId=obj['objectId']))['listeners'] # assert any (map (lambda x: x['type'] == 'click', listeners)), listeners + return + yield + +@pytest.mark.parametrize("url,selector", clickParam) +@pytest.mark.asyncio +@pytest.mark.xfail(reason='depends on network access') +async def test_click_selectors (url, selector): + """ + Make sure the CSS selector exists on an example url + """ + logger = Logger () + # Some selectors are loaded dynamically and require scrolling + controller = SinglePageController (url=url, logger=logger, + service=Process (), + behavior=[Scroll, partial(ClickTester, selector=selector)]) + await controller.run () + matchParam = [] for o in sites: for s in o['selector']: |