• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import { Component, Driver, ON } from '@kit.TestKit';
2import { expect } from '@ohos/hypium';
3import { componentUtils, curves } from '@kit.ArkUI';
4import { MatchPattern, On, Point, Rect } from '@ohos.UiTest';
5
6const driver = Driver.create();
7const TAG = 'Test utils'
8
9export class KeyStruct {
10  public key: string;
11  public type: JsonType;
12
13  constructor(key: string, type: JsonType) {
14    this.key = key;
15    this.type = type;
16  }
17}
18
19export enum JsonType {
20  value,
21  obj,
22  array
23}
24
25export enum ToggleClick {
26  Open,
27  Close,
28}
29
30export enum Slide {
31  start = 1,
32  end = 0,
33}
34
35export enum Direction {
36  width = 0,
37  height = 1
38}
39
40export interface toggleClickTypes {
41  toggleClickType?: ToggleClick
42  toggleClickObj?: string
43}
44
45export interface radioOperateType {
46  radioClickObj: number | string
47  toggleClick?: toggleClickTypes
48  id?: string
49  arr?: Array<KeyStruct>
50  assertEqual?: string | number | boolean | Array<number> | Array<string>
51}
52
53export interface sliderOperateType {
54  slideStar: Slide,
55  slideDragObj?: number
56  toggleClick?: toggleClickTypes
57  id?: string,
58  arr?: Array<KeyStruct>
59  assertEqual?: string | number | boolean
60}
61
62export interface buttonOperateType {
63  buttonClickObj: number,
64  toggleClick?: toggleClickTypes
65  id?: string
66  arr?: Array<KeyStruct>
67  assertEqual?: string | number | boolean
68}
69
70// 通过id验证有没有这个组件 有的话点击一下
71export async function checkButtonAndClickWithID(text: string) {
72  let atom = text;
73  await driver.assertComponentExist(ON.id(atom));
74  let button = await driver.findComponent(ON.id(atom));
75  await button.click();
76  await driver.delayMs(2000);
77  console.info(TAG, atom);
78}
79
80// 获取组件属性具体值
81export function getJson(arr: Array<KeyStruct> | undefined, json: string) {
82  if (!arr) {
83    return undefined
84  }
85  let obj: object = JSON.parse(json);
86  let lastType = JsonType.obj;
87  for (let i = 0; i < arr.length; i++) {
88    const keyStruct: KeyStruct = arr[i];
89    try {
90      if (JsonType.array == lastType) {
91        obj = obj[parseInt(keyStruct.key)];
92      } else {
93        obj = obj[keyStruct.key];
94      }
95    } catch (e) {
96      console.error(e);
97      return undefined;
98    }
99    lastType = keyStruct.type;
100  }
101  return obj;
102
103}
104
105// 根据参数点击RadioBlock项
106export async function radioClick(radioOperate: radioOperateType, blockStr?: string, compText?: string,
107  listText?: string) {
108  await getToggle(ToggleClick.Open, radioOperate.toggleClick?.toggleClickObj)
109  if (radioOperate.radioClickObj != undefined) {
110
111    if (typeof radioOperate.radioClickObj === 'string') {
112      await searchRadio(radioOperate.radioClickObj)
113    } else {
114      let radio: Component[] =
115        await driver.findComponents(ON.type('Radio').within(ON.type('Scroll')).clickable(true))
116      await radio[radioOperate.radioClickObj].click(); // 等待点击操作完成
117      await driver.delayMs(2000);
118    }
119  }
120  if (radioOperate.id) {
121    let idValue = getInspectorByKey(radioOperate.id)
122    console.log(idValue)
123    let result = getJson(radioOperate.arr, idValue)
124    console.log('jj', JSON.stringify(result))
125    expect(JSON.stringify(result)).assertEqual(JSON.stringify(radioOperate.assertEqual));
126    console.log(TAG, result, 'expect', radioOperate.assertEqual)
127  }
128  if (radioOperate.toggleClick != undefined &&
129    radioOperate.toggleClick.toggleClickType == ToggleClick.Close) {
130    if (typeof radioOperate.radioClickObj === 'string' && blockStr && compText && listText) {
131      await searchParentBlock(blockStr, false, compText, listText)
132    } else {
133      await getToggle(radioOperate.toggleClick.toggleClickType, radioOperate.toggleClick.toggleClickObj)
134    }
135  }
136}
137
138
139// 根据参数滑动SliderBlock
140export async function sliderDrag(sliderOperate: sliderOperateType) {
141
142
143  await getToggle(ToggleClick.Open, sliderOperate.toggleClick?.toggleClickObj)
144
145  let slider: Component
146
147  if (sliderOperate.slideDragObj) {
148    let sliders = await driver.findComponents(ON.type('Slider').within(ON.type('Scroll')).scrollable(true))
149    slider = sliders[sliderOperate.slideDragObj]
150  } else {
151    slider = await driver.findComponent(ON.type('Slider').within(ON.type('Scroll')).scrollable(true))
152  }
153
154  let point = await slider.getBoundsCenter();
155  let rect = await slider.getBounds();
156
157  if (sliderOperate.slideStar) {
158    await driver.drag(rect.left, point.y, rect.right, point.y)
159    await driver.delayMs(2000);
160  } else {
161    await driver.drag(rect.right, point.y, rect.left, point.y)
162    await driver.delayMs(2000);
163  }
164
165  if (sliderOperate.id) {
166    let idValue = getInspectorByKey(sliderOperate.id)
167    console.log(TAG, idValue)
168    let result = getJson(sliderOperate.arr, idValue)
169    console.log(TAG, result, 'expect', sliderOperate.assertEqual)
170    expect(result).assertEqual(sliderOperate.assertEqual);
171
172  }
173  if (sliderOperate.toggleClick != undefined &&
174    sliderOperate.toggleClick.toggleClickType == ToggleClick.Close) {
175    await getToggle(sliderOperate.toggleClick.toggleClickType, sliderOperate.toggleClick.toggleClickObj)
176  }
177}
178
179// 根据参数点击ButtonBlock项
180export async function buttonClick(buttonOperate: buttonOperateType) {
181  await getToggle(ToggleClick.Open, buttonOperate.toggleClick?.toggleClickObj)
182  let button: Component[] =
183    await driver.findComponents(ON.type('Button').within(ON.id('scroll')).clickable(true))
184
185  await button[buttonOperate.buttonClickObj].click()
186  await driver.delayMs(2000);
187
188  if (buttonOperate.id) {
189    let idValue = getInspectorByKey(buttonOperate.id)
190
191    let result = getJson(buttonOperate.arr, idValue)
192
193    expect(result).assertEqual(buttonOperate.assertEqual);
194
195
196    console.log(TAG, result, 'expect', buttonOperate.assertEqual)
197  }
198
199  if (buttonOperate.toggleClick != undefined &&
200    buttonOperate.toggleClick.toggleClickType == ToggleClick.Close) {
201    await getToggle(buttonOperate.toggleClick.toggleClickType, buttonOperate.toggleClick.toggleClickObj)
202  }
203
204}
205
206/*滚动*/
207export async function scroll(distance: number) {
208  let scroll: Component = await driver.findComponent(ON.id('scroll'));
209  let scroller: Scroller | undefined = AppStorage.get('scroller');
210  let rect = await scroll.getBounds();
211  let curve = curves.interpolatingSpring(10, 1, 228, 30)
212  if (scroller) {
213    const yOffset: number = scroller.currentOffset().yOffset;
214    scroller.scrollTo({
215      xOffset: 0,
216      yOffset: yOffset + px2vp(distance - rect.top - 5),
217      animation: {
218        duration: 1000, curve: curve
219      }
220    })
221    return true;
222  }
223  return false;
224}
225
226
227//通过id获取组件宽高
228export function getCompSize(id: string, direction: Direction): number {
229  let size = 0
230  if (direction == Direction.width) {
231    size = componentUtils.getRectangleById(id).size.width;
232  }
233  if (direction == Direction.height) {
234    size = componentUtils.getRectangleById(id).size.height;
235  }
236  return size;
237}
238
239//category为参数列表or基本属性,compText为目标文本, listText为可选参数(ListGroup标题)
240export async function Search(category: string, compText: string, listText?: string) {
241  let selection: string | undefined = AppStorage.get('selection')
242  let titleRect: Rect
243  if (category == '参数列表') {
244    let scrolls: Component = await driver.findComponent(ON.id('scroll'));
245    let title: Component = await scrolls.scrollSearch(ON.text(compText));
246    titleRect = await title.getBounds();
247    if (title) {
248      await scroll(titleRect.top)
249    }
250  } else {
251    let textSearch: Component = await driver.findComponent(ON.text('基础属性'))
252    await driver.delayMs(2000)
253    await textSearch.click()
254    let scrolls: Component = await driver.findComponent(ON.id('scroll'));
255    if (listText) {
256      if (selection != listText) {
257        let titles: Component = await scrolls.scrollSearch(ON.text(listText))
258        await titles.click()
259        await scrolls.scrollToTop();
260      }
261      let title: Component = await scrolls.scrollSearch(ON.text(compText))
262      console.log('---1' + title)
263      if (title) {
264        titleRect = await title.getBounds();
265        await scroll(titleRect.top)
266      }
267    } else {
268      let title: Component = await scrolls.scrollSearch(ON.text(compText))
269      titleRect = await title.getBounds();
270      if (title) {
271        await scroll(titleRect.top)
272      }
273    }
274  }
275}
276
277//LastCompText为可选参数,当scroller触底之后LastCompText为你要控制toggle的前面一个toggle文本
278export async function getToggle(isClose: ToggleClick = ToggleClick.Open, lastCompText?: string) {
279  let toggle: Component =
280    await driver.findComponent(lastCompText ?
281    ON.type('Toggle').within(ON.type('Scroll')).isAfter(ON.text(lastCompText)) :
282    ON.type('Toggle').within(ON.type('Scroll')));
283  if (await toggle.isChecked() === (isClose === ToggleClick.Close)) {
284    await toggle.click();
285    await driver.delayMs(2000)
286  }
287}
288
289export async function titleSearch(category: string, compText: string, listText?: string) {
290  let title = await driver.findComponent(ON.text(compText))
291  await driver.delayMs(2000)
292  if (title) {
293    let titleRect = await title.getBounds();
294    await scroll(titleRect.top)
295  } else {
296    await Search(category, compText, listText)
297  }
298}
299
300
301export async function searchRadio(radioName: string) {
302  let isSearch: boolean = true
303  while (isSearch) {
304    let text = await driver.findComponent(ON.text(radioName).within(ON.type('Scroll')))
305    if (text) {
306      let radios: Component[] = await driver.findComponents(ON.type('Radio').within(ON.type('Scroll')).clickable(true))
307      let texts: Component[] = await driver.findComponents(ON.type('Text').within(ON.type('Scroll')))
308      for (let i = 0; i < texts.length; i++) {
309        if (await texts[i].getText() === radioName) {
310          console.log('---radio' + i)
311          await radios[i].click()
312          await driver.delayMs(2000)
313          break
314        }
315      }
316      break
317    } else {
318      scroll(getCompSize('scroll', Direction.height) + 18)
319    }
320  }
321}
322
323// searchStr 搜索关键字   clickBool 想要的状态  category  Search的category
324export async function searchParentBlock(searchStr: string, clickBool: boolean = true, category: string = '基础属性',
325  listText?: string) {
326  if (listText) {
327    await Search(category, searchStr, listText)
328  } else {
329    await Search(category, searchStr)
330  }
331  let toggle: Component =
332    await driver.findComponent(ON.type('Toggle').within(ON.type('Scroll')).isAfter(ON.text(searchStr)))
333  await driver.delayMs(2000)
334  if (await toggle.isChecked() !== clickBool) {
335    await toggle.click();
336  }
337}
338
339export async function searchToggle(toggleName: string, currentText: string, listText?: string, titles?: string) {
340  let selection: string | undefined = AppStorage.get('selection')
341  let textSearch: Component = await driver.findComponent(ON.text(titles ? '参数列表' : '基础属性'))
342  await textSearch.click()
343  if (selection != listText) {
344    console.log('---1')
345    let scrolls: Component = await driver.findComponent(ON.id('scroll'));
346    let title: Component = await scrolls.scrollSearch(ON.text(listText)
347      .isBefore(ON.type('Image'))
348      .within(ON.type('Row'))
349      .within(ON.type('ListItemGroup'))
350      .within(ON.type('List')))
351    await title.click()
352  }
353  let scrolls: Component = await driver.findComponent(ON.id('scroll'));
354  let title: Component = await scrolls.scrollSearch(ON.text(currentText))
355  if (!title) {
356    console.log('---2' + title)
357    let titles: Component = await scrolls.scrollSearch(ON.text(toggleName))
358    if (titles) {
359      console.log('---3' + titles)
360      let toggle: Component =
361        await driver.findComponent(ON.type('Toggle').within(ON.type('Scroll')).isAfter(ON.text(toggleName)))
362      await toggle.click();
363    }
364  }
365}