Skip to content

Commit

Permalink
Docs for addl OR, visual relationships and pos filters
Browse files Browse the repository at this point in the history
  • Loading branch information
rahul-verma committed Dec 8, 2020
1 parent 82e2aaa commit 51ccaf2
Show file tree
Hide file tree
Showing 13 changed files with 983 additions and 381 deletions.
5 changes: 3 additions & 2 deletions CHANGELIST.txt
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ Future Themes (In-Progress or Planned):
1.1.30
------
- Support for OR relationship among different values of same locator type - coded as well as GNS.
- Support for Relative Locators
- Support for Visual Relationships
- Coded - Added at App/Page level.
- GNS Support added - Can provide label from same GNS file.
- Coded - widget call can be used to provide as relationship rather than existing element.
Expand All @@ -60,10 +60,11 @@ Future Themes (In-Progress or Planned):
- Nested element finding falls back to direct finding with WebDriver as JS execution support exists only at driver level in Selenium.
- with.JS and With.Point is supported at element level, however it does not do nested element finding, rather uses driver itself.
- The fallback mechanism for JS, Point and Relative locators has been added so that such locators can be defined without issues in GNS files or coded GuiSections which have root element set for them.
- 'pos' meta key
- 'pos' meta key in widget meta data:
- Supported in coded as well GNS format.
- Supported in nested element finding.
- Value can be an int, a list, an extractor string literal, an extractor specification dict or an extractor object.
- Docs added for additional OR support, Visual Relationships and position filters

1.1.29
------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,15 +71,27 @@ def check_filters_coded_gns_data_structs(request, wordpress):
print("!!!!", inputs.source.content.root)
elems = wordpress.multi_element(tags="input", pos={"random": {'count': "3"}})
print("!!!!", elems.source.content.all)
elems = wordpress.multi_element(tags="input", pos={"random": 3})
print("!!!!", elems.source.content.all)

@test
def check_filters_coded_multielement_pos(request, wordpress):
elems = wordpress.multi_element(tags="*", pos=pos.at(2,4))
print("!!!!", elems.source.content.root)
elems = wordpress.multi_element(tags="*", pos=(2,4))
print("!!!!", elems.source.content.root)
elems = wordpress.multi_element(tags="*", pos=pos.slice(4))
print("!!!!", elems.source.content.root)
elems = wordpress.multi_element(tags="*", pos=pos.slice(stop=4))
print("!!!!", elems.source.content.root)
elems = wordpress.multi_element(tags="*", pos=pos.slice(2,4))
print("!!!!", elems.source.content.root)
elems = wordpress.multi_element(tags="*", pos=pos.slice(start=2, stop=4))
print("!!!!", elems.source.content.root)
elems = wordpress.multi_element(tags="*", pos=pos.slice(2,7,2))
print("!!!!", elems.source.content.root)
elems = wordpress.multi_element(tags="*", pos=pos.slice(start=2, stop=7, step=2))
print("!!!!", elems.source.content.root)
elems = wordpress.multi_element(tags="*", pos=pos.odd())
print("!!!!", elems.source.content.root)
elems = wordpress.multi_element(tags="*", pos=pos.even())
Expand All @@ -98,6 +110,8 @@ def check_filters_coded_multielement_pos(request, wordpress):
# Random with count of matches
elems = wordpress.multi_element(tags="input", pos=pos.random(count=3))
print("!!!!", elems.source.content.all)
elems = wordpress.multi_element(tags="input", pos=pos.random(3))
print("!!!!", elems.source.content.all)

@test
def check_filters_coded_element_nested_pos(request, wordpress):
Expand Down
3 changes: 2 additions & 1 deletion arjuna/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ def launch(self, raw_args):
from arjuna.tpi.constant import *
from arjuna.core.constant import *
from arjuna.tpi.tracker import track
from arjuna.tpi.helper.arjtype import nvpair, nvpairs, withx, Screen, attr, node, Point, Offset, NetworkPacketInfo, oneof, pos
from arjuna.tpi.helper.arjtype import nvpair, nvpairs, withx, Screen, attr, node, Point, Offset, NetworkPacketInfo, oneof
from arjuna.tpi.helper.extract import pos
from arjuna.tpi.helper.audit import HardCoded
from arjuna.tpi.helper.arjtype import ProcessedKeyDict
from arjuna.tpi.helper.datetime import Time, DateTime, DateTimeDelta, DateTimeStepper
Expand Down
25 changes: 8 additions & 17 deletions arjuna/interact/gui/auto/finder/meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,38 +176,29 @@ def __set_relation(self, name, value):
self.__mdict["relations"][name] = value

def __format_pos(self, pos):
from arjuna.tpi.helper.arjtype import pos as pos_factory
from arjuna.tpi.helper.arjtype import Extractor
from arjuna.tpi.helper.extract import pos as pos_factory
from arjuna.tpi.helper.extract import Extractor
if self.__mdict["type"] == GuiWidgetType.RADIO_GROUP:
raise Exception(">>pos<< filter is not supported for Gui Widget Type RADIO_GROUP.")
if type(pos) is str:
fpos = pos.lower().strip()
if fpos in self._POS:
return pos_factory.create_extractor(fpos)
return pos_factory._create_extractor(fpos)
else:
raise Exception("The only string liternals support for defining position are first/last/random")
elif type(pos) is list:
elif type(pos) in {list, tuple}:
return pos_factory.at(*[int(str(i).strip()) for i in pos])
elif type(pos) is dict:
if len(pos) > 1:
raise Exception("Extractor specification dictionary can take only one root key. Found entry: {}".format(pos))
extractor_name = list(pos.keys())[0].lower().strip()
extractor_args = list(pos.values())[0]
if extractor_name == "slice":
extractor_args = {k: k in {"start", "stop", "step"} and int(v) or v for k,v in extractor_args.items()}
start = extractor_args.get("start", None)
stop = extractor_args.get("stop", None)
step = extractor_args.get("step", None)
return pos_factory.slice(start, stop, step)
elif extractor_name == "random":
extractor_args = {k: k in {"count"} and int(v) or v for k,v in extractor_args.items()}
return pos_factory.random(**extractor_args)
if type(extractor_args) is list:
return pos_factory.create_extractor(extractor_name, *extractor_args)
if type(extractor_args) in {list, tuple}:
return pos_factory._create_extractor(extractor_name, *extractor_args)
elif type(extractor_args) is dict:
return pos_factory.create_extractor(extractor_name, **extractor_args)
return pos_factory._create_extractor(extractor_name, **extractor_args)
else:
return pos_factory.create_extractor(extractor_name, extractor_args)
return pos_factory._create_extractor(extractor_name, extractor_args)
elif isinstance(pos, Extractor):
return pos
else:
Expand Down
Loading

0 comments on commit 51ccaf2

Please sign in to comment.