Skip to content

Commit 60f8f6c

Browse files
authored
Merge pull request #317 from rustpypeng/main
feat: add new step to verify element value of web
2 parents 1293cfb + 8ff371b commit 60f8f6c

File tree

5 files changed

+261
-14
lines changed

5 files changed

+261
-14
lines changed

flybirds/core/dsl/globalization/i18n.py

+16-1
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,8 @@
216216
"验证服务请求[{service}]与[{target_data_path}]一致",
217217
"验证服务请求[{service}]与json路径[{target_data_path}]一致"],
218218
"compare service request [{service}] with json file "
219-
"[{target_data_path}] with the exceptions removed": ["验证服务请求[{service}]与json路径[{target_data_path}]去除除外项后完全一致"],
219+
"[{target_data_path}] with the exceptions removed": [
220+
"验证服务请求[{service}]与json路径[{target_data_path}]去除除外项后完全一致"],
220221
"compare service request [{service}] with xml file "
221222
"[{target_data_xml_path}]": [
222223
"验证服务请求[{service}]与xml路径[{target_data_xml_path}]一致"],
@@ -251,6 +252,20 @@
251252
"exist page text[{selector}]": ["页面存在文案[{selector}]"],
252253
"the element[{selector}]value is[{param2}]": ["元素[{selector}]的value为[{param2}]"],
253254
"the element[{selector}]value contains[{param2}]": ["元素[{selector}]的value包含[{param2}]"],
255+
"the element[{selector}]value not contains[{param2}]": ["元素[{selector}]的value不包含[{param2}]"],
256+
"witch contain [{param1}] element [{selector}] value is[{param2}]": ["参数含有[{param1}]的元素[{selector}]的文案为[{"
257+
"param2}]"],
258+
"witch contain [{param1}] element [{selector}] value contain [{param2}]": ["参数含有[{param1}]的元素[{"
259+
"selector}]的文案包含[{param2}]"],
260+
"contain [{param}] by [{selector}] exist": ["存在包含参数[{param}]的元素[{selector}]"],
261+
"contain [{param}] by [{selector}] not exist": ["不存在包含参数[{param}]的元素[{selector}]"],
262+
"the [{param}] contained by the element [{selector}] has attribute [{attr_name}] with value [{attr_value}]":
263+
["包含参数[{param}]的元素[{selector}]的属性[{attr_name}]值为[{attr_value}]"],
264+
"the [{param}] contained by the element [{selector}] has attribute [{attr_name}] contain value [{attr_value}]":
265+
["包含参数[{param}]的元素[{selector}]的属性[{attr_name}]值包含[{attr_value}]"],
266+
"the [{param}] contained by the element [{selector}] has attribute [{attr_name}] not contain value [{"
267+
"attr_value}]":
268+
["包含参数[{param}]的元素[{selector}]的属性[{attr_name}]值不包含[{attr_value}]"],
254269
"click[{selector}] and accept dialog": ["点击[{selector}]并接受弹窗"],
255270
"click[{selector}] and cancel dialog": ["点击[{selector}]并取消弹窗"],
256271
},

flybirds/core/dsl/step/element.py

+165-3
Original file line numberDiff line numberDiff line change
@@ -663,13 +663,13 @@ def exist_ele(context, selector=None):
663663
@step("the element[{selector}]value is[{param2}]")
664664
@FlybirdsReportTagInfo(group="element", selectors={
665665
"path": [{"type": "path", "value": "selector", "name": "元素"}]},
666-
verify={"type": ErrorFlag.exist, "value": "param2"},
666+
verify={"type": ErrorFlag.text_equ, "value": "param2"},
667667
verify_function="ele_verify_text_error_parse")
668668
@VerifyStep()
669669
@ele_wrap
670670
def ele_exist_value(context, selector=None, param2=None):
671671
"""
672-
元素[{selector}]的值为[{param2}]
672+
元素[{selector}]的value为[{param2}]
673673
The specified selector element string exists in the page
674674
:param context: step context
675675
:param selector: locator string for selector element (or None).
@@ -688,7 +688,7 @@ def ele_exist_value(context, selector=None, param2=None):
688688
@ele_wrap
689689
def ele_contain_value(context, selector=None, param2=None):
690690
"""
691-
元素[{selector}]的值包含[{param2}]
691+
元素[{selector}]的value包含[{param2}]
692692
The specified selector element string exists in the page
693693
:param context: step context
694694
:param selector: locator string for selector element (or None).
@@ -697,6 +697,168 @@ def ele_contain_value(context, selector=None, param2=None):
697697
g_Context.step.ele_contain_value(context, selector, param2)
698698

699699

700+
@step("the element[{selector}]value not contains[{param2}]")
701+
@FlybirdsReportTagInfo(group="element", selectors={
702+
"path": [{"type": "path", "value": "selector", "name": "元素"}]},
703+
verify={"type": ErrorFlag.text_not_contains, "value": "param2"},
704+
verify_function="ele_verify_text_error_parse")
705+
@VerifyStep()
706+
@ele_wrap
707+
def ele_not_contain_value(context, selector=None, param2=None):
708+
"""
709+
元素[{selector}]的value不包含[{param2}]
710+
The specified selector element string exists in the page
711+
:param context: step context
712+
:param selector: locator string for selector element (or None).
713+
:param param2: element value.
714+
"""
715+
g_Context.step.ele_not_contain_value(context, selector, param2)
716+
717+
718+
@step("witch contain [{param1}] element [{selector}] value is[{param2}]")
719+
@FlybirdsReportTagInfo(group="element", selectors={
720+
"path": [{"type": "text", "value": "param1", "name": "文本"},
721+
{"type": "attr", "value": "param2", "name": "属性"},
722+
{"type": "path", "value": "selector", "name": "元素"}]},
723+
verify={"type": ErrorFlag.text_equ, "value": "param2"},
724+
verify_function="ele_verify_text_error_parse")
725+
@VerifyStep()
726+
@ele_wrap
727+
def ele_contain_param_value(context, param1=None, selector=None, param2=None):
728+
"""
729+
参数含有[{param1}]的元素[{selector}]的文案为[{param2}]
730+
The specified selector element string exists in the page
731+
:param context: step context
732+
:param selector: locator string for selector element (or None).
733+
:param param1: element value.
734+
:param param2: element value.
735+
"""
736+
g_Context.step.ele_contain_param_value(context, param1, selector, param2)
737+
738+
739+
@step("witch contain [{param1}] element [{selector}] value contain [{param2}]")
740+
@FlybirdsReportTagInfo(group="element", selectors={
741+
"path": [{"type": "text", "value": "param1", "name": "文本"},
742+
{"type": "attr", "value": "param2", "name": "属性"},
743+
{"type": "path", "value": "selector", "name": "元素"}]},
744+
verify={"type": ErrorFlag.text_contains, "value": "param2"},
745+
verify_function="ele_verify_text_error_parse")
746+
@VerifyStep()
747+
@ele_wrap
748+
def ele_contain_param_contain_value(context, param1=None, selector=None, param2=None):
749+
"""
750+
参数含有[{param1}]的元素[{selector}]的文案包含[{param2}]
751+
The specified selector element string exists in the page
752+
:param context: step context
753+
:param selector: locator string for selector element (or None).
754+
:param param1: element value.
755+
:param param2: element value.
756+
"""
757+
g_Context.step.ele_contain_param_contain_value(context, param1, selector, param2)
758+
759+
760+
@step("contain [{param}] by [{selector}] exist")
761+
@FlybirdsReportTagInfo(group="element", selectors={
762+
"path": [{"type": "path", "value": "selector", "name": "元素"}]},
763+
verify={"type": ErrorFlag.exist, "value": "param"},
764+
verify_function="ele_verify_text_error_parse")
765+
@VerifyStep()
766+
@ele_wrap
767+
def ele_contain_param_exist(context, param=None, selector=None):
768+
"""
769+
存在包含参数[{param}]的元素[{selector}]
770+
The specified selector element string exists in the page
771+
:param context: step context
772+
:param selector: locator string for selector element (or None).
773+
:param param: element value.
774+
"""
775+
g_Context.step.ele_contain_param_exist(context, param, selector)
776+
777+
778+
@step("contain [{param}] by [{selector}] not exist")
779+
@FlybirdsReportTagInfo(group="element", selectors={
780+
"path": [{"type": "path", "value": "selector", "name": "元素"}]},
781+
verify={"type": ErrorFlag.not_exist, "value": "param"},
782+
verify_function="ele_verify_text_error_parse")
783+
@VerifyStep()
784+
@ele_wrap
785+
def ele_contain_param_not_exist(context, param=None, selector=None):
786+
"""
787+
不存在包含参数[{param}]的元素[{selector}]
788+
The specified selector element string exists in the page
789+
:param context: step context
790+
:param selector: locator string for selector element (or None).
791+
:param param: element value.
792+
"""
793+
g_Context.step.ele_contain_param_not_exist(context, param, selector)
794+
795+
796+
@step("the [{param}] contained by the element [{selector}] has attribute [{attr_name}] with value [{attr_value}]")
797+
@FlybirdsReportTagInfo(group="element", selectors={
798+
"path": [{"type": "text", "value": "param", "name": "文本"},
799+
{"type": "path", "value": "selector", "name": "元素"},
800+
{"type": "attr", "value": "attr_name", "name": "属性"}]},
801+
verify={"type": ErrorFlag.text_equ, "value": "attr_value"},
802+
verify_function="ele_verify_text_error_parse")
803+
@VerifyStep()
804+
@ele_wrap
805+
def ele_contain_param_attr_exist(context, param=None, selector=None, attr_name=None, attr_value=None):
806+
"""
807+
包含参数[{param}]的元素[{selector}]的属性[{attr_name}]值为[{attr_value}]
808+
The specified selector element string exists in the page
809+
:param context: step context
810+
:param param: element value.
811+
:param selector: locator string for selector element (or None).
812+
:param attr_name: attribute name
813+
:param attr_value: attribute value
814+
"""
815+
g_Context.step.ele_contain_param_attr_exist(context, param, selector, attr_name, attr_value)
816+
817+
818+
@step("the [{param}] contained by the element [{selector}] has attribute [{attr_name}] contain value [{attr_value}]")
819+
@FlybirdsReportTagInfo(group="element", selectors={
820+
"path": [{"type": "text", "value": "param", "name": "文本"},
821+
{"type": "path", "value": "selector", "name": "元素"},
822+
{"type": "attr", "value": "attr_name", "name": "属性"}]},
823+
verify={"type": ErrorFlag.text_contains, "value": "attr_value"},
824+
verify_function="ele_verify_text_error_parse")
825+
@VerifyStep()
826+
@ele_wrap
827+
def ele_contain_param_attr_contain(context, param=None, selector=None, attr_name=None, attr_value=None):
828+
"""
829+
包含参数[{param}]的元素[{selector}]的属性[{attr_name}]值包含[{attr_value}]
830+
The specified selector element string exists in the page
831+
:param context: step context
832+
:param param: element value.
833+
:param selector: locator string for selector element (or None).
834+
:param attr_name: attribute name
835+
:param attr_value: attribute value
836+
"""
837+
g_Context.step.ele_contain_param_attr_contain(context, param, selector, attr_name, attr_value)
838+
839+
840+
@step("the [{param}] contained by the element [{selector}] has attribute [{attr_name}] not contain value [{attr_value}]")
841+
@FlybirdsReportTagInfo(group="element", selectors={
842+
"path": [{"type": "text", "value": "param", "name": "文本"},
843+
{"type": "path", "value": "selector", "name": "元素"},
844+
{"type": "attr", "value": "attr_name", "name": "属性"}]},
845+
verify={"type": ErrorFlag.text_not_contains, "value": "attr_value"},
846+
verify_function="ele_verify_text_error_parse")
847+
@VerifyStep()
848+
@ele_wrap
849+
def ele_contain_param_attr_not_contain(context, param=None, selector=None, attr_name=None, attr_value=None):
850+
"""
851+
包含参数[{param}]的元素[{selector}]的属性[{attr_name}]值不包含[{attr_value}]
852+
The specified selector element string exists in the page
853+
:param context: step context
854+
:param param: element value.
855+
:param selector: locator string for selector element (or None).
856+
:param attr_name: attribute name
857+
:param attr_value: attribute value
858+
"""
859+
g_Context.step.ele_contain_param_attr_not_contain(context, param, selector, attr_name, attr_value)
860+
861+
700862
@step("in[{p_selector}]from {param2} find[{c_selector}]element")
701863
@FlybirdsReportTagInfo(group="element", selectors={
702864
"path": [{"type": "path", "value": "p_selector", "name": "元素"},

flybirds/core/plugin/plugins/default/step/swipe.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"""
33
Element swipe
44
"""
5-
from airtest.core.android.touch_methods.base_touch import BaseTouch, DownEvent, SleepEvent, MoveEvent
5+
from airtest.core.android.touch_methods.base_touch import BaseTouch, DownEvent, SleepEvent, MoveEvent, UpEvent
66
from airtest.core.android.touch_methods.touch_proxy import AdbTouchImplementation, MinitouchImplementation
77
from airtest.core.api import text, time
88
from airtest.utils.snippet import (on_method_ready)
@@ -422,6 +422,7 @@ def build_swipe_search_point(direction, screen_size, selector_dict, swipe_pages=
422422
end_point = [start_x * pw, start_y * ph - ph * swipe_pages]
423423
move_distance = ph * swipe_pages
424424
# 设置默认触屏起始坐标
425+
log.info("start_point: %s, end_point: %s, move_distance: %s" % (start_point, end_point, move_distance))
425426
return start_point, end_point, move_distance
426427

427428

flybirds/core/plugin/plugins/default/web/element.py

+14-9
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,10 @@ def get_ele_text(self, param):
112112
if e_text is None or e_text.strip() == '':
113113
e_text = locator.get_attribute('value')
114114
if e_text is None or e_text.strip() == '':
115-
e_text = ""
115+
e_text = locator.evaluate('(element) => { console.log("element.value");return element.value}',
116+
timeout=timeout)
117+
if e_text is None or e_text.strip() == '':
118+
e_text = ""
116119
return e_text
117120

118121
def ele_hover(self, context, param):
@@ -145,6 +148,9 @@ def ele_text_not_include(self, context, param_1, param_2):
145148
e_text = self.get_ele_text(param_1)
146149
verify_helper.text_not_container(param_2, e_text)
147150

151+
# def ele_contain_param_attr_include(self, context, param_1, param_2):
152+
# verify_helper.text_container(param_1, param_2)
153+
148154
def find_text(self, context, param):
149155
# param_temp = handle_str(param)
150156
param_dict = params_to_dic(param)
@@ -209,20 +215,19 @@ def ele_exist_value(self, context, selector, param):
209215
locator, timeout = self.get_ele_locator(selector)
210216
ele_value = locator.evaluate('(element) => { console.log("element.value");return element.value}',
211217
timeout=timeout)
212-
if ele_value is None or param.strip() != ele_value.strip():
213-
message = f"expect the value of [{selector}] element is [{param}] " \
214-
f"but actual is [{ele_value}]"
215-
raise FlybirdVerifyException(message, error_name=ErrorName.ElementFoundError)
218+
verify_helper.text_equal(param, ele_value)
216219

217220
def ele_contain_value(self, context, selector, param):
218221
locator, timeout = self.get_ele_locator(selector)
219222
ele_value = locator.evaluate('(element) => { console.log("element.value");return element.value}',
220223
timeout=timeout)
224+
verify_helper.text_container(param, ele_value)
221225

222-
if ele_value is None or param.strip() not in ele_value.strip():
223-
message = f"expect the value of [{selector}] element is [{param}] " \
224-
f"but actual is [{ele_value}]"
225-
raise FlybirdVerifyException(message, error_name=ErrorName.ElementFoundError)
226+
def ele_not_contain_value(self, context, selector, param):
227+
locator, timeout = self.get_ele_locator(selector)
228+
ele_value = locator.evaluate('(element) => { console.log("element.value");return element.value}',
229+
timeout=timeout)
230+
verify_helper.text_not_container(param, ele_value)
226231

227232
def wait_for_ele(self, context, param):
228233
locator, timeout = self.get_ele_locator(param)

flybirds/core/plugin/plugins/default/web/step.py

+64
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,70 @@ def ele_contain_value(cls, context, selector, param):
212212
ele = gr.get_value("plugin_ele")
213213
ele.ele_contain_value(context, selector, param)
214214

215+
@classmethod
216+
def ele_not_contain_value(cls, context, selector, param):
217+
ele = gr.get_value("plugin_ele")
218+
ele.ele_not_contain_value(context, selector, param)
219+
220+
@classmethod
221+
def ele_contain_param_value(cls, context, param1, selector, param2):
222+
params = param1.split(',')
223+
for param in params:
224+
selector = selector.replace('{}', param, 1)
225+
ele = gr.get_value("plugin_ele")
226+
ele.ele_text_equal(context, selector, param2)
227+
228+
@classmethod
229+
def ele_contain_param_contain_value(cls, context, param1, selector, param2):
230+
params = param1.split(',')
231+
for param in params:
232+
selector = selector.replace('{}', param, 1)
233+
ele = gr.get_value("plugin_ele")
234+
ele.ele_text_include(context, selector, param2)
235+
236+
@classmethod
237+
def ele_contain_param_exist(cls, context, param1, selector):
238+
params = param1.split(',')
239+
for param in params:
240+
selector = selector.replace('{}', param, 1)
241+
ele = gr.get_value("plugin_ele")
242+
ele.ele_exist(context, selector)
243+
244+
@classmethod
245+
def ele_contain_param_not_exist(cls, context, param1, selector):
246+
params = param1.split(',')
247+
for param in params:
248+
selector = selector.replace('{}', param, 1)
249+
ele = gr.get_value("plugin_ele")
250+
ele.ele_not_exist(context, selector)
251+
252+
@classmethod
253+
def ele_contain_param_attr_exist(cls, context, param, selector, attr_name, attr_value):
254+
params = param.split(',')
255+
for param in params:
256+
selector = selector.replace('{}', param, 1)
257+
ele = gr.get_value("plugin_ele")
258+
ele_attr = ele.get_ele_attr(selector, attr_name)
259+
ele.ele_text_equal(context, ele_attr, attr_value)
260+
261+
@classmethod
262+
def ele_contain_param_attr_contain(cls, context, param, selector, attr_name, attr_value):
263+
params = param.split(',')
264+
for param in params:
265+
selector = selector.replace('{}', param, 1)
266+
ele = gr.get_value("plugin_ele")
267+
# ele_attr = ele.get_ele_attr(selector, attr_name)
268+
ele.is_text_attr_container(context, selector, attr_name, attr_value)
269+
270+
@classmethod
271+
def ele_contain_param_attr_not_contain(cls, context, param, selector, attr_name, attr_value):
272+
params = param.split(',')
273+
for param in params:
274+
selector = selector.replace('{}', param, 1)
275+
ele = gr.get_value("plugin_ele")
276+
# ele_attr = ele.get_ele_attr(selector, attr_name)
277+
ele.is_text_attr_not_container(context, selector, attr_name, attr_value)
278+
215279
@classmethod
216280
def wait_ele_exit(cls, context, selector):
217281
ele = gr.get_value("plugin_ele")

0 commit comments

Comments
 (0)